優先佇列基礎知識 四 二項佇列

2021-07-02 11:57:43 字數 1552 閱讀 8529

本文主要分析二項佇列。這個優先佇列結構也是為了處理對數時間合併兩個優先佇列而提出來的。它可是保證平均插入時間為常數。同時合併,刪除最小元操作的最壞時間為o(

logn

) 。這比左式堆更優,左式堆和斜堆是沒辦法實現平均插入時間是常數時間的。

二項佇列是通過樹結構來實現的,我們在乙個樹節點中儲存關鍵字,它的右兄弟節點,左二子節點三個資料。同時我們將二項佇列儲存在乙個陣列中,按照樹的大小(就是樹的高度,每種高度的樹只有一棵)來排序,陣列中儲存指向二項樹的指標。所以標頭檔案定義為

#ifndef binaryqueue_h_

#define binaryqueue_h_

struct binnode;

struct collection;

typedef

struct binnode *position;

typedef

struct binnode *bintree;

typedef

struct collection *binqueue;

void insert(binqueue bq1,int x);

bintree combine(bintree bt1,bintree bt2);

binqueue merge(binqueue bq1,binqueue bq2);

binqueue insert1(binqueue bq1,int x);

binqueue init();

#endif // binaryqueue

相應的操作函式如下:

struct binnode

;struct collection

;bintree combine(bintree bt1,bintree bt2)

binqueue merge(binqueue bq1,binqueue bq2)

else

}return bq1;

}}void insert(binqueue bq1,int x)

binqueue insert1(binqueue bq1,int x)

binqueue init()

int deletemin(binqueue bq1)

else

}delete_tree=bq1->thetrees[minindex]->leftchild;

binqueue delete_queue=init();

delete_queue->size=(1

<1;

int j;

for(j=delete_queue->size-1;j>=0;j--)

bq1->size-=delete_queue->size+1;

bq1->thetrees[minindex]=null;

bq1=merge(bq1,delete_queue);

return(minval);

}}

主函式如下:

int main()

優先佇列的基礎知識

優先佇列概念 優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高所以我們無論按照什麼順序push一堆數,...

優先佇列(堆)基礎知識

優先佇列是一種抽象資料型別,最重要的操作就是刪除最大元素 delmax 和插入元素 insert 二叉堆 能夠很好的實現優先佇列的基本操作 定義 當一顆二叉樹的每個結點都大於等於它的兩個子結點時,它被稱為堆有序。在堆有序的二叉樹中,每個結點都小於等於它的父結點。從任意結點向上,我們都能得到一列非遞減...

基礎知識 佇列

特點 先進先出 需要兩個指標,分別指向頭和尾 head tail 結構定義 隊首標記為0,隊尾標記為 1 給佇列分配記憶體空間 初始化類似於順序表 int data 資料區 int head,tail,length入隊 插在尾部出隊 head指向head next佇列遍歷 只需要將隊首標記上到隊尾標...