【发布时间】:2018-08-15 13:23:40
【问题描述】:
C++17 引入了一个 std::map::merge 函数,用于将一个 std::map 合并到另一个中。
由于std::map 是一个有序的关联容器,更明确地说是一个自平衡二叉搜索树(最常实现为红黑树或AVL 树),我希望@987654325 @ 利用了 std::maps 的元素都已经排序的事实,因此不需要搜索每个元素的插入位置,即时间复杂度应该线性摊销 O(N)。
有趣的是,cppreference saysstd::map::merge 的计算时间复杂度是对数O(N*log(N)):
复杂度 N*log(size()+N)),其中N是source.size()
对吗?
在这种情况下std::map::merge 似乎等同于std::map::insert(iterator begin, iterator end),使得std::map::merge 完全多余。
std::map::merge 的时间复杂度的真相是什么?
【问题讨论】:
-
该方法是作为批量拼接的包装器引入的,而不是利用两个容器的排序特性。它没有假设比较器彼此同步。
-
@AnT 是的,但它可以很容易地通过承诺比较器是同步的,例如使用标签调度来解决。
-
也许有一个专门针对两个地图使用相同比较器的情况,但这不会改变通常复杂性更差的事实
-
@user463035818 比较器通常被认为是有状态的对象。相同类型的两个比较器不必产生相同的顺序。
-
@AnT 是的,没有考虑到这一点。可以想象,有状态的比较器很难确保严格的弱排序
标签: c++ binary-search-tree std c++17 stdmap