欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中heapq模塊的用法

 更新時(shí)間:2016年06月28日 17:39:47   作者:cangmean  
Python中的heapq模塊提供了一種堆隊(duì)列heapq類(lèi)型,這樣實(shí)現(xiàn)堆排序等算法便相當(dāng)方便,這里我們就來(lái)詳解Python中heapq模塊的用法,需要的朋友可以參考下

heapq 模塊提供了堆算法。heapq是一種子節(jié)點(diǎn)和父節(jié)點(diǎn)排序的樹(shù)形數(shù)據(jù)結(jié)構(gòu)。這個(gè)模塊提供heap[k] <= heap[2*k+1] and heap[k] <= heap[2*k+2]。為了比較不存在的元素被人為是無(wú)限大的。heap最小的元素總是[0]。

打印 heapq 類(lèi)型

import math 
import random
from cStringIO import StringIO

def show_tree(tree, total_width=36, fill=' '):
   output = StringIO()
   last_row = -1
   for i, n in enumerate(tree):
     if i:
       row = int(math.floor(math.log(i+1, 2)))
     else:
       row = 0
     if row != last_row:
       output.write('\n')
     columns = 2**row
     col_width = int(math.floor((total_width * 1.0) / columns))
     output.write(str(n).center(col_width, fill))
     last_row = row
   print output.getvalue()
   print '-' * total_width
   print 
   return

data = random.sample(range(1,8), 7)
print 'data: ', data
show_tree(data)

打印結(jié)果

data: [3, 2, 6, 5, 4, 7, 1]

     3           
  2      6      
5    4  7     1   
-------------------------
heapq.heappush(heap, item)

push一個(gè)元素到heap里, 修改上面的代碼

heap = []
data = random.sample(range(1,8), 7)
print 'data: ', data

for i in data:
  print 'add %3d:' % i
  heapq.heappush(heap, i)
  show_tree(heap)

打印結(jié)果

data: [6, 1, 5, 4, 3, 7, 2]
add  6:
         6         
 ------------------------------------
add  1:
      1 
   6         
------------------------------------
add  5:
      1 
   6       5       
------------------------------------
add  4:
        1 
    4       5       
  6
------------------------------------
add  3:
        1 
    3       5       
  6    4
------------------------------------
add  7:
        1 
    3        5       
  6    4    7
------------------------------------
add  2:
        1 
    3        2       
  6    4    7    5
------------------------------------

根據(jù)結(jié)果可以了解,子節(jié)點(diǎn)的元素大于父節(jié)點(diǎn)元素。而兄弟節(jié)點(diǎn)則不會(huì)排序。

heapq.heapify(list)

將list類(lèi)型轉(zhuǎn)化為heap, 在線(xiàn)性時(shí)間內(nèi), 重新排列列表。

print 'data: ', data
heapq.heapify(data)
print 'data: ', data

show_tree(data)

打印結(jié)果

data: [2, 7, 4, 3, 6, 5, 1]
data: [1, 3, 2, 7, 6, 5, 4]

      1         
   3         2     
7    6    5    4  
------------------------------------
heapq.heappop(heap)

刪除并返回堆中最小的元素, 通過(guò)heapify() 和heappop()來(lái)排序。

data = random.sample(range(1, 8), 7)
print 'data: ', data
heapq.heapify(data)
show_tree(data)

heap = []
while data:
  i = heapq.heappop(data)
  print 'pop %3d:' % i
  show_tree(data)
  heap.append(i)
print 'heap: ', heap

打印結(jié)果

data: [4, 1, 3, 7, 5, 6, 2]

         1
    4         2
  7    5    6    3
------------------------------------

pop  1:
         2
    4         3
  7    5    6
------------------------------------
pop  2:
         3
    4         6
  7    5
------------------------------------
pop  3:
         4
    5         6
  7
------------------------------------
pop  4:
         5
    7         6
------------------------------------
pop  5:
         6
    7
------------------------------------
pop  6:
        7
------------------------------------
pop  7:

------------------------------------
heap: [1, 2, 3, 4, 5, 6, 7]

可以看到已排好序的heap。

heapq.heapreplace(iterable, n)

刪除現(xiàn)有元素并將其替換為一個(gè)新值。

data = random.sample(range(1, 8), 7)
print 'data: ', data
heapq.heapify(data)
show_tree(data)

for n in [8, 9, 10]:
  smallest = heapq.heapreplace(data, n)
  print 'replace %2d with %2d:' % (smallest, n)
  show_tree(data)

打印結(jié)果

data: [7, 5, 4, 2, 6, 3, 1]

         1
    2         3
  5    6    7    4
------------------------------------

replace 1 with 8:

         2
    5         3
  8    6    7    4
------------------------------------

replace 2 with 9:

         3
    5         4
  8    6    7    9
------------------------------------

replace 3 with 10:

         4
    5         7
  8    6    10    9
------------------------------------

heapq.nlargest(n, iterable) 和 heapq.nsmallest(n, iterable)

返回列表中的n個(gè)最大值和最小值

data = range(1,6)
l = heapq.nlargest(3, data)
print l     # [5, 4, 3]

