我正在比较2个HashMaps,我试图找出比较循环的时间复杂度。 代码如下:
//map1 is a HashMap and contains m elements and keys
//map2 is a HashMap and contains n elements and keys
List<myObject> myList = new ArrayList<myObject>()
for (String key: map1.keySet()){
if(!map2.containsKey(key)){
myList.add(map.get(key));
}
}
第一个for循环将是 O(m)。我在其他论坛上发现containsKey()需要 lg(n)时间。有人可以确认一下吗?我在JavaDocs中找不到它。
如果是这样,那么总时间复杂度将是 O(mlg {n})。
此外,任何关于如何以更好的方式进行这种比较的想法都会有所帮助。
答案 0 :(得分:3)
取决于您的哈希码算法和冲突。
使用完美的哈希码,理论上映射查找是O(1),常数时间,如果有冲突,则可能是O(n)。 所以在你的情况下,如果你有好的哈希算法,那就是O(m)。
如果你看一下wiki,你可以对这个概念有更多的了解。您还可以查看地图源代码。
答案 1 :(得分:1)
Java HashMap实现应该不断地将内部数据结构的大小调整为大于地图中元素的数量一定量并且散列算法是好的,所以我认为碰撞是最小的并且你会更接近到O(1)比O(n)。
你使用的是什么HashMap? Java附带的那个?你自己的?
答案 2 :(得分:1)
你对外循环的时间复杂性是正确的: O(n)。 HashMap.containsKey()
的渐近复杂性是 O(1),除非你在myObject.hashCode()
的实现中做了一些荒谬的事情。所以你的方法应该在 O(n)时间运行。优化将确保您循环遍历两个较小的地图。
请注意TreeMap.containsKey()
有 O(log n)复杂性,而不是HashMap
...停止查看这些论坛:)