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

Python算法應(yīng)用實(shí)戰(zhàn)之隊(duì)列詳解

 更新時(shí)間:2017年02月04日 08:58:43   作者:安生  
隊(duì)列是一種先進(jìn)先出(First-In-First-Out,F(xiàn)IFO)的數(shù)據(jù)結(jié)構(gòu)。隊(duì)列被用在很多地方,比如提交操作系統(tǒng)執(zhí)行的一系列進(jìn)程、打印任務(wù)池等,一些仿真系統(tǒng)用隊(duì)列來(lái)模擬銀行或雜貨店里排隊(duì)的顧客。下面就介紹了Python中隊(duì)列的應(yīng)用實(shí)戰(zhàn),需要的可以參考。

隊(duì)列(queue)

隊(duì)列是先進(jìn)先出(FIFO, First-In-First-Out)的線性表,在具體應(yīng)用中通常用鏈表或者數(shù)組來(lái)實(shí)現(xiàn),隊(duì)列只允許在后端(稱為rear)進(jìn)行插入操作,在前端(稱為front)進(jìn)行刪除操作,隊(duì)列的操作方式和堆棧類似,唯一的區(qū)別在于隊(duì)列只允許新數(shù)據(jù)在后端進(jìn)行添加(摘錄維基百科)。

如圖所示

隊(duì)列的接口

一個(gè)隊(duì)列至少需要如下接口:

接口 描述
add(x) 入隊(duì)
delete() 出隊(duì)
clear() 清空隊(duì)列
isEmpty() 判斷隊(duì)列是否為空
isFull() 判斷隊(duì)列是否未滿
length() 隊(duì)列的當(dāng)前長(zhǎng)度
capability() 隊(duì)列的容量

然而在Python中,可以使用collections模塊下的deque函數(shù),deque函數(shù)提供了隊(duì)列所有的接口,那么先讓我門看看隊(duì)列deque函數(shù)提供了那些API把:

collections.deque是雙端隊(duì)列,即左右兩邊都是可進(jìn)可出的

方法 描述
append(x) 在隊(duì)列的右邊添加一個(gè)元素
appendleft(x) 在隊(duì)列的左邊添加一個(gè)元素
clear() 從隊(duì)列中刪除所有元素
copy() 返回一個(gè)淺拷貝的副本
count(value) 返回值在隊(duì)列中出現(xiàn)的次數(shù)
extend([x..]) 使用可迭代的元素?cái)U(kuò)展隊(duì)列的右側(cè)
extendleft([x..]) 使用可迭代的元素?cái)U(kuò)展隊(duì)列的右側(cè)
index(value, [start, [stop]]) 返回值的第一個(gè)索引,如果值不存在,則引發(fā)ValueError。
insert(index, object) 在索引之前插入對(duì)象
maxlen 獲取隊(duì)列的最大長(zhǎng)度
pop() 刪除并返回最右側(cè)的元素
popleft() 刪除并返回最左側(cè)的元素
remove(value) 刪除查找到的第一個(gè)值
reverse() 隊(duì)列中的所有元素進(jìn)行翻轉(zhuǎn)
rotate() 向右旋轉(zhuǎn)隊(duì)列n步(默認(rèn)n = 1),如果n為負(fù),向左旋轉(zhuǎn)。

現(xiàn)在我們?cè)赑ython中測(cè)試下這些個(gè)API的使用吧。

入隊(duì)操作

>>> from collections import deque
# 創(chuàng)建一個(gè)隊(duì)列
>>> q = deque([1])
>>> q
deque([1])
# 往隊(duì)列中添加一個(gè)元素
>>> q.append(2)
>>> q
deque([1, 2])
# 往隊(duì)列最左邊添加一個(gè)元素
>>> q.appendleft(3)
>>> q
deque([3, 1, 2])
# 同時(shí)入隊(duì)多個(gè)元素
>>> q.extend([4,5,6])
>>> q
deque([3, 1, 2, 4, 5, 6])
# 在最左邊同時(shí)入隊(duì)多個(gè)元素
>>> q.extendleft([7,8,9])
>>> q
deque([9, 8, 7, 3, 1, 2, 4, 5, 6])

