具有自定义比较器和 O(n) 时间的 priority_queue c++

Posted

技术标签:

【中文标题】具有自定义比较器和 O(n) 时间的 priority_queue c++【英文标题】:priority_queue c++ with custom comparator and O(n) time 【发布时间】:2021-06-16 20:48:03 【问题描述】:

我正在搜索,但没有找到使用自定义比较器创建 priority_queue 的简单方法,但这也需要线性时间来创建 priority_queue 中的元素。

可以使用以下方法在线性时间内创建一个priority_queue:

vector<int> arr = 1,2,3,4;
priority_queue<int> pq(arr.begin(),arr.end());

并且可以使用自定义比较器创建一个priority_queue

auto cmp = [](int p1, int p2)return p1<p2;
priority_queue<int,vector<int>,decltype(cmp)> pq(cmp);

我想知道是否可以这样做:

priority_queue<int,vector<int>,decltype(cmp)> pq(cmp,points.begin(),points.end());

因为如果我使用自定义比较器创建 priority_queue 并使用 push 插入值后,时间复杂度将为 O (nlg (n))

【问题讨论】:

我不明白这个问题。您可以在此处查看可用构造函数的列表:en.cppreference.com/w/cpp/container/priority_queue/…,没有一个比线性更糟糕 你是什么意思“如果可能的话”?您在尝试时遇到任何问题吗? 可以使用自定义比较器创建一个priority_queue,也可以在线性时间内将元素插入到priority_queue中,但是我搜索了很多,我没有找到使用a的方法自定义比较器,并在线性时间内创建优先级队列 您发布的使用元素和自定义比较器调用构造函数的代码有什么问题?它不会编译吗? 我认为您正在上面的链接中寻找 (13)。您只是将参数按错误的顺序排列。你用的是什么参考?不可能记住所有这些细节,猜测也不行。 【参考方案1】:

假设points 是一个包含std::vector&lt;int&gt;s 的容器,您可以这样定义优先级队列:

std::priority_queue<std::vector<int>,
                    std::vector<std::vector<int>>,
                    decltype(cmp)> pq(points.begin(), points.end(), cmp);

Demo

【讨论】:

你应该可以在不指定模板的情况下直接调用std::priority_queue pq(points.begin(), points.end(), cmp) `@Ranoiaetep 是的,绝对是。这也有效。

以上是关于具有自定义比较器和 O(n) 时间的 priority_queue c++的主要内容,如果未能解决你的问题,请参考以下文章

Java 自定义双向链表

具有自定义比较器的最小优先级队列

具有自定义比较谓词的 heapq

javascript中是不是有indexOf来搜索具有自定义比较功能的数组

使用 SSDT 进行自定义表比较和部署

找到具有 O(1) 空间和 O(n) 时间的重复数字