当前位置: 首页 > 知识库问答 >
问题:

Treemap插入与HashMap插入的复杂性

子车轶
2023-03-14

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

//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算法的时间复杂度正确吗?我知道在treemap中插入时间是log(n ),但是如果我们遍历一个包含10个元素的数组,它会变成nlog(n)吗?

共有3个答案

万志专
2023-03-14

使用TreeMap算法的时间复杂度是否正确。

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

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

正确。

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

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

叶允晨
2023-03-14

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

平均案例:

  • 哈希映射 O(1)
  • TreeMap O(logn) -- 因为底层结构是一棵红黑相间的树

最坏的情况:

  • 哈希映射 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)
祁鸿晖
2023-03-14

在HashMap的情况下,后备存储是一个数组。当你尝试插入十个元素时,你会得到散列,从散列中计算出特定的数组索引,因为它是后面的一个数组,所以你会注入O(1)。

  • 对于第一个元素,插入所需的时间=O(1)
  • 对于第二个元素,插入所需的时间=O(1)
  • 对于nth元素,插入所需的时间=O(1)

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

在本例中,后备存储是树。对于总共有 k 个元素的树,平均而言,查找位置的时间是 O(Log k)。

    < li >插入第一个元素的时间= O(1) < li >插入第二个元素的时间= O(Log 1) = 0 = O(1) < li >插入第三个元素的时间= O(Log 2) <李>。 <李>。 < li >插入第n个元素的时间= O(Log (n-1))

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

现在,日志1

这意味着插入树图的时间总和为一个值

日志的属性之一是日志a、日志b=Log(ab)。使用该函数,树映射情况下的插入时间总和为鲜为人知的运行时间值O(Log(n!))。但是,因为,O(Log(n!))在树映射中插入n个元素的时间复杂度松散地写为O(n Log(n))。

 类似资料:
  • 我的意图是创建4个Emp对象。2个对象(e1和e2)具有相同的哈希代码。因此,当插入e1(插入在e2之后)时,hashmap会意识到具有相同哈希值的对象已经存在(对象e2)。然后它会将槽中所有对象的键与相同的哈希值进行比较。如果它找到一个具有匹配键的对象(通过调用下面Emp类的equals方法),它将用新值替换旧值。 下面请看一下测试代码: 我期望的输出:替换的记录名称:Terry,年龄:60名称

  • 我主要是想理解在堆中插入一个新元素的大O和Omega背后的原因。我知道我可以在网上找到答案,但我真的喜欢有一个彻底的理解,而不是仅仅在网上找到答案,只是一味地记忆。 例如,如果我们有以下堆(以数组格式表示) 如果我们决定插入一个新元素“4”,那么我们的数组现在将如下所示 它将被放置在索引9中,由于这是第0个基于索引的数组,它的父数组将是索引4,也就是元素5。在这种情况下,我们不需要做任何事情,因为

  • 问题内容: 我当前正在从文本文件中读取200万行,如上一个问题中所述 。Java读取200万行文本文件的最快方法 现在,我将这些信息存储到HashMap中,并希望通过TreeMap对其进行排序,因为我想使用ceilingkey。以下方法正确吗? 问题答案: HashMap hashMap = new HashMap (); TreeMap treeMap = new TreeMap (); tre

  • 问题内容: 我有以下情况: 在我的Query.xml中,我以这种方式编写了插入内容: 阅读mybatis结果地图指南后,我尝试在mybatis-config.xml文件中添加以下行: 但我一直收到以下错误: 谁能告诉我该如何设置? 问题答案: 中的属性需要引用结果映射的名称,而不是Java类型: 但是,如果作为单独的表存储在数据库中,则不支持嵌套插入。您将需要在Java中调用两个插入。Result

  • 我对在LinkedList开头插入元素的时间复杂性感到好奇。我知道LinkedList本身会将现有元素向右移动一个索引,但要做到这一点,它会进行与列表中现有元素一样多的迭代吗? 另外,最好的方式是在开头插入offerFirst吗?

  • 问题内容: 我们习惯说运算是O(1)。但是,这取决于哈希实现。默认对象哈希实际上是JVM堆中的内部地址。我们确定声称 O(1)是否足够好? 可用内存是另一个问题。据我从javadocs理解,应该是0.75。如果我们在JVM中没有足够的内存并且超出限制怎么办? 因此,似乎无法保证O(1)。是有意义还是我想念什么? 问题答案: 这取决于很多事情。这通常是 O(1),一个体面的哈希它本身是固定的时间…但