出隊(duì)操作

# 刪除隊(duì)列中最后一個(gè)
>>> q.pop()
6
>>> q
deque([9, 8, 7, 3, 1, 2, 4, 5])
# 刪除隊(duì)列中最左邊的一個(gè)元素
>>> q.popleft()
9
>>> q
deque([8, 7, 3, 1, 2, 4, 5])

其他的API

# 清空隊(duì)列
>>> q
deque([8, 7, 3, 1, 2, 4, 5])
>>> q.clear()
>>> q
deque([])
# 判斷隊(duì)列是否為空
>>> not q
True
# 獲取隊(duì)列最大長(zhǎng)度
>>> q = deque([1,2], 10)
>>> q.maxlen
10
# 查看某個(gè)元素出現(xiàn)的次數(shù)
>>> q.extend([1,2,1,1])
>>> q.count(1)
4
# 查看當(dāng)前隊(duì)列長(zhǎng)度
>>> len(q)
6
# 判斷隊(duì)列是否滿了
>>> q.maxlen == len(q)
False
# 隊(duì)列元素反轉(zhuǎn)
>>> q = deque([1,2,3,4,5],5)
>>> q.reverse()
>>> q
deque([5, 4, 3, 2, 1], maxlen=5)
# 查看元素對(duì)應(yīng)的索引
>>> q.index(1)
4
# 刪除匹配到的第一個(gè)元素
>>> q
deque([5, 4, 3, 2, 1], maxlen=5)
>>> q.remove(5)
>>> q
deque([4, 3, 2, 1], maxlen=5)
# 元素位置進(jìn)行旋轉(zhuǎn)
>>> q
deque([4, 3, 2, 1], maxlen=5)
>>> q.rotate(2)
>>> q
deque([2, 1, 4, 3], maxlen=5)
>>> q.rotate(1)
>>> q
deque([3, 2, 1, 4], maxlen=5)
# 使用負(fù)數(shù)
>>> q.rotate(-1)
>>> q
deque([2, 1, 4, 3], maxlen=5)

實(shí)例

二項(xiàng)式系數(shù)

題目

編寫程序,求二項(xiàng)式系數(shù)表中(楊輝三角)第K層系列數(shù)

 1
 1 1
 1 2 1
1 3 3 1
......

思路

  1. 把第K行的系數(shù)存儲(chǔ)在隊(duì)列中
  2. 依次出隊(duì)K層的系數(shù)(每行最后一個(gè)1不出隊(duì)),并推算K+1層系數(shù),添加到隊(duì)尾,最后在隊(duì)尾添加一個(gè)1,便變成了k+1行。

解決代碼

#!/use/bin/env python
# _*_ coding:utf-8 _*_
from collections import deque
def yanghui(k):
 """
 :param k: 楊輝三角中第幾層
 :return: 第K層的系數(shù)
 """
 q = deque([1]) # 創(chuàng)建一個(gè)隊(duì)列,默認(rèn)從1開(kāi)始
 for i in range(k): # 迭代要查找的層數(shù)
 for _ in range(i): # 循環(huán)需要出隊(duì)多少次
  q.append(q.popleft() + q[0]) # 第一個(gè)數(shù)加上隊(duì)列中第二個(gè)數(shù)并賦值到隊(duì)列末尾
 q.append(1) # 每次查找結(jié)束后都需要在隊(duì)列最右邊添加個(gè)1
 return list(q)
result = yanghui(3)
print(result)

劃分無(wú)沖突子集

題目

某動(dòng)物園搬家,要運(yùn)走N種動(dòng)物,老虎與獅子放在一起會(huì)大家,大象與犀牛放在一個(gè)籠子會(huì)打架,野豬和野狗放在一個(gè)籠子里會(huì)打架,現(xiàn)在需要我們?cè)O(shè)計(jì)一個(gè)算法,使得裝進(jìn)同一個(gè)籠子的動(dòng)物互相不打架。

