python的deque(雙向)隊列詳解


首先 python的隊列有很多種

Python標准庫中包含了四種隊列,分別是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque

可見deque是標准庫collections中的

這其中最好用的是deque 

以下是deque的基本操作:

 

它的操作很像list 同時 

相比於list實現的隊列,deque實現擁有更低的時間和空間復雜度。list實現在出隊(pop)和插入(insert)時的空間復雜度大約為O(n),deque在出隊(pop)和入隊(append)時的時間復雜度是O(1)。
所以deque更有優越性 而且deque既可以表示隊列 又可以表示棧 實在是太方便了


下面再介紹幾個黑科技:
 
deque支持in操作符(真沒想到這都支持)
1 q = collections.deque([1, 2, 3, 4])
2 print(5 in q)  # False
3 print(1 in q)  # True

還可以順逆時針旋轉...

# 順時針
q = collections.deque([1, 2, 3, 4])
q.rotate(1)
print(q)  # [4, 1, 2, 3]
q.rotate(1)
print(q)  # [3, 4, 1, 2]

# 逆時針
q = collections.deque([1, 2, 3, 4])
q.rotate(-1)
print(q)  # [2, 3, 4, 1]
q.rotate(-1)
print(q)  # [3, 4, 1, 2]

還可以復制一個新隊列:

>>> d.append(1)
>>> d.append(2)
>>> d
deque([1, 2])
>>> d1 = d.copy()
>>> d1
deque([1, 2])

 

 值得注意的是 deque里邊的形式是列表形式

 

所以 試試extend呢?

>>> d.clear()
>>> d.append(1)
>>> d.extend([3,4,5])
>>> d
deque([1, 3, 4, 5])

能不能從左邊extend呢:

>>> d.clear()
>>> d.append(1)
>>> d.extendleft([3,4,5])
>>> d
deque([5, 4, 3, 1])

還有index:查找索引位置

>>> d.extend(["a","b","c","d","e","f"])
>>> d
deque(['a', 'b', 'c', 'd', 'e','f'])
>>> d.index("c",0,4) #指定查找的區間
2
>>> d.index("c",0,2)
error...

其他的一些基本操作 還有

d.insert(位置,元素)  在指定位置插入元素

d.remove(元素)   刪除指定元素

d.reverse   隊列翻轉

 

接下來我們做一道面試題:

題目

請定義一個隊列並實現函數 max_value 得到隊列里的最大值,要求函數max_value、push_back 和 pop_front 的均攤時間復雜度都是O(1)。

若隊列為空,pop_front 和 max_value 需要返回 -1

輸入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
輸出: [null,null,null,2,1,2]

既然時間復雜度是O(1)

我們用deque就好

代碼:

from collections import deque
class MaxQueue:

    def __init__(self):
        self.d = deque()

    def max_value(self) -> int:
        return max(self.d) if self.d else -1

    def push_back(self, value: int) -> None:
        self.d.append(value)

    def pop_front(self) -> int:
        return self.d.popleft() if self.d else -1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM