- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个应用程序 (C++),我认为 STL priority_queue
可以很好地提供服务。 The documentation说:
Priority_queue is a container adaptor, meaning that it is implemented on top of some underlying container type. By default that underlying type is vector, but a different type may be selected explicitly.
和
Priority queues are a standard concept, and can be implemented in many different ways; this implementation uses heaps.
我之前假设 top()
是O(1)
,而push()
将是 O(logn)
(我首先选择 priority_queue
的两个原因) - 但文档既不确认也不否认这一假设。
深入挖掘,序列概念的文档说:
The complexities of single-element insert and erase are sequence dependent.
priority_queue
使用 vector
(默认)作为堆,其中:
... supports random access to elements, constant time insertion and removal of elements at the end, and linear time insertion and removal of elements at the beginning or in the middle.
我推断,使用默认的 priority_queue
,top()
是 O(1)
和 push()
是 O(n)
。
问题 1:这是正确的吗? (top()
访问是 O(1)
并且 push()
是 O(n)
?)
问题 2: 如果我使用 set,我能否在
(或push()
上实现 O(logn)
效率multiset
)而不是vector
来实现priority_queue
?这样做会有什么后果?其他操作会因此受到影响?
注:我担心的是时间效率,而不是空间。
最佳答案
优先级队列适配器使用标准库堆算法来构建和访问队列 - 您应该在文档中查找这些算法的复杂性。
top() 操作显然是 O(1) 但大概你想在调用它之后 pop() 堆(根据 Josuttis )是 O(2*log(N)) 并且 push() 是O(log(N)) - 相同的来源。
并且来自 C++ 标准,25.6.3.1,push_heap:
Complexity: At most log(last - first) comparisons.
和pop_heap:
Complexity: At most 2 * log(last - first) comparisons.
关于c++ - STL priority_queue 的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2974470/
我尝试使用 constructor 为 priority_queue 分配内存,但出现以下错误: No matching constructor for initialization of 'prio
#include #include #include #include struct Temp { int p; std::string str; }; struct Te
这个问题在这里已经有了答案: Boost heap Setting user defined compare function (1 个回答) 关闭 8 年前。 我正在尝试为自定义 Edge 类设置
我是 C++ 的初学者。我正在尝试使用 std::priority_queue 创建最大堆和最小堆。只创建一个 maxheap 可以正常工作,但不能同时创建两者。我似乎无法理解错误。我收到以下错误:无
如何清除使用用户定义比较的priority_queue? 来自 std::priority_queue documentation ,我将 priority_queue 的使用减少到我需要的情况(=
如何清除使用用户定义比较的priority_queue? 来自 std::priority_queue documentation ,我将 priority_queue 的使用减少到我需要的情况(=
我有一个类Node除了存储数据外,它还有一个指向其父节点的指针 Node .我将一些节点存储在 priority_queue 中并覆盖 queue; 问题是,父指针似乎搞砸了。我的猜测是,当我弹出
我想创建一个名为 Edge 的对象,它从其构造函数将自身插入到 priority_queue 中。也就是; Class Edge { int m_from; int m_to; in
代码如下: 比较算法 class PathComp{ public: virtual bool betterThan(const PathInfo& path1, const PathInfo& pa
我有 priority_queue。我的函数 delete 在内存消耗和时间方面不是很合理。我见过类似的主题,但它们对我没有帮助。 How to remove element not at top f
我有这样的代码 priority_queue, decltype(&VD::CompareByDistance)> pqDistances(&VD::CompareByDistance); 在哪里 c
我正在研究最小堆的解决方案,除了自定义比较器之外,它还需要支持删除任何元素。完全自定义的堆实现是一种方法。但我想依靠 C++ STL 来进行所需的操作。 C++ 文档和 StackOverflow 答
我有一个 Dijkstra使用 priority_queue 的类具有自定义比较功能。我将队列命名为 DijkstraPriorityQueue用using陈述。在类构造函数中,我初始化了队列。为此,
我正在为这个问题编写代码。当我遇到问题时,整数流的中位数。请注意,此问题不是算法问题,而是 priority_queue 大小的模糊行为。 #include using namespace std;
int main() { list letters; priority_queue, less>letters_trans; cout input(cin), input_e
我的文件顶部有这些: #include typedef struct cell_s { unsigned int x; unsigned int y; unsigned in
你好,我需要创建一个类,其中包含一个 priority_queue 字段,其比较函数需要访问类中的另一个字段。简而言之,我需要写这样的东西: class A { B foo; prio
当我尝试使用 priority_queue 作为类成员时,我卡住了。请查看下面的代码,让我知道为什么 L1 看不到 Type 但 L2 可以看到。我尝试了 struct,也尝试了 ctor。 如果这是
我有一个服务器应用程序,它接受传入的查询并执行它们。如果查询太多,则应将它们排队,如果执行了其他一些查询,则也应执行排队的查询。由于我想传递具有不同优先级的查询,我认为使用 priority_queu
考虑一个 std::priority_queue,其中 N 元素具有相同的优先级。现在考虑具有任意优先级的元素的一些 pop() 和 push(),因此生成的队列由所有这些 N 元素组成上面提到的加上
我是一名优秀的程序员,十分优秀!