- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我现在正在尝试解决一个问题,该问题需要我在 2
维矩阵中找到前 k
个频繁出现的数字。
我定义了一个结构numCount
,它有两个字段:number
用于存储数字,count
用于存储它出现的次数。然后我访问矩阵中的每个数字,如果它的 numCount
结构已经存在于最大堆中(按 count
排序),我就增加它的 count
由1
;否则我会创建一个新的 numCount
对象并将其插入堆中。注意,为了高效的获取一个数对应的numCount
对象,我保留了一个unordered_map
来进行对应。
我的思路主要逻辑如下代码所示。但是,在将一些 numCount
对象添加到堆后,push
操作给出了 invalid heap
错误。
struct numCount {
int number;
int count;
numCount(int num) : number(num), count(1) {}
};
struct compare {
bool operator() (numCount*& lhs, numCount*& rhs) {
return lhs -> count > rhs -> count;
}
};
vector<int> kPopular(vector<vector<int> >& nums, int k) {
int m = nums.size(), n = nums[0].size();
priority_queue<numCount*, vector<numCount*>, compare> pq;
unordered_map<int, numCount*> mp;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mp.find(nums[i][j]) != mp.end())
mp[nums[i][j]] -> count++;
else {
numCount* ncnt = new numCount(nums[i][j]);
pq.push(ncnt); // This line gives the "invalid heap" error.
mp[nums[i][j]] = ncnt;
}
}
}
vector<int> popular(k);
for (int i = 0; i < k; i++) {
popular[i] = pq.top() -> number;
pq.pop();
}
return popular;
}
我在以下矩阵上测试这段代码:
nums = [[1, 1, 2],
[2, 2, 3]
[1, 2, 3]]
然后在尝试添加对应于 nums[1 处的第一个
.3
的 numCount
对象时抛出 invalid heap
错误][2]
我该如何修复这个错误?
更新:在采纳@JSF的建议后,我更新了我的代码如下。
struct compare {
bool operator() (const pair<int, int>& lhs, const pair<int, int>& rhs) const {
return lhs.second < rhs.second;
}
};
vector<int> kPopular(vector<vector<int> >& nums, int k) {
int m = nums.size(), n = nums[0].size();
unordered_map<int, int> counts;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
counts[nums[i][j]]++;
set<pair<int, int>, compare> st;
for (auto pr : counts) {
st.insert(pr);
if ((int)st.size() > k)
st.erase(st.begin());
}
vector<int> popular(k);
set<pair<int, int>, compare>::iterator itr = st.begin();
for (int i = 0; i < k; i++) {
popular[i] = (*itr).first;
itr = st.erase(itr);
}
return popular;
}
最佳答案
修改优先级队列中现有条目的键既是问题的原因,也是正确完成的巨大困惑。为了您的目的,根本没有必要这样做。
以递增方式保留优先级队列不会达到您已确定的目的,并且会使您的算法效率低下,并产生上述难以纠正的问题。
相反,您应该首先读取所有数据并计算所有计数。从数字到计数的映射对于那个阶段来说会简单得多,并且比您的额外间接级别更有效。
计算完所有计数后,您就可以找到最大的 k 个。优先级队列是寻找最大的 k 的好工具的一种可能性,但该队列的有效使用将涉及颠倒 k 的含义。构建一个最多可容纳 k 个项目的队列,并始终识别最小的(不是这 k 个项目中最大的)。在 Q 中插入前 k 个 number,count
对,然后对于其余的每一对,将其与 Q 中的最小值进行比较,如果新的是,则用新的对替换 Q 中的最小值比旧的最小的大。
如果您有充分的理由在计算计数时保持递增的 Q,那么您的帖子中并没有说明这个原因,您应该说清楚。使用支持更改现有项目键的优先级队列并非不可能。我在我自己的工作中的很多地方都需要它,并选择编写我自己的优先级队列(而不是使用 std)以使这方面更容易。自己编写代码并不难,但可能还有一种使用 std 版本的方法。但在进入那种复杂性之前,请解释为什么这个问题需要它。
关于c++ - 将自定义数据插入priority_queue时出现invalid heap错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31489275/
我尝试使用 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 元素组成上面提到的加上
我是一名优秀的程序员,十分优秀!