c 堆與優先佇列

2021-07-25 08:29:55 字數 1827 閱讀 6351

以最小堆為例,實現下列操作:

//向下調整演算法

void down(int p)

heap[p] = a;

}//插入

void insert(int a)

//將p的優先順序上公升為a

void increasekey(int p, int a)

//建立堆

void build()

例題:poj 2051argus

思路:維持乙個最小堆,每次輸出根結點,然後再相應地改變根結點的時間,向下調整最小堆。如此執行k次。

**:

#include #include #include using namespace std;

const int maxn = 1008;

int k, st;

int sh[3008]; //id與週期的對映表

struct heap;

heap t[maxn]; //最小堆

void adjust(int j)

t[j] = m;

}void input()

for(int i = st/2; i > 0; i--)//初始化最小堆,這裡i一開始為什麼等於st/2呢?

adjust(i);//因為總節點數為i的二叉樹,除開葉子節點還有i/2個節點;

scanf("%d", &k);

}int dele()

int main()

優先佇列:

基本操作:

empty() 如果隊列為空返回真

pop() 刪除對頂元素

push() 加入乙個元素

size() 返回優先佇列中擁有的元素個數

top() 返回優先佇列對頂元素

用法:示例:將元素5,3,2,4,6依次push到優先佇列中,print其輸出。

1. 標準庫預設使用元素型別的《操作符來確定它們之間的優先順序關係。

priority_queuepq;
通過《操作符可知在整數中元素大的優先順序高。

故示例1中輸出結果為: 6 5 4 3 2

2. 資料越小,優先順序越高

priority_queue, greater>pq;

其中第二個引數為容器型別。

第二個引數為比較函式。

故示例2中輸出結果為:2 3 4 5 6

3. 自定義優先順序,過載比較符號

過載預設的 < 符號

struct node

int priority;

int value;

};

這時,需要為每個元素自定義乙個優先順序。

poj 2051**:

#include #include #include #include #include using namespace std;

struct regist

int q_num, period, now;

};priority_queueminheap;

int main()

scanf("%d", &k);

while(k--)

return 0;

}

兩種方法在複雜度上面沒什麼區別!

優先佇列與堆

二 堆 1.1 定義 在很多應用中,我們通常需要按照優先順序情況對待處理物件進行處理,比如首先處理優先順序最高的物件,然後處理次高的物件。最簡單的乙個例子就是,在手機上玩遊戲的時候,如果有來電,那麼系統應該優先處理打進來的 在這種情況下,我們的資料結構應該提供兩個最基本的操作,乙個是返回最高優先順序...

堆與優先佇列

分析與思考 陣列是完全二叉樹的儲存結構,完全二叉樹是陣列的邏輯結構,這樣我們就可以使用樹形結構來解決線性問題。堆的插入與刪除 尾部插入,頭部彈出 聯想到了佇列 不同程式語言在實現優先佇列時底層90 是由堆構成的。通過 本身來提高程式設計能力是錯誤的,應注重思維邏輯結構的提公升 資料結構 結構定義 結...

優先佇列《堆》

1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...