s = heapq.nsmallest(3, data)
print s     # [1, 2, 3]

PS:一個(gè)計(jì)算題
構(gòu)建元素個(gè)數(shù)為 K=5 的最小堆代碼實(shí)例:

#!/usr/bin/env python 
# -*- encoding: utf-8 -*- 
# Author: kentzhan 
# 
 
import heapq 
import random 
 
heap = [] 
heapq.heapify(heap) 
for i in range(15): 
 item = random.randint(10, 100) 
 print "comeing ", item, 
 if len(heap) >= 5: 
  top_item = heap[0] # smallest in heap 
  if top_item < item: # min heap 
   top_item = heapq.heappop(heap) 
   print "pop", top_item, 
   heapq.heappush(heap, item) 
   print "push", item, 
 else: 
  heapq.heappush(heap, item) 
  print "push", item, 
 pass 
 print heap 
pass 
print heap 
 
print "sort" 
heap.sort() 
 
print heap 

結(jié)果:

2016628172708102.png (550×363)

相關(guān)文章

  • python讀寫(xiě)Excel表格的實(shí)例代碼(簡(jiǎn)單實(shí)用)

    python讀寫(xiě)Excel表格的實(shí)例代碼(簡(jiǎn)單實(shí)用)

    這篇文章主要介紹了python讀寫(xiě)Excel表格的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python字符串通過(guò)''+''和join函數(shù)拼接新字符串的性能測(cè)試比較

    Python字符串通過(guò)''+''和join函數(shù)拼接新字符串的性能測(cè)試比較

    今天小編就為大家分享一篇關(guān)于Python字符串通過(guò)'+'和join函數(shù)拼接新字符串的性能測(cè)試比較,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • 如何利用Python識(shí)別圖片中的文字詳解

    如何利用Python識(shí)別圖片中的文字詳解

    不知道大家有沒(méi)有遇到過(guò)這樣的問(wèn)題,就是在某個(gè)軟件或者某個(gè)網(wǎng)頁(yè)里面有一篇文章,你非常喜歡,但是不能復(fù)制.這個(gè)時(shí)候我們就會(huì)選擇截圖保存,但是當(dāng)我們想用到里面的文字時(shí),還是要一個(gè)字一個(gè)字打出來(lái),那么能不能直接識(shí)別圖片中的文字呢?答案是肯定的,需要的朋友可以參考下
    2021-05-05
  • Python使用Peewee創(chuàng)建數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    Python使用Peewee創(chuàng)建數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    Peewee是一個(gè)簡(jiǎn)單小巧的Python ORM,本文主要介紹了Python使用Peewee創(chuàng)建數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Python中.py程序在CMD控制臺(tái)以指定虛擬環(huán)境運(yùn)行

    Python中.py程序在CMD控制臺(tái)以指定虛擬環(huán)境運(yùn)行

    本文主要介紹了Python中.py程序在CMD控制臺(tái)以指定虛擬環(huán)境運(yùn)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 基于Python實(shí)現(xiàn)人機(jī)PK小游戲

    基于Python實(shí)現(xiàn)人機(jī)PK小游戲

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)人機(jī)PK小游戲,簡(jiǎn)單來(lái)說(shuō),就是隨機(jī)生成玩家和敵人的屬性,同時(shí)互相攻擊,直至一方血量小于零,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-06-06
  • Python 權(quán)限控制模塊 Casbin

    Python 權(quán)限控制模塊 Casbin

    這篇文章主要介紹了Python 權(quán)限控制模塊 Casbin,Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪(fǎng)問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪(fǎng)問(wèn)控制模型,更多相關(guān)內(nèi)容感興趣的朋友可以參考下面文章內(nèi)容
    2022-06-06
  • Python使用PIL進(jìn)行JPEG圖像壓縮的簡(jiǎn)易教程

    Python使用PIL進(jìn)行JPEG圖像壓縮的簡(jiǎn)易教程

    本文介紹了如何使用Python編程語(yǔ)言和wxPython圖形用戶(hù)界面庫(kù)進(jìn)行JPEG圖像的壓縮,通過(guò)添加滑塊控件,我們可以調(diào)整壓縮質(zhì)量,并將壓縮后的照片另存為原來(lái)的名稱(chēng)加上后綴"壓縮+質(zhì)量數(shù)字"的新文件,需要的朋友可以參考下
    2023-09-09
  • python將ip地址轉(zhuǎn)換成整數(shù)的方法

    python將ip地址轉(zhuǎn)換成整數(shù)的方法

    這篇文章主要介紹了python將ip地址轉(zhuǎn)換成整數(shù)的方法,涉及Python針對(duì)IP地址的轉(zhuǎn)換技巧,需要的朋友可以參考下
    2015-03-03
  • Python常用標(biāo)準(zhǔn)庫(kù)詳解(pickle序列化和JSON序列化)

    Python常用標(biāo)準(zhǔn)庫(kù)詳解(pickle序列化和JSON序列化)

    這篇文章主要介紹了Python常用標(biāo)準(zhǔn)庫(kù),主要包括pickle序列化和JSON序列化模塊,通過(guò)使用場(chǎng)景分析給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評(píng)論