为什么 std::priority_queue::emplace 是对数的?

时间:2021-03-12 15:23:40

标签: c++ language-lawyer heap priority-queue

https://en.cppreference.com/w/cpp/container/priority_queue/emplace 上,它显示:

<块引用>

比较的对数数加上 Container::emplace_back 的复杂性。

但是从 Argument for O(1) average-case complexity of heap insertionHeap vs Binary Search Tree (BST) 和其他资源来看,插入堆的平均复杂度是恒定的,最坏情况是对数复杂度。在 cppreference 上,它通常显示给定函数的平均情况复杂度和最坏情况复杂度。在这个特定的 cppreference 链接中,它没有区分这是平均情况还是最坏情况复杂性,但我认为它可能指的是“平均”情况复杂性,因为通常这是人们谈论复杂性时所呈现的。如果是这样的话,这个函数的STL实现是怎么平均对数的?

2 个答案:

答案 0 :(得分:2)

cppreference 是一个用户策划的 wiki。它可能缺少文档或完全错误(这种情况不时发生)。不过,通常任何不一致都是因为他们试图让普通开发人员可以理解。标准总是说了算(尽管有时也会有歧义和矛盾)。

也就是说,根据 [structure.specifications]

,以下是标准对列出的时间复杂性的规定 <块引用>

库子句中指定的复杂性要求是上限,并且实现提供 更好的复杂度保证满足要​​求。

总是给出最坏情况的时间复杂度,标准会指出平均或摊销复杂度更好的地方,例如在unordered associative containers中对emplace的描述中:

<块引用>

平均情况 O(1),最差 情况 O(a_eq. 大小()).

答案 1 :(得分:0)

当标准指定复杂性时,除非另有说明,否则它是最坏的情况,并且通常不是 big-O,而是指定操作的精确限制。

例如last - first

的“最多 std::find_if 个谓词应用”
相关问题