将排序范围插入关联容器的复杂性
Complexity of inserting sorted range into associative container
该标准规定(23.4.4.2:5等),如果范围已经排序,则从范围[first, last)
构造所有四个有序关联容器(map
,multimap
,set
,multiset
N = last - first
线性。然而,为了将范围(例如相同类型的容器)合并到现有容器中,23.2.4:8表102仅规定insert
将[i, j)
的范围合并到容器中应具有复杂性N log(a.size() + N)
N = distance(i, j)
。 这似乎表明使用提示插入:
for (auto it = a.begin(); i != j; ++i)
it = next(a.insert(it, *i));
可能比a.insert(i, j)
更有效,复杂度严格小于N log(a.size() + N)
,这取决于正确的提示的比例(除了在琐碎的情况下N == 0
);并且是线性的,因为每个提示都是正确的,如果a
最初是空的。
这是标准的缺陷,还是有其他语言(或工具)涵盖这种情况? 在实践中,实现是否针对将有序关联容器合并到另一个容器进行了优化?
感谢 https://stackoverflow.com/a/11362162/567292 启发了这个问题。
在后一种情况下,我假设标准仅指定关联容器合并的最坏情况保证运行时性能,如果可能的话,则由实现来寻找更快的性能快捷方式。 请记住,与其他语言不同,C++规范正是规范。 没有"参考"实现。 因此,可以编写仅满足某些性能标准的实现,也可以决定实现超出指定性能标准的功能。 最后,尽管该规范旨在以某些算法的实现方式为您提供"最低"的性能保证。
话虽如此,如果您始终对每个元素使用提示,那么您最坏情况的性能实际上最终会比您简单地插入而不提示慢两倍。 因此,总是使用暗示不一定是灵丹妙药。
相关文章:
- 具有未知值时的时间复杂性
- 关联容器的下界复杂性:成员函数与非成员函数
- 使用堆查找第K个最大元素的时间复杂性
- std::future_error:无关联状态
- 并行标准::复制复杂性
- 特定算法的复杂性与 3 for?
- 查找自动生成键并具有线性内存消耗的小型关联数组
- C++ 字符串类擦除成员函数的时空复杂性
- 如何在 OpenCV 中将图像与另一个图像相关联
- 删除提升存档对象也会删除与其关联的流?
- 变量如何以及在何处可能没有C++关联的名称?
- 将正态随机变量与任意 RHO(corrcoef) 相关联
- 试图(稍微)概括C++模板.关联容器键:值反转
- 递归函数 c++ 的复杂性
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- 这个递归函数有什么作用?运行时的复杂性是多少?
- C++ - 对象填充的复杂性
- 提高从排序字符串中获取字母顺序的顺序复杂性
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 将排序范围插入关联容器的复杂性