我写了一种方法来查找列表中的重复项。它工作正常,但我担心使用containsKey的复杂性。当我们使用containsKey时,我们必须为每个键计算一个哈希函数,然后将其与我们的搜索项进行比较,对吗?那么复杂度不是O(n)吗?

这是函数:

public void findDup(List<String> list){

    HashMap<String,Integer> map = new HashMap<>();
    int pos=0;
    for(String s: list){
        if(map.containsKey(s)){
            Log.v("myapp","duplicate found:"+s);
        }
        else
            map.put(s,pos);
        pos++;
    }
}

并称之为我这样做:
List<String>list=new ArrayList<>();

    for(int i=0;i<12;i++)
        list.add(i+"");

    //these numbers should surely be duplicates
    list.add("3");list.add("6");

    findDup(list);

//输出将清楚地是3和6。

更新:我改写了功能,只使用一个更有意义的集合:
public void findDup(List<Integer> list){

        HashSet<Integer> set = new HashSet<>();
        for(Integer num: list){
            if(!set.add(num)){
                Log.v("myapp","duplicate found:"+num);
            }

        }
    }

最佳答案

在Javadoc中将其指定为O(1)。

因此,算法的复杂度为O(N)。

但是,即使没有containsKey()调用,这实际上也是不必要的。您要做的只是测试put()是否返回非空值,该值表示重复。

当我们使用containsKey时,我们必须为每个键计算一个哈希函数,然后将其与我们的搜索项进行比较,对吗?

错误。我们计算搜索键的哈希值,并检查该存储桶是否被相等的键占用。

那么复杂度不是O(n)吗?

没有。

09-26 19:52
查看更多