Java 树映射插入与哈希映射插入的复杂性

Java 树映射插入与哈希映射插入的复杂性,java,algorithm,time-complexity,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

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

//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);
    }
}
//时间复杂度O(nlog(n))
使用TreeMap()的公共无效{
Map Map=newtreemap();
对于(int i=0;i<10;i++){
地图。放置(i,i);
}
}
//时间复杂度O(n)
使用HashMap()的公共void{
Map Map=newhashmap();
对于(int i=0;i<10;i++){
地图。放置(i,i);
}
}
usingTreeMap算法的时间复杂度正确吗?我知道在treemap中插入时间是log(n),但是如果我们迭代10个元素的数组,它会变成nlog(n)

usingTreeMap算法的时间复杂度是否正确

Javadoc中正确指定了基本
TreeMap
操作的时间复杂性

我知道在树映射中,插入时间是log(n)

但是如果我们迭代10个元素的数组,它会变成nlog(n)

如果这意味着插入这10个元素,则时间复杂度为
M*log(N)
,其中
M
是数组的大小,
N
树状图的大小。
如果这不意味着,则问题不清楚。

可能不是。(即,当10个元素中有4个元素具有相同的键时,N将是7),因此我认为重复键越多,插入的时间就越好

HashMap的复杂性 对于HashMap,备份存储是一个数组。当您尝试插入十个元素时,您会得到散列,根据该散列计算特定的数组索引,因为它是后面的一个数组,所以您会插入O(1)

  • 对于第一个元素,插入所需的时间=O(1)
  • 对于第二个元素,插入所需的时间=O(1)
  • 对于第n个元素,插入所需的时间=O(1)
因此,在HashMap中插入n个元素的总时间=n*O(1)=O(n)


带树映射的复杂性 在这种情况下,备份存储是一棵树。对于总共有k个元素的树,平均而言,找到位置的时间是O(logk)

  • 插入第一个元素的时间=O(1)
  • 插入第二个元素的时间=O(日志1)=0=O(1)
  • 插入第三个元素的时间=O(日志2)
  • 插入第n个元素的时间=O(对数(n-1))

总时间=日志1+日志2+日志3+…+日志(n-1)


现在,log1插入时间复杂度通常是基于每个实例定义的

平均值情况:

  • hashmapo(1)
  • 树映射O(logn)——因为底层结构是一棵红黑树
最坏情况:

  • Hashmap O(n)——在哈希冲突的情况下
  • 树状图O(logn)
在上面的代码中,由于要插入多个项目,我们需要区分映射中有多少元素(n)和映射中添加了多少元素(m)。如果映射最初为空,则上面的运行时是正确的。如果它们已经有一些元素,那么运行时将是:

                                Avg      Worst
Insert m elements into HashMap: O(m)     O(mn)
Inset m elements into TreeMap:  O(mlogn) O(mlogn)

始终表示每个元素的插入时间。当然,如果您插入
n
元素,则将该值乘以
n
。HashMap的平均值为O(1)。如果您碰巧有很多冲突或必须增加表,插入可以是O(n)。但是m和n不是一样吗???@luckying_noobster否。答案中清楚地说明了
m
n
的内容。@luckying_noobster
TreeMap
的大小不是固定的。当我们插入元素时,大小会增加,如1,2,3。。。在这种情况下为10。日志1+日志2+日志3+…+Log(n-1)=Log((n-1)*(n-2)*…1)=Log((n-1)!)=~Log((n-1)^n-1)=(n-1)Log(n-1)=~nLog(n)@Aspirant9:是的。。有很多方法可以得出相同的答案。:-)