簡體   English   中英

使用STL優先隊列的最小堆說明

[英]Min Heap using STL Priority Queue explanation

我對C ++相當陌生,我試圖使用C ++中的Priority Queue STL實現Min Heap。 我環顧四周,偶然發現了一個代碼,該代碼是我在底部添加的鏈接。

我了解向量的工作原理,也了解函子是什么,但我無法理解“ return i> j”如何將元素從最小排列到最大。

我將在此處發布代碼。

#include <queue>
#include <iostream>

using namespace std;

struct comparator {
     bool operator()(int i, int j) {
     return i > j;
    }
};

int main(int argc, char const *argv[])
{
     priority_queue<int, std::vector<int>, comparator> minHeap;

    minHeap.push(10);
    minHeap.push(5);
    minHeap.push(12);
    minHeap.push(3);
    minHeap.push(3);
    minHeap.push(4);

    while (!minHeap.empty()) {
    cout << minHeap.top() << " ";
    minHeap.pop();
    }
    return 0;
}

有人可以跟蹤程序的執行情況嗎? 我一直在嘗試了解該程序在過去的幾個小時中是如何運作的,但是沒有運氣。

我從這里得到代碼

根據給定的標准,優先級隊列中的第一個元素始終是它包含的最大元素。 此標准是您的函子comparator 在這種情況下,它定義了對於兩個給定元素,次要元素應該是第一個。

因此,在您的代碼中,如果我們提取所有元素,則輸出將是從最小到最大排序的元素:

while (!minHeap.empty()) {
   cout << minHeap.top() << " ";
   minHeap.pop();
}
//output: 3,3,4,5,10,12

推入元素的算法就像堆:

  1. 將新元素放置在數組中的下一個可用位置。 (樹的下層)
  2. 使用提供的函子( comparator )將新元素與其父元素進行comparator 在這種情況下,您的比較是“如果新元素較小”,則將其與其父元素交換。
  3. 繼續此過程,直到:
    • 新元素的父元素小於或等於新元素,或者
    • 新元素到達根(數組的索引0)

也許更直觀地看到算法是如何工作的:假設您已經將數字6,3,5,9推入了,現在您推了2。 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM