首頁 >後端開發 >C++ >C++中的堆和優先隊列

C++中的堆和優先隊列

WBOY
WBOY原創
2023-08-22 16:16:501372瀏覽

C++中的堆和優先隊列

堆和優先佇列是C 中常用的資料結構,它們都具有重要的應用價值。本文將分別對堆和優先隊列進行介紹和解析,以幫助讀者更好地理解和使用它們。

一、堆

堆是一種特殊的樹狀資料結構,它可以用來實作優先佇列。在堆中,每個節點都滿足如下性質:

  1. 它的值不小於(或不大於)其父節點的值。
  2. 它的左右子樹也是一個堆。

我們將不小於其父節點的堆稱為“最小堆”,將不大於其父節點的堆稱為“最大堆”。此外,堆通常是一個完全二元樹,即除了最後一層外,其他層的節點都是滿的,最後一層的節點從左到右排列。

在C 中,STL函式庫提供了heap和priority_queue兩個類別來實作堆。其中,heap類別提供了堆疊操作函數,如make_heap、push_heap、pop_heap等,priority_queue類別則是基於堆實現的優先佇列。下面,我們來看看heap和priority_queue的用法。

  1. heap類別

(1) 建立堆疊

在建立堆前,需要先建立一個vector型別的陣列來儲存待排序的數字:

vector v = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3 };

#然後,我們可以使用make_heap函數將vector類型的陣列轉換為堆:

make_heap(v.begin(), v.end(), greater());

其中,greater()表示比較函數,可以控制堆的型別。

(2) 插入元素

在堆中插入元素可以使用push_heap函數,它的用法如下:

v.push_back(7);
push_heap( v.begin(), v.end(), greater());

(3) 刪除元素

在堆中刪除元素可以使用pop_heap函數,它會將堆頂元素移動到堆的最後一個位置,並從堆中刪除該元素。此函數的用法如下:

pop_heap(v.begin(), v.end(), greater());
v.pop_back();

  1. priority_queue類別

(1) 建立堆疊

與heap類別不同,priority_queue類別可以在宣告物件時指定堆疊的類型,如下所示:

priority_queue, greater> q;

這表示建立一個最小堆。

(2) 插入元素

在priority_queue中插入元素可以直接使用push函數,如下所示:

##q.push(2);

q. push(4);
q.push(1);
q.push(9);

(3) 刪除元素

在priority_queue中刪除元素可以直接使用pop函數,如下所示:

q.pop();

二、優先權佇列

優先權佇列是一種特殊的佇列,它依照優先權為元素進行排序,並在佇列前端放置優先順序最高的元素,佇列尾部放置優先權最低的元素。可以使用堆來實現優先隊列。

在C 中,priority_queue類別是基於堆疊實現的優先佇列,它可以使用上述heap和priority_queue類別中的函數來進行元素插入和刪除操作。另外,priority_queue類別中也提供了top函數,用於存取優先順序最高的元素,如下所示:

priority_queue q;

q.push(2);
q .push(4);
q.push(1);
q.push(9);
cout

總結:

本文介紹了C 中的堆和優先隊列,並分別解析了堆和優先隊列的用法和實作原理。透過學習本文,讀者可以更好地理解這兩種資料結構,並在實際程式設計中靈活運用。同時,讀者要注意堆和優先隊列的使用時機和注意事項,以確保程式碼的正確性和效率。

以上是C++中的堆和優先隊列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn