我正在尝试使用堆将 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&lt;pairr&gt;,就应该实现operator&gt;()

它适用于std::pair,因为std::pair 实际上确实提供了各种比较运算符,其中operator&gt;

【讨论】:

以上是关于我正在尝试使用堆将 k 排序数组合并为单个数组的主要内容,如果未能解决你的问题,请参考以下文章

将具有相同或不同长度的2个不同整数数组合并为一个大数组,并将它们从最小到最大排序

如何将两个数组合并为一个相应的2d数组?

Java中如何把两个数组合并为一个

Python版将两个有序数组合并为一个有序数组

JAVA怎么合并两个数组

怎么用c语言将两个数组并起来?