我正在尝试使用堆将 k 排序数组合并为单个数组
Posted
技术标签:
【中文标题】我正在尝试使用堆将 k 排序数组合并为单个数组【英文标题】:I am trying to solve merge k sorted arrays into a single array using heap 【发布时间】:2019-07-07 18:39:43 【问题描述】:我正在尝试使用堆将 k 个排序数组合并为一个数组。 但我收到一个错误:编译失败,退出代码为 1。我不明白这是什么意思。
编译失败,退出代码为 1,编译器输出: 我无法理解错误 我猜优先队列工作有问题。 由于我是新手,请有人提出更改建议。
我尝试过使用 stl 中内置的 std::pair,它可以正常工作。 但是如果我在代码中定义一个类,它就不起作用
class pairr
public:
int data;
int id;
int index;
pairr(int data,int id,int index)
this->data=data;
this->id=id;
this->index=index;
;
vector<int> merge(vector<vector<int>> &V)
priority_queue<pairr,vector<pairr>,greater<pairr>> q;
vector<int> out;
//creating min heap of k nodes
for(int i=0;i<V.size();i++)
pairr a(V[i][0],i,0);
q.push(a);
while(!q.empty())
//minimum element
pairr cur=q.top();
// i=array of min ele j=index of array
int i=cur.id;
int j=cur.index;
//pop the element and push it in output array
q.pop();
out.push_back(cur.data);
//push new element from same array
if(j+1<V[i].size())
pairr a(V[i][j+1],i,j+1);
q.push(a);
//return the output vector
return out;
int main()
vector<vector<int>> V=0,4,10,12,
1,3,5,7,
2,4,12,15,20;
vector<int> output=merge(V);
for(int i=0;i<output.size();i++)
cout<<output[i]<<" ";
return 0;
```
【问题讨论】:
与您的问题无关,但请阅读Why is “using namespace std;” considered bad practice? 如果您停止这样做,您可以给自己的类更自然的名称,如pair
而不是pairr
(即使命名与无论如何,标准类/函数有点令人困惑,特别是因为您的 pairr
类并不是真正的“对”)。
“我无法理解错误”——这就是你问这个问题的原因,对吧?那么为什么不将错误消息复制到您的问题中,以便可能理解错误的人可以看到呢?
谢谢你,下次我会处理的。
【参考方案1】:
您需要提供一种方法来比较pairr
的两个实例。 std::priority_queue
怎么知道哪个pairr
的优先级高于或低于另一个?既然要使用greater<pairr>
,就应该实现operator>()
。
它适用于std::pair
,因为std::pair
实际上确实提供了各种比较运算符,其中operator>
。
【讨论】:
以上是关于我正在尝试使用堆将 k 排序数组合并为单个数组的主要内容,如果未能解决你的问题,请参考以下文章