最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 堆和優(yōu)先隊(duì)列的使用詳解

 更新時(shí)間:2019年03月05日 11:02:41   作者:LIUHUANUCAS  
這篇文章主要介紹了python 堆和優(yōu)先隊(duì)列的使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

1.heapq

python里面的堆是通過在列表中維護(hù)堆的性質(zhì)實(shí)現(xiàn)的。這一點(diǎn)與C++中heap一系列的算法類似,底層是通過堆vector的維護(hù)獲取堆的性質(zhì)。

關(guān)于二叉樹

二叉樹的特點(diǎn):

二叉樹是一種存儲(chǔ)數(shù)據(jù)元素的匯集數(shù)據(jù)結(jié)構(gòu)。

二叉樹最重要的性質(zhì)就是樹的高度和樹中可以容納的最大結(jié)點(diǎn)個(gè)數(shù)之間的關(guān)系。樹的高度類似于表長(zhǎng),是從根結(jié)點(diǎn)到其他結(jié)點(diǎn)的最大距離。在長(zhǎng)為n的表里只能容納n個(gè)結(jié)點(diǎn),而在高為h的二叉樹中則可以容納大約2^h個(gè)結(jié)點(diǎn),這是表和樹的最大不同點(diǎn)。

一般的元素插入,如果是按線性順序排列的,那么操作必然需要O(n)的時(shí)間(需要對(duì)n個(gè)數(shù)據(jù)進(jìn)行移位處理),要突破這個(gè)限制,必須考慮其他數(shù)據(jù)結(jié)構(gòu)的組織方式。二叉樹就是一種高效插入的存儲(chǔ)方式。

堆排序利用的是完全二叉樹。

python堆的部分API,其他API查閱文檔python_heap_API和  heapq的源代碼

import heapq
#向堆中插入元素,heapq會(huì)維護(hù)列表heap中的元素保持堆的性質(zhì)
heapq.heappush(heap, item)
#heapq把列表x轉(zhuǎn)換成堆
heapq.heapify(x)
#從可迭代的迭代器中返回最大的n個(gè)數(shù),可以指定比較的key
heapq.nlargest(n, iterable[, key])
#從可迭代的迭代器中返回最小的n個(gè)數(shù),可以指定比較的key
heapq.nsmallest(n, iterable[, key])
#從堆中刪除元素,返回值是堆中最小或者最大的元素
heapq.heappop(heap)

1.1.內(nèi)置類型

從上述源代碼可以看出來,heapq使用的內(nèi)置的小于號(hào),或者類的__lt__比較運(yùn)算來進(jìn)行比較。

def heapq_int():
  heap = []
  #以堆的形式插入堆
  heapq.heappush(heap,10)
  heapq.heappush(heap,1)
  heapq.heappush(heap,10/2)
  [heapq.heappush(heap,i) for i in range(10)]
  [heapq.heappush(heap,10 - i) for i in range(10)]
  #最大的10個(gè)元素
  print heapq.nlargest(10,heap)
  #輸出所有元素
  print [heapq.heappop(heap) for i in range(len(heap))]

1.2.元組類型

元素會(huì)默認(rèn)調(diào)用內(nèi)置比較函數(shù)cmp

def heapq_tuple():
  heap = []
  #向推中插入元組
  heapq.heappush(heap,(10,'ten'))
  heapq.heappush(heap,(1,'one'))
  heapq.heappush(heap,(10/2,'five'))
  while heap:
    print heapq.heappop(heap),
  print

1.2.類類型

類類型,使用的是小于號(hào)_lt_,當(dāng)然沒有重寫但是有其他的比較函數(shù)例如:_le_,_gt_,_cmp_,也是會(huì)調(diào)用的,和小于號(hào)等價(jià)的都可以調(diào)用(測(cè)試了gt),具體的這些操作之間的關(guān)系我也沒有研究過。如果類里面沒有重寫_lt_,會(huì)調(diào)用其他的比較操作符,從源代碼可以看出來,如果沒有_lt_,那么會(huì)調(diào)用_ge_函數(shù)。

所以可以重寫上述的那些函數(shù):

class Skill(object):
  def __init__(self,priority,description):
    self.priority = priority
    self.description = description
  def __lt__(self,other):#operator < 
    return self.priority < other.priority
  def __ge__(self,other):#oprator >=
    return self.priority >= other.priority
  def __le__(self,other):#oprator <=
    return self.priority <= other.priority
  def __cmp__(self,other):
    #call global(builtin) function cmp for int
    return cmp(self.priority,other.priority)
  def __str__(self):
    return '(' + str(self.priority)+',\'' + self.description + '\')'

def heapq_class():
  heap = []
  heapq.heappush(heap,Skill(5,'proficient'))
  heapq.heappush(heap,Skill(10,'expert'))
  heapq.heappush(heap,Skill(1,'novice'))
  while heap:
    print heapq.heappop(heap),
  print 

所以如果要用到自己定義的類型,可以重寫上述函數(shù),就可以使用heapq函數(shù)了。

2.PriorityQueue

PriorityQueue的python源代碼PriorityQueue 

從源代碼可以看出來,PriorityQueue使用的就是heapq來實(shí)現(xiàn)的,所以可以認(rèn)為兩者算法本質(zhì)上是一樣的。當(dāng)然PriorityQueue考慮到了線程安全的問題。

下面給出PriorityQueue的部分API和使用方法。

參考Queue

#向隊(duì)列中添加元素
Queue.put(item[, block[, timeout]])
#從隊(duì)列中獲取元素
Queue.get([block[, timeout]])
#隊(duì)列判空
Queue.empty()
#隊(duì)列大小
Queue.qsize()