思路

  1. 把所有動(dòng)物按次序入隊(duì)
  2. 創(chuàng)建一個(gè)籠子(集合),出隊(duì)一個(gè)動(dòng)物,如果和籠子內(nèi)動(dòng)物無(wú)沖沖突則添加到該籠子,有沖突則添加到隊(duì)尾,等待進(jìn)入新籠子
  3. 由于隊(duì)列先進(jìn)先出的特性,如果當(dāng)前出隊(duì)動(dòng)物的index不大于前一個(gè)出隊(duì)動(dòng)物的index,說(shuō)明當(dāng)前隊(duì)列中所有動(dòng)物已經(jīng)嘗試過(guò)進(jìn)入且進(jìn)入不了當(dāng)前籠子,此時(shí)創(chuàng)建信的籠子(集合)

解決代碼

#!/use/bin/env python
# _*_ coding:utf-8 _*_
from collections import deque
def division(m, n):
 """
 :param m: 沖突關(guān)系矩陣
 :param n: 幾種動(dòng)物
 :return: 返回一個(gè)棧,棧內(nèi)包含了所有的籠子
 """
 res = [] # 創(chuàng)建一個(gè)棧
 q = deque(range(n)) # 初始化隊(duì)列,里面放著動(dòng)物的序號(hào)
 pre = n # 前一個(gè)動(dòng)物的下標(biāo)
 while q:
 cur = q.popleft() # 從隊(duì)頭出隊(duì)一個(gè)動(dòng)物
 if pre >= cur: # 是否需要?jiǎng)?chuàng)建籠子
  res.append([]) # 創(chuàng)建一個(gè)籠子
 # 當(dāng)前的動(dòng)物是否與籠子內(nèi)的動(dòng)物有沖突
 for a in res[-1]: # 迭代棧中最頂層的籠子
  if m[cur][a]: # 有沖突
  q.append(cur) # 重新放入隊(duì)列的尾部
  break
 else: # 當(dāng)前動(dòng)物和當(dāng)前籠子中的所有動(dòng)物沒(méi)沖突
  res[-1].append(cur) # 當(dāng)前動(dòng)物放入最上面的籠子中
 pre = cur # 當(dāng)前變成之前的
 return res
N = 9
R = { # 沖突對(duì)應(yīng)關(guān)系表
 (1, 4), (4, 8), (1, 8), (1, 7),
 (8, 3), (1, 0), (0, 5), (1, 5),
 (3, 4), (5, 6), (5, 2), (6, 2), (6, 4),
}
M = [[0] * N for _ in range(N)] # 沖洗關(guān)系矩陣M,0代表不沖突
for i, j in R:
 M[i][j] = M[j][i] = 1 # 1代表沖突
result = division(M, N)
print(result)

數(shù)字變換

題目

對(duì)于一對(duì)正整數(shù)a,b,對(duì)a只能進(jìn)行加1,減1,乘2操作,問(wèn)最少對(duì)a進(jìn)行幾次操作能得到b?

例如:

  1. a=3,b=11: 可以通過(guò)322-1,3次操作得到11;
  2. a=5,b=8:可以通過(guò)(5-1)*2,2次操作得到8;

思路

本題用廣度優(yōu)先搜索,尋找a到b狀態(tài)遷移最短路徑,對(duì)于每個(gè)狀態(tài)s,可以轉(zhuǎn)換到撞到s+1,s-1,s*2:

  1. 把初始化狀態(tài)a入隊(duì);
  2. 出隊(duì)一個(gè)狀態(tài)s,然后s+1,s-1,s*2入隊(duì);
  3. 反復(fù)循環(huán)第二步驟,直到狀態(tài)s為b;

解決代碼

