map/set :: 插入是否提供了正确的迭代器提示,它的复杂性是多少?

What's the complexity of map/set :: insert if one has provided a correct iterator hint?

本文关键字:提示 迭代器 多少 复杂性 插入 set 是否 map      更新时间:2023-10-16

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

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

  • 找到合适的地方 - O(logN)
  • 做实际插入 - ?
  • 如有必要,重新平衡树 - ?

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

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

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

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

第一个标准从未确切说明它使用哪种数据结构来实现 set。只是对它们进行操作的复杂性帮助我们转向某种自平衡的二叉搜索树。

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