min stl приоритетная очередь для хранения верхних 'm' элементов из всего массива показывает неправильный вывод. Здесь в этом примере отсортированный вектор будет [1,3,3,3,3,5,5,5,5,8,8,8,8,8]. Таким образом, верхний 'm', где m = 5, должен быть 1,3,3,3,3, но выход 1,3,3,3,5. Может ли кто-нибудь предположить, почему он не работает в случае дублирования записей. Вот пример кода.неправильный вывод min stl приоритет для печати верхних 'm' элементов
#include <iostream>
#include <queue>
using namespace std;
struct compare
{
bool operator()(const int& l, const int& r)
{
return l > r;
}
};
int main()
{
priority_queue<int,vector<int>, compare > pq;
vector <int> p;
p.push_back(3);
p.push_back(3);
p.push_back(3);
p.push_back(3);
p.push_back(5);
p.push_back(5);
p.push_back(5);
p.push_back(5);
p.push_back(1);
p.push_back(8);
p.push_back(8);
p.push_back(8);
p.push_back(8);
p.push_back(8);
for(int i=0;i<p.size();i++)
{
int k= p[i];
if(pq.size() < 5) // top 'm' elements say m = 5 here
{
pq.push(k);
}
else if (pq.top() >= k)
{
pq.pop();
pq.push(k);
}
}
while (!pq.empty())
{
cout << pq.top() << endl;
pq.pop();
}
cin.get();
}
Некорректный выход:
1
3
3
3
5
но правильный вывод должен быть
1
3
3
3
3
минимальная куча должна быть построена только для верхних 'm' элементов. Итак, как мы можем ограничить ограничение на pq вместо хранения всех элементов? но для этого без необходимости мы нажимаем все элементы массива правильно? В этом случае мы хотим только верхние 'm' минимальные элементы данного массива, просто проверяя условие. Нам просто нужна куча минут с элементами «m». или же это похоже на то, что мы сохраняем все элементы массива правильно? этот код работает для не дубликатов записей, но не работает для дубликатов записей. – ganapathi
@ganapathi. При использовании 'push' может применяться ограничение на размер' pq'. Если нажатие увеличивает размер 'pq', тогда сделайте' pop' + 'push', иначе сделайте только' push'. –
@ Сауравтханкс много! его, как мы, пересекаем pq снизу и заменяем самый высокий элемент справа – ganapathi