#!/use/bin/env python
# _*_ coding:utf-8 _*_
from collections import deque
def atob(a, b):
 """
 :param a: 開(kāi)始的數(shù)字
 :param b: 最終轉(zhuǎn)換之后的數(shù)字
 :return: 最小匹配的次數(shù)
 """
 q = deque([(a, 0)]) # a=當(dāng)前數(shù)字,0=操作的次數(shù)
 checked = {a} # 已經(jīng)檢查過(guò)的數(shù)據(jù)
 while True:
 s, c = q.popleft()
 if s == b:
  break
 if s < b: # 要計(jì)算的數(shù)小于計(jì)算之后的數(shù)字
  if s + 1 not in checked: # 如果要計(jì)算的數(shù)字+1不在已檢查過(guò)的數(shù)據(jù)集合中
  q.append((s + 1, c + 1)) # 要計(jì)算的數(shù)+1,轉(zhuǎn)換次數(shù)+1
  checked.add(s + 1) # 把計(jì)算過(guò)的數(shù)添加到checked集合中
  if s * 2 not in checked:
  q.append((s * 2, c + 1))
  checked.add(s * 2)
 if s > 0: # 要計(jì)算的數(shù)大于0
  if s - 1 not in checked:
  q.append((s - 1, c + 1))
  checked.add(s - 1)
 return q.popleft()[-1]
result = atob(3, 11)
print(result)

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。

相關(guān)文章

  • python3使用GUI統(tǒng)計(jì)代碼量

    python3使用GUI統(tǒng)計(jì)代碼量

    這篇文章主要為大家詳細(xì)介紹了python3使用GUI統(tǒng)計(jì)代碼量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • python字符串,數(shù)值計(jì)算

    python字符串,數(shù)值計(jì)算

    這篇文章主要介紹了python字符串,數(shù)值計(jì)算的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • python提示No module named images的解決方法

    python提示No module named images的解決方法

    這篇文章主要介紹了python提示No module named images的解決方法,是Python程序設(shè)計(jì)中經(jīng)常遇到的問(wèn)題,本文給出了具有針對(duì)性的解決方法,需要的朋友可以參考下
    2014-09-09
  • 離線安裝Pyecharts的步驟以及依賴包流程

    離線安裝Pyecharts的步驟以及依賴包流程

    這篇文章主要介紹了離線安裝Pyecharts的步驟以及依賴包流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • python字典一鍵多值實(shí)例代碼分享

    python字典一鍵多值實(shí)例代碼分享

    在本篇文章里小編給大家整理了關(guān)于python字典一鍵多值實(shí)例代碼以及相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。
    2019-06-06
  • 詳細(xì)介紹pandas的DataFrame的append方法使用

    詳細(xì)介紹pandas的DataFrame的append方法使用

    這篇文章主要介紹了詳細(xì)介紹pandas的DataFrame的append方法使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 使用python處理一萬(wàn)份word表格簡(jiǎn)歷操作

    使用python處理一萬(wàn)份word表格簡(jiǎn)歷操作

    這篇文章主要介紹了使用python處理一萬(wàn)份word表格簡(jiǎn)歷操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • 對(duì)python修改xml文件的節(jié)點(diǎn)值方法詳解

    對(duì)python修改xml文件的節(jié)點(diǎn)值方法詳解

    今天小編就為大家分享一篇對(duì)python修改xml文件的節(jié)點(diǎn)值方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python docx庫(kù)用法示例分析

    Python docx庫(kù)用法示例分析

    這篇文章主要介紹了Python docx庫(kù)用法,結(jié)合實(shí)例形式分析了docx庫(kù)相關(guān)的docx文件讀取、文本添加、格式操作,需要的朋友可以參考下
    2019-02-02
  • django中靜態(tài)文件配置static的方法

    django中靜態(tài)文件配置static的方法

    我們可以使用Template 設(shè)置我們的網(wǎng)頁(yè),同時(shí),一個(gè)完美的網(wǎng)頁(yè)需要css,js,image 等靜態(tài)文件的支持,這篇文章主要介紹了django中靜態(tài)文件配置static的方法,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評(píng)論