優先順序佇列

2021-10-04 20:08:39 字數 2567 閱讀 9926

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...