以前覺得這應該是很簡單的東西,但我發現網路上使用priority_queue的prim演算法相關程式碼我覺得寫不好,我就把我自己的放上來。這裡順便也放上kruskal的程式碼。
prim $\ord{\left(\abs{V}+\abs{E}\right)\log{\abs{V}}}$:
kruskal $\ord{\abs{V}+\abs{E}\log{\abs{E}}}$:
\(
\newcommand{\ord}[1]{\mathcal{O}\left(#1\right)}
\newcommand{\abs}[1]{\lvert #1 \rvert}
\newcommand{\floor}[1]{\lfloor #1 \rfloor}
\newcommand{\ceil}[1]{\lceil #1 \rceil}
\newcommand{\opord}{\operatorname{\mathcal{O}}}
\newcommand{\argmax}{\operatorname{arg\,max}}
\newcommand{\str}[1]{\texttt{"#1"}}
\)
2019年8月1日 星期四
2015年12月21日 星期一
[ min-max heap ] 最小-最大堆
最小-最大堆(Min-Max Heaps)是一個完整二元樹。此二元樹是交替的階層方式呈現,分別為最小階層 ( min level ) 和最大階層 ( max level ) ,這裡實作樹根為最小鍵值。
最小-最大堆是一種堆積支援以下幾種操作:
Min-Max Heaps and Generalized Priority Queues
以下提供模板:
最小-最大堆是一種堆積支援以下幾種操作:
- 求最大值 - max()
- 求最小值 - min()
- 刪除最大值 - pop_max()
- 刪除最小值 - pop_min()
- 元素入堆 - push()
Min-Max Heaps and Generalized Priority Queues
以下提供模板:
2015年5月3日 星期日
2015年1月8日 星期四
重量左偏樹 weight-biased leftist tree
2014年12月27日 星期六
左偏樹 leftist tree
一個左偏樹同時滿足了heap及左偏的性質
設:
deep(x)為x到任意一個外部節點的最長路徑長度
滿足: deep(x)={0,x為外部節點 : 1+max(deep(x->leftchild),deep(x->rightchild))}
由於左偏堆已經不是完全二元樹,因此不能用數組存儲表示,需要用連結結構。
插入刪除最差複雜度\(\ord{log \; n}\)最佳\(\ord 1\)
插入時盡量往右邊插入,若不符合左偏性質則交換左右子樹
刪除則是將根節點的左右子樹合併,再直接刪除根節點
以下是模板:
(感謝"脹脹的承翰"幫忙指正)
定義一個int為key的左偏樹:
//標準是大根堆
leftist_tree<int > t;
//小根堆的左偏樹
leftist_tree<int ,greater<int > >t;
基本上與priority_queue的用法差不多,只是多了clear()及join()指令
t.clear();//將t清空
t.join(b);//將b加入t,並將b清空
設:
deep(x)為x到任意一個外部節點的最長路徑長度
滿足: deep(x)={0,x為外部節點 : 1+max(deep(x->leftchild),deep(x->rightchild))}
由於左偏堆已經不是完全二元樹,因此不能用數組存儲表示,需要用連結結構。
插入刪除最差複雜度\(\ord{log \; n}\)最佳\(\ord 1\)
插入時盡量往右邊插入,若不符合左偏性質則交換左右子樹
刪除則是將根節點的左右子樹合併,再直接刪除根節點
以下是模板:
(感謝"脹脹的承翰"幫忙指正)
定義一個int為key的左偏樹:
//標準是大根堆
leftist_tree<int > t;
//小根堆的左偏樹
leftist_tree<int ,greater<int > >t;
基本上與priority_queue的用法差不多,只是多了clear()及join()指令
t.clear();//將t清空
t.join(b);//將b加入t,並將b清空
訂閱:
文章 (Atom)