Treemap插入与HashMap插入的复杂性

时间:2013-12-10 06:26:45

标签: java algorithm time-complexity

我对这两种算法的时间复杂性感到困惑。

//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)。

4 个答案:

答案 0 :(得分:17)

与HashMap的复杂性

对于HashMap,后备存储是一个数组。当您尝试插入十个元素时,您将获得哈希值,从该哈希值计算特定的数组索引,并且由于它是后面的数组,因此您将注入O(1)。

  • 对于第一个元素,插入时间= O(1)
  • 对于第二个元素,插入时间= O(1)
  • 对于n th 元素,插入时间= O(1)

因此,在HashMap中插入n个元素的总时间= n * O(1)= O(n)

与TreeMap的复杂性

在这种情况下,后备存储是一个树。对于具有总 k 元素的树,平均而言,查找位置的时间为O(Log k)。

  • 插入第一个元素的时间= O(1)
  • 插入第二个元素的时间= O(Log 1)= 0 = O(1)
  • 插入第三个元素的时间= O(Log 2)
  • 插入n th 元素的时间= O(Log(n-1))

总时间=日志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是数组的大小,NTreeMap.的大小。如果不是这意味着,问题不明确。

答案 2 :(得分:4)

插入时间复杂度通常基于每个实例定义。

平均案例:

  • HashMap O(1)
  • TreeMap O(log n ) - 因为底层结构是红黑树

最差案例:

  • Hashmap O( n ) - 在散列冲突的情况下
  • TreeMap O(log n

在您上面的代码中,因为您要插入多个项目,我们需要区分地图中的元素数量( 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),因此我相信更多的重复键,更好的插入时间。