hashmap containsKey复杂性

时间:2016-01-31 03:25:07

标签: java hashmap time-complexity

我有一个方法,我写了一个列表中的重复项。它工作正常,但我担心使用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);
            }

        }
    }

4 个答案:

答案 0 :(得分:6)

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

您的算法的复杂性因此 O(N)。

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

  

当我们使用containsKey时,我们必须为每个键计算一个哈希函数,然后与每个键进行比较,对吧?

错误。我们计算搜索关键字的哈希值,并检查该桶是否被等号密钥占用。

  

那么复杂性是不是O(n)?

没有

答案 1 :(得分:3)

  

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

是的,整个列表的复杂性将是O(n)。但是,您无需使用HashMap<K,V>,因为HashSet<Key>足以查找重复项:

Set<String> seen = new HashSet<>();
for(String s: list){
    if(!seen.add(s)){
        Log.v("myapp","duplicate found: "+s);
    }
}

答案 2 :(得分:3)

答案在the documentation中指定。

  

此实现为基本操作提供恒定时间性能   (获取和放置),假设散列函数在&gt;桶之间正确地分散元素。

由于containsKey()只是一个抛出检索值的get(),它是O(1)(假设哈希函数正常工作)。

FYI containsValue是O(n),因为没有键它不知道它在哪里,算法必须遍历存储在地图中的所有值。

答案 3 :(得分:1)

  

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

错误。

当散列函数给出一个值时,该值用于直接索引到表中。没有进一步的比较,除非发生碰撞,在这种情况下它可能会或可能不会比较,具体取决于所使用的碰撞解决方法。

由于您只是检查重复项,因此哈希集是一种更好的数据结构,可以使用