簡體   English   中英

更改向量中的值后,make_heap是否按預期工作?

[英]make_heap not working as expected after changing value in vector?

我正在嘗試使用make_heap來實現Dijkstra的算法,其中(希望)按遞減值順序對向量進行排序以便創建優先級隊列,但由於某種原因,如果我更改了值並且我沒有,則排序會全部出錯想法為什么。

碼:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<float> heap;

    for(int i=0;i<5;i++) heap.push_back(1e9);

    heap[0] = 0; // <=== this is a problem for make_heap

    for(int i=0;i<heap.size();i++) cout << heap[i] << ' ';
    cout << endl;

    make_heap(heap.begin(),heap.end());

    for(int i=0;i<heap.size();i++) cout << heap[i] << ' ';
    cout << endl;   

    return 0;
}

輸出:

Success time: 0 memory: 3468 signal:0
0 1e+09 1e+09 1e+09 1e+09 
1e+09 1e+09 0 1e+09 1e+09 

有趣的是,如果在推送其他元素之前將heap[0] = 0更改為heap.push_back(0) ,則排序可以完美地運行。

輸出:

Success time: 0 memory: 3468 signal:0
0 1e+09 1e+09 1e+09 1e+09 1e+09 
1e+09 1e+09 1e+09 1e+09 1e+09 0 

會是什么呢? 提前致謝。

C ++標准未指定標准庫應如何實現Heap。 所以你不應該期待具體的安排。 C ++標准僅指定行為。

TL; DR;

heap[0] = 0heap.push_back(0)之間存在差異。 前者不會改變容器的大小,而后者則會改變容器的大小。 奇數/偶數大小的容器的堆表示可能不同; 沒關系,當我們使用適當的函數訪問它時,我們想要的只是一個堆行為。


同樣,無論何時使用std::make_heap等函數,都應該使用其關聯函數( std::push_heapstd::pop_heap )來訪問容器(這可以保證容器的堆屬性)。

對它的任何其他修改可能導致容器丟失其堆屬性。 這包括:

heap[0] = 0;

乃至:

heap.push_back(0)

要成為一個有效的堆,所有i> 0的堆[i] <= heap [(i - 1)/ 2]。

在這兩種情況下,make_heap()都在創建一個有效的堆。 第一個有5個元素,第二個有6個。我不理解你的問題的部分,但它們似乎與make_heap()無關。

暫無
暫無

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

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