我对这两种算法的时间复杂性感到困惑。
//time complexity O(nlog(n))
public void usingTreeMap(){
Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
for (int i = 0; i < 10; i++) {
map.put(i, i);
}
}
//time complexity O(n)
public void usingHashMap(){
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < 10; i++) {
map.put(i, i);
}
}
usingTreeMap算法的时间复杂度是否正确。我在树形图中知道插入时间是log(n)但是如果我们迭代10个元素的数组,它会变成nlog(n)。
答案 0 :(得分:17)
对于HashMap,后备存储是一个数组。当您尝试插入十个元素时,您将获得哈希值,从该哈希值计算特定的数组索引,并且由于它是后面的数组,因此您将注入O(1)。
因此,在HashMap中插入n个元素的总时间= n * O(1)= O(n)
在这种情况下,后备存储是一个树。对于具有总 k 元素的树,平均而言,查找位置的时间为O(Log k)。
总时间=日志1 +日志2 +日志3 + ... +日志(n-1)
现在,Log 1&lt; = Log n,Log 2&lt; = Log n ... Log(n-1)&lt; = Log n,导致我们得到n-1个值,每个值小于或等于记录n。
这意味着在树形图中插入的时间总和为&lt; =(n-1)* Log(n-1),导致O(n Log(n))的复杂性。
由于Log a + Log b = Log(ab),TreeMap的插入时间总和为一个鲜为人知的运行时间值O(Log(n!))。
此外,O(Log(n!)) is bound by O(n Log(n))。
因此,在TreeMap中插入n个元素的时间复杂度松散地写为O(n Log(N))。
答案 1 :(得分:5)
usingTreeMap算法的时间复杂度是否正确。
在Javadoc中正确指定了基本TreeMap
操作的时间复杂性。
我知道在树形图中插入时间是log(n)
正确。
但如果我们迭代10个元素的数组,它就变成了nlog(n)。
如果这意味着插入这10个元素,则时间复杂度为M*log(N)
,其中M
是数组的大小,N
是TreeMap.
的大小。如果不是这意味着,问题不明确。
答案 2 :(得分:4)
插入时间复杂度通常基于每个实例定义。
平均案例:
最差案例:
在您上面的代码中,因为您要插入多个项目,我们需要区分地图中的元素数量( n )与地图中添加的元素数量(米)。如果地图最初为空,那么上面的运行时是正确的。如果他们已经有一些元素,那么运行时将是:
Avg Worst
Insert m elements into HashMap: O(m) O(mn)
Inset m elements into TreeMap: O(mlogn) O(mlogn)
答案 3 :(得分:0)
可能不是。 (即,当10个中的4个元素具有相同的键时,则N将为7),因此我相信更多的重复键,更好的插入时间。