2.1.內(nèi)置類型

直接調(diào)用內(nèi)置函數(shù)cmp進(jìn)行比較

try:
  import Queue as Q #python version < 3.0
except ImportError:
  import queue as Q #python3.*
def PriorityQueue_int():
  que = Q.PriorityQueue()
  que.put(10)
  que.put(1)
  que.put(5)
  while not que.empty():
    print que.get(),
  print

2.2.元組類型

def PriorityQueue_tuple():
  que = Q.PriorityQueue()
  que.put((10,'ten'))
  que.put((1,'one'))
  que.put((10/2,'five'))
  while not que.empty():
    print que.get(),
  print

2.2.自定義類型

class Skill(object):
  def __init__(self,priority,description):
    self.priority = priority
    self.description = description
  #下面兩個(gè)方法重寫一個(gè)就可以了
  def __lt__(self,other):#operator < 
    return self.priority < other.priority
  def __cmp__(self,other):
    #call global(builtin) function cmp for int
    return cmp(self.priority,other.priority)
  def __str__(self):
    return '(' + str(self.priority)+',\'' + self.description + '\')'

def PriorityQueue_class():
  que = Q.PriorityQueue()
  skill5 = Skill(5,'proficient')
  skill6 = Skill(6,'proficient6')
  que.put(skill6)
  que.put(Skill(5,'proficient'))
  que.put(Skill(10,'expert'))
  que.put(Skill(1,'novice'))
  while not que.empty():
    print que.get(),
  print

其他的一些方法的使用還是需要參考給出的文檔的。

最后一點(diǎn),讓我比較奇怪的是(可能我并沒有找到),沒有提供像排序函數(shù)那樣,指定比較方法函數(shù),這點(diǎn)和c++有點(diǎn)區(qū)別。

這篇文檔參考:參考文檔

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中將列表轉(zhuǎn)化為鏈表的方法詳解

    Python中將列表轉(zhuǎn)化為鏈表的方法詳解

    這篇文章主要介紹了Python中將列表轉(zhuǎn)化為鏈表的方法詳解,本文的主要問題是輸入一組數(shù),將其按照順序添加到鏈表中,文中提供了解決思路與部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-11-11
  • Pandas DataFrame數(shù)據(jù)存儲(chǔ)格式比較分析

    Pandas DataFrame數(shù)據(jù)存儲(chǔ)格式比較分析

    Pandas 支持多種存儲(chǔ)格式,在本文中將對(duì)不同類型存儲(chǔ)格式下的Pandas Dataframe的讀取速度、寫入速度和大小的進(jìn)行測(cè)試對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-09-09
  • Python中如何用Matplotlib繪制多圖并合并展示

    Python中如何用Matplotlib繪制多圖并合并展示

    這篇文章主要介紹了Python中如何用Matplotlib繪制多圖并合并展示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python學(xué)習(xí)筆記之集合的概念和簡(jiǎn)單使用示例

    Python學(xué)習(xí)筆記之集合的概念和簡(jiǎn)單使用示例

    這篇文章主要介紹了Python學(xué)習(xí)筆記之集合的概念和簡(jiǎn)單使用,涉及Python集合的定義、查找、添加、刪除等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • Python函數(shù)式編程之返回函數(shù)實(shí)例詳解

    Python函數(shù)式編程之返回函數(shù)實(shí)例詳解

    函數(shù)式編程的一個(gè)特點(diǎn)就是,允許把函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù),還允許返回一個(gè)函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python函數(shù)式編程之返回函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Python爬蟲包BeautifulSoup學(xué)習(xí)實(shí)例(五)

    Python爬蟲包BeautifulSoup學(xué)習(xí)實(shí)例(五)

    這篇文章主要為大家詳細(xì)介紹了Python爬蟲包BeautifulSoup的學(xué)習(xí)實(shí)例,具有一定的參考價(jià)值,感興趣的朋友可以參考一下
    2018-06-06
  • django template 模板渲染的實(shí)現(xiàn)

    django template 模板渲染的實(shí)現(xiàn)

    Django 的模板系統(tǒng)旨在使設(shè)計(jì)人員能夠編寫 HTML,同時(shí)以一種安全和靈活的方式動(dòng)態(tài)顯示數(shù)據(jù),本文主要介紹了django template模板渲染的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-01-01
  • Python程序打包成exe的保姆教程

    Python程序打包成exe的保姆教程

    本文主要介紹了使用PyInstaller將Python程序打包成可執(zhí)行文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • python 動(dòng)態(tài)加載的實(shí)現(xiàn)方法

    python 動(dòng)態(tài)加載的實(shí)現(xiàn)方法

    腳本語言都有一個(gè)優(yōu)點(diǎn),就是動(dòng)態(tài)加載,python也有這個(gè)特性。這篇文章主要介紹了python 動(dòng)態(tài)加載的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2017-12-12
  • pandas apply多線程實(shí)現(xiàn)代碼

    pandas apply多線程實(shí)現(xiàn)代碼

    這篇文章主要介紹了pandas apply多線程實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論

卓尼县| 丰镇市| 白城市| 新乐市| 鄂州市| 理塘县| 玉田县| 浦江县| 玉山县| 临桂县| 都兰县| 永寿县| 巴青县| 恩平市| 信宜市| 广德县| 铜陵市| 进贤县| 贵港市| 阳新县| 阿城市| 鄂伦春自治旗| 如东县| 正镶白旗| 阿鲁科尔沁旗| 西和县| 礼泉县| 梨树县| 广水市| 吉林省| 汕尾市| 庆安县| 玛曲县| 武川县| 双流县| 枞阳县| 措勤县| 永春县| 白银市| 栖霞市| 甘泉县|