map/set :: 插入是否提供了正确的迭代器提示,它的复杂性是多少?
What's the complexity of map/set :: insert if one has provided a correct iterator hint?
是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),并且不依赖于任何内容。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- map/set :: 插入是否提供了正确的迭代器提示,它的复杂性是多少?