資料結構 優先順序佇列

2021-09-24 12:20:26 字數 1892 閱讀 5070

設初始序列為:(49,38,65,97,76)

①大根堆:父節點的值大於或等於子節點的值(令數值越大優先順序越高)

此時堆頂的元素為所有元素的最大值(97)

②小根堆:父節點的值小於或等於子節點的值(令數值越小優先順序越高)

此時堆頂的元素為所有元素的最小值(38)

將佇列中的所有元素按從大到小的數值輸出:

①分析: 因為佇列是先進先出,後進後出,所以每次出隊的為隊頭元素即堆頂元素queue==>基於大根堆實現;

②思路如下:

1>將入隊的元素進行上浮操作,將最大值放置到堆頂(剩下的數沒有順序)

public void siftup(int i,t val)  else 

}queue[i]=val; //此時找到val的合適插入位置

}

2>此時出隊的元素(堆頂元素)則為所有值中的最大值,將queue出隊,接下來需要出第二小的元素,由於剩下的資料是沒有順序的,所以利用下沉函式將剩下資料中的最大值放至堆頂

3>將隊尾元素放置堆頂,並與其子節點進行比較,找出最大值放至父節點,並從最大值的位置繼續往下找非葉子節點

for (int j=2*i+1;j0) 

if (queue[j].compareto(val)>0)

else

}queue[i]=val; //將val放置合適的位置

此時已經將最大值放置堆頂,出隊元素為值第二大的數

將佇列中的所有元素按從小到大的數值輸出:

與1相似,只需要調整優先順序比較結果即可。(數值越小優先順序越大)

用優先順序佇列解決:    1.求一億個整數裡面,花費o(n)時間,找出前十小的資料?

1. 問題分析:

1. 先拿出前十個數入隊,假設為一億個整數中前十小的資料(a為其中的最大值)

2. 因為要找出最小的數,所以需要淘汰大的數(有較小值入隊時將最大值出隊)。

基於大根堆實現

3. 然後把剩下的數依次入隊。

在入隊前和 a 做比較

如果入隊的數 >= a,則肯定不為前十小,直接入下乙個數

若 < a ,則捨棄 a ,對新數進行入隊操作

4. 直至將最後乙個數入隊,最終剩下為前十小的數

相比較基於大根堆的優先順序佇列來說,解決此問題只需要在push()方法當放置元素下標越界時呼叫judge()函式進行上述操作 3

public void judge(t val) 

// 若小於,則捨棄最大值,將新數值入隊

else

}

當一億個整數都完成入隊操作後,最終剩下的十個數為陣列中前十小的數。

2.求一億個整數裡面,花費o(n)時間,找出前十大的資料?

2. 問題分析:  1. 先拿出前十個數入隊,假設為一億個整數中前十大的資料(a為其中的最大值)

2. 因為要找出最大的數,所以需要淘汰小的數(有較大值入隊時將最小值出隊)。

基於小根堆實現

3. 然後把剩下的數依次入隊。

在入隊前和 a 做比較

如果入隊的數 <= a,則肯定不為前十小,直接入下乙個數

若 >a ,則捨棄 a ,對新數進行入隊操作

4. 直至將最後乙個數入隊,最終剩下為前十大的數

資料結構 優先順序佇列

優先佇列的底層實現 二叉堆實現優先順序佇列 練習優先順序佇列也屬於佇列,因此也提供以下介面 利用二叉堆作為優先佇列的底層實現 可以通過comparator或comparable去自定義優先順序高低 利用二叉堆實現優先順序佇列。二叉堆實現優先順序佇列 author yusael public clas...

資料結構 優先順序佇列(堆)

一 堆 0 預備知識 使用陣列儲存二叉樹結構,方式即將二叉樹用層序遍歷方式放入陣列中。這種方式的主要用法就是堆的表示。在陣列中 左孩子 left 下標 2 parent 1 右孩子 right 下標 2 parent 2 雙親 parent 下標 child 1 2 1 堆的概念 堆在邏輯上是乙個完...

優先順序佇列 資料結構和演算法

優先順序佇列 在優先順序佇列中,資料項按關鍵字的值有序,這樣關鍵字最小的資料項 或最大 總是在 隊頭。資料項插入時會按照順序插入到合適的位置以確保佇列的順序。package test13 priorityqueue created by mlink on 2017 3 17.public class...