二項佇列的簡單實現

2021-08-01 07:15:54 字數 1772 閱讀 8624

二項佇列也是優先佇列的一種實現方式,之前有用左式堆和二叉堆來實現優先佇列,不過二項佇列與左式堆和二叉堆的不同在於二項佇列能有效的支援合併/插入/deletemin操作,每次操作的最壞執行時間是o(log n),對於插入操作,平均是花費常數時間

與左式堆和二叉堆不同的是,二項佇列不是樹,而是樹的集合,也就是森林.

這個森林中,每個高度最多只有一棵樹.

#include 

#include

#include

#include

typedef

struct binnode *positon, *bintree;

typedef

struct collection *binqueue;

typedef

int elementtype;

int maxtrees = 100000;

int capacity = 200000;

struct binnode ;

struct collection ;

void error(char *message)

int isempty(binqueue h)

binqueue initialize()

return h;

}bintree combinetrees(bintree t1, bintree t2)

/* merge two binomial queues */

/* not optimized for early termination */

/* h1 contains merged result */

binqueue merge(binqueue h1, binqueue h2)

}return h1;

}elementtype deletemin(binqueue h)

minitem = infinity;

for (i = 0; i < maxtrees; i++)

}deletedtree = h->thetrees[mintree];

oldroot = deletedtree;

deletedtree = deletedtree->leftchild;

free(oldroot);

deletedqueue = initialize();

deletedqueue->currentsize = (1

<< mintree) - 1;

for (j = mintree - 1; j >= 0; j--)

h->thetrees[mintree] = null;

h->currentsize -= deletedqueue->currentsize + 1;

merge(h, deletedqueue);

return minitem;

}int main()

binqueue result = merge(q[0], q[1]);

for (i = 2; i < 1000; i++)

int j = deletemin(result);

printf("%d\n", j);

return

0;}

merge

merge操作是按高度從小到大依次合併

deletemin

遍歷一遍二項佇列中的樹根,找到最小的那個,然後把該二項樹打散成若干哥二項樹,構造成乙個新的二項佇列,然後刪掉這個二項樹構造出另乙個新的二項佇列,最後合併這兩個新的二項佇列

佇列的簡單實現

佇列是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表 零個或多個資料元素的有限序列,有順序 缺點 佇列中會空出乙個位置不被使用 public class queue else public queue public int getsize public void push object o...

簡單佇列的實現

package jing.able.impl author panjing describe date 2019 4 14 time 15 37 public inte ce imyqueue package jing.able.dao import jing.able.impl.imyqueue ...

優先佇列 堆 二項佇列

目錄四 二項佇列的實現 位址 我們知道,左式堆每次操作的時間界是 o logn 二項佇列支援合併 插入 刪除最小值,每次插入的平均時間為常數時間,而最壞時間是 o logn 二項佇列 結構 高度為0的二項樹是一棵單節點樹,例如b0。高度為k的二項樹 b k 通過將一棵二項樹 b 附接到另一棵二項樹 ...