3.應用
佇列是一種先進先出(fifo)的結構,而優先順序佇列,我們是按照元素在佇列中的優先順序來操作的。對於優先權相同的元素,可按先進先出次序處理或按任意優先權進行。它應該提供兩個最基本的操作,乙個是返回最高優先順序物件,乙個是新增新的物件。這種資料結構就是優先順序佇列。
優先順序佇列的實現方式有很多種,最常見的是使用堆來構建。
堆在邏輯上是一棵完全二叉樹
堆物理上是儲存在陣列中的
任意結點的值都大於其子樹中結點的值叫大堆,反之,叫做小堆
堆的基本作用是,快速找集合中的最值(top k 問題)
向下調整有個前提:它的左右子樹必須已經是堆了,才能調整
以大堆為例子:
我們要建立乙個大堆,就得多次迴圈,進行向下調整。向下調整首先得到左右孩子中最大的那個(記為 child ),然後與當前結點(記為parent)進行比較,如果parent比較大,就不用調整了,否則,進行交換。重複上述步驟直至到達葉子節點為止。
以大堆為例子:
如果我們把堆頂的元素給刪除了,那麼就需要往此處插入乙個元素,從葉子結點出發,然後向上調整,使堆仍然保持結構。向上調整,已知葉子結點位置child,比較的是當前位置child 和其 parent結點的大下,如果parent 比較大,就結束調整,否則,交換兩個結點的值。重複上述步驟直到根節點為止。
給定乙個陣列,邏輯上是一棵完全二叉樹,通過計算,構建成堆。
我們從倒數第乙個非葉子結點的子樹開始調整,一直調整到根節點的樹,就可以調整成堆。
我們在這裡以大堆為例子,實現大堆的新增,取最大元素
往優先佇列中新增乙個值,我們需要堆仍然保持結構,所以需要向上調整
取出優先佇列中的最大值,然後將最後乙個元素挪到隊首,同時需要保持堆的結構就需要向下調整
public
class
mypriorityqueue
public
void
offer
(int val)
// 向上調整
private
static
void
shiftup
(int
array,
int index)
else
child = parent;
parent =
(child -1)
/2;}
}// 將隊首元素刪掉並返回,同時保持堆結構
public
intpoll()
// 向下調整
private
static
void
shiftdown
(int
array,
int size,
int index)
if(array[parent]
< array[child]
)else
parent = child;
child =
2* parent +1;
}}public
intpeek()
public
boolean
isempty()
}
直接利用上面構建的優先順序佇列來實現。
要找堆中前k大或者前k小的問題,很自然的是把前k個取出來。
class
test
; mypriorityqueue queue =
newmypriorityqueue()
;for
(int i =
0; i < arr.length; i++
)int k =3;
for(
int i =
0; i < k ; i++)}
}
在傳進來陣列上直接搞乙個大堆,然後將堆的第乙個和當前堆最後乙個交換。(注意,堆在不斷縮小,有序性在不斷增加)這樣不斷重複,就能夠從後到前使陣列有序。
注意:公升序建立大堆,降序建立小堆
public
static
void
heapsort
(int
array)
}private
static
void
swap
(int
array,
int a,
int b)
private
static
void
createheap
(int
array)
}public
static
void
shiftdown
(int
array,
int size,
int index)
// 然後用最大的那個 child 和 parent 比較
if(array[parent]
< array[child]
)else
parent = child;
child =
2* parent +1;
}}
佇列 優先順序佇列
優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...
優先順序佇列
分為最小優先順序佇列和最大優先順序佇列。優先順序佇列是一種用來維護一組元素構成的集合s的資料結構,這一組元素都有乙個關鍵字key,乙個最大優先順序佇列支援的操作 insert s,x 把x插入到集合s中 maxmum s 返回s中最大元素 extra max s 去掉s中最大關鍵字並返回該最大關鍵子...
優先順序佇列
1 include stdafx.h 2 include3 4 using namespace std 5 6 define max heap len 107 int heap max heap len 8 int heap size 0 the number of elements in heap...