【问题标题】:What's the complexity of map/set :: insert if one has provided a correct iterator hint?如果提供了正确的迭代器提示,map/set :: insert 的复杂性是多少?
【发布时间】:2015-02-10 02:01:12
【问题描述】:

O(1) 还是 O(logN) 但系数较小?

如果未指定,我至少想知道答案是基于一个合理的假设,即地图/集合是使用红黑或 AVL 树实现的。我认为插入元素的一般算法类似于:

  • 找到正确的地方 - O(logN)
  • 实际插入 - ?
  • 必要时重新平衡树 - ?

现在如果我们提供正确的迭代器提示,那么第一步就变成了O(1)。其他步骤也是O(1)还是O(logN)

【问题讨论】:

标签: c++ data-structures set binary-search-tree tree-balancing


【解决方案1】:

标准没有说明如何实现容器,所以 你不能指望RB或AVL树。在实践中......复杂性 约束是这样的,我不知道任何其他实现 这将符合该法案。但正是在复杂性的限制下 你会找到答案:“一般是对数,但摊销 如果 t 在 p 之前插入,则为常数。”所以如果提示是 正确,实现必须使得插入是 O(1)。

【讨论】:

【解决方案2】:
  • 找到正确的地方 - O(logN)
  • 进行实际插入 - O(1),无论是 AVL 还是 RB 树
  • 如有必要,重新平衡树 - 我不知道 AVL 树的确切 BIG-O 表示法,但对于 RB 树,它是 O(1)

使用迭代器提示,步骤#2(插入)和步骤#3(重新平衡)不受影响。通过提供迭代器,您只是自己执行步骤#1(“找到正确的位置”),一般复杂度是相同的。

【讨论】:

  • “RB 树的操作复杂度为 O(1)。” -- ?
  • 你从哪里得到这种复杂性?
  • @n.m.我从here 得到它。
  • 来自您的链接:“(尽管它可能需要检查 O(log n) 个节点来决定在哪里需要旋转)。”
  • @n.m.欢迎回答
【解决方案3】:

第一个标准从未明确说明它使用什么样的数据结构来实现集合。只是对它们的操作的复杂性有助于我们直接找到某种自平衡的二叉搜索树。

是的,如果您通过放置正确的迭代器来提供正确的插入提示,那么所有步骤都将作为步骤 2 和 3 摊销 O(1),并且不依赖于任何东西。

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 2015-10-04
    • 1970-01-01
    • 2021-06-07
    • 2012-09-28
    相关资源
    最近更新 更多