heapq : 堆隊(duì)列算法

heapq : 堆隊(duì)列算法

Source code: Lib/heapq.py

介紹

  • 這個模塊提供了堆隊(duì)列算法的實(shí)現(xiàn),也稱為優(yōu)先隊(duì)列算法。

  • 堆是一個特殊的二叉樹(本文檔中指的小頂堆,對應(yīng)還有大頂堆),它的每個父結(jié)點(diǎn)的值小于等于它的兩個孩子結(jié)點(diǎn)的值。
    該文中的堆是基于數(shù)組來實(shí)現(xiàn)的靜態(tài)二叉樹,對于數(shù)組中的每個元素

heapq.merge(\*iterables, key=None, reverse=False)

  • 合并多個已排序(升序)的序列,返回一個可迭代對象
  • 功能和sorted(itertools.chain(*iterables))類似,但是它返回的是可迭代對象,它不會將所有的數(shù)據(jù)一次性放到內(nèi)存里面,并且以輸入的序列必須是
    排序、升序?yàn)榍疤?/li>
  • 有兩個可選參數(shù):
    • key參數(shù)制定了一個key函數(shù),該函數(shù)用來指定輸入序列中用來排序的元素;
    • reverse是一個bool值,若為true,則合并之后的元素倒排
      eg:
a = [3, 1, 5, 7]
b = [2, 4, 6, 8]
c = merge(a, b)    
for item in c:
    print(item, sep=" ", end=" "
output:
  1 2 3 4 5 6 7 8  

基礎(chǔ)的例子

  • 堆排序可以通過將所有的元素壓入堆中,然后每次從小頂堆中取出最小的元素(即二叉樹中的根節(jié)點(diǎn)):

     def heapsort(iterable):
     h = []
     for value in iterable:
         heappush(h, value)
     return [heappop(h) for i in range(len(h))]
    
     heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
    
  • 上述的堆排序和內(nèi)置sorted(iterable)函數(shù)很像,但是該堆排序不是穩(wěn)定的,而sorted(iterable)是穩(wěn)定的排序;

  • 堆元素可以是元組。這可以用于像任務(wù)優(yōu)先級中,選取某個屬性來作為當(dāng)前的比較值:

    h = []
    heappush(h, (5, 'write code'))
    heappush(h, (7, 'release product'))
    heappush(h, (1, 'write spec'))
    heappush(h, (3, 'create tests'))
    heappop(h)
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • PYTHON-進(jìn)階-ITERTOOLS模塊小結(jié)轉(zhuǎn)自wklken:http://wklken.me/posts/20...
    C_Y_閱讀 1,047評論 0 2
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,223評論 0 52
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,309評論 0 35
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學(xué)在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,173評論 0 12
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,286評論 0 2