日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

数据结构之优先队列:优先队列的介绍与基础操作实现,Python代码实现——14

發布時間:2024/7/5 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之优先队列:优先队列的介绍与基础操作实现,Python代码实现——14 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

優先隊列(Priority queue)的介紹

  • 優先隊列是計算機中一種抽象的數據結構類,它有著一個類似和隊列或者堆的結構,但是其中每個元素額外有一個優先級別
  • 在一個優先隊列中,一個高優先順序的元素會先執行與低優先順序的元素。在它的執行過程中,如果兩個元素擁有相同的優先順序,則會根據他們進入隊列的先后順序來確定執行先后,但是在在其他類型的數據結構中,如果兩個元素優先級別相同,則不會定義這兩個元素的先后執行順序
  • 優先隊列一般使用堆來進行實現,但他們在概念上與堆是有區別的。一個優先隊列它可以是一個“列表”,也可以是一個“字典”,正如一個列表可以使用鏈表或者數組來實現一樣,優先隊列可以用堆或者其他各種不同的方法,如無序數組來實現

要實現的兩種優先隊列

兩種優先隊列:

  • 最大優先隊列(Max priority queue),最大優先級的元素在隊列最前面,可以指定最大元素取出和刪除
  • 最小優先隊列(Max priority queue),最小優先級的元素在隊列最前面,可以指定最小元素取出和刪除
  • 使用堆(數組)實現最大優先隊列

    定義方法

  • size()獲取隊列大小
  • less(x, y)對傳入的兩個索引對應當前隊列的元素進行大小比較
  • is_empty()判斷隊列是否為空
  • swap(i, j)對傳入的兩個索引對應當前隊列中的元素進行值交換
  • append(item)在隊列末尾添加指定元素
  • extract_max()取出并刪除最大優先級的元素
  • sink()使用下沉排序操作,對刪除元素后的隊列進行排序
  • swim()使用上浮排序操作,對從尾部插入元素的隊列進行排序
  • 最大優先隊列Python代碼實現

    class MaxPriorityQueue:def __init__(self):self.heap = [None]self.N = 0def size(self):return self.Ndef less(self, i, j):return self.heap[i] < self.heap[j]def is_empty(self):return self.N == 0def swap(self, i, j):self.heap[i], self.heap[j] = self.heap[j], self.heap[i]def append(self, item):self.heap.append(item)self.N += 1self.swim(self.N)def extract_max(self):if self.N < 1:returnfirst = self.heap[1]# print(f"first: {first}")self.swap(1, self.N)del self.heap[self.N]self.N -= 1self.sink(1, self.N)return firstdef sink(self, index, _range):while 2*index <= _range:max_index = 2*index if 2*index+1 > _range else \(2*index+1 if self.less(2*index, 2*index+1) else 2*index)if self.less(max_index, index):breakself.swap(max_index, index)index = max_indexdef swim(self, index):while index > 1:if self.less(int(index/2), index):self.swap(int(index/2), index)index = int(index/2)if __name__ == '__main__':MPQ = MaxPriorityQueue()MPQ.append('A')MPQ.append('B')MPQ.append('C')MPQ.append('D')MPQ.append('E')MPQ.append('F')MPQ.append('G')while not MPQ.is_empty():_max = MPQ.extract_max()print(_max, end=' ')

    Max Priority Queue運行測試結果

    G F E D C B A

    進行尾部插入元素操作時從小到大附加到隊列,依次抽離最大元素是從大到小返回結果

    使用堆(數組)實現最小優先隊列

    核心方法與最大優先隊列實習的實現是差不多的,只是在父結點與子結點排序比較時,將兩者位置調換,再進行比較和位置移動操作

    最小優先隊列Python代碼實現

    import operatorclass MinPriorityQueue:def __init__(self):self.heap = [None]self.N = 0def size(self):return self.Ndef is_empty(self):return self.N == 0def less(self, i, j):return operator.lt(self.heap[i], self.heap[j])def swap(self, i, j):self.heap[i], self.heap[j] = self.heap[j], self.heap[i]def append(self, item):self.heap.append(item)self.N += 1self.swim(self.N)def extract_min(self):if self.N < 1:return_min = self.heap[1]self.swap(1, self.N)del self.heap[self.N]self.N -= 1self.sink(1, self.N)return _mindef swim(self, index):while index > 1:if self.less(index, int(index / 2)):self.swap(index, int(index / 2))index = int(index / 2)def sink(self, index, _range):while 2 * index <= _range:min_index = 2 * index if 2 * index + 1 > _range else \(2 * index if self.less(2 * index, 2 * index + 1) else 2 * index + 1)if self.less(index, min_index):breakself.swap(index, min_index)index = min_indexif __name__ == '__main__':MPQ = MinPriorityQueue()MPQ.append('G')MPQ.append('F')MPQ.append('E')MPQ.append('D')MPQ.append('C')MPQ.append('B')MPQ.append('A')while not MPQ.is_empty():_min = MPQ.extract_min()print(_min, end=' ')

    Min Priority Queue運行測試結果

    A B C D E F G 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的数据结构之优先队列:优先队列的介绍与基础操作实现,Python代码实现——14的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。