首页 > 编程语言 >【高贵的数据结构】学了python你一定要知道的知识之deque双端队列

【高贵的数据结构】学了python你一定要知道的知识之deque双端队列

时间:2024-11-19 15:43:29浏览次数:3  
标签:deque maxlen python 双端 元素 队列 print dq

deque 是 Python 的 collections 模块提供的一种 双端队列 数据结构,支持从队列的两端快速添加和删除元素,时间复杂度为 (O(1))。与列表相比,它在高效的双端操作中有明显优势。

1. 导入 deque

from collections import deque

2. 初始化 deque

创建空队列
dq = deque()
print(dq)  # deque([])
从可迭代对象初始化
dq = deque([1, 2, 3, 4])
print(dq)  # deque([1, 2, 3, 4])
设置最大长度
dq = deque([1, 2, 3], maxlen=5)
print(dq)  # deque([1, 2, 3], maxlen=5)
  • maxlen 限制队列长度,超出后从另一端自动移除元素。

3. 主要方法

(1)添加元素
  • append(item):在右端添加元素。
  • appendleft(item):在左端添加元素。
dq = deque([1, 2, 3])
dq.append(4)
dq.appendleft(0)
print(dq)  # deque([0, 1, 2, 3, 4])
(2)删除元素
  • pop():移除并返回右端元素。
  • popleft():移除并返回左端元素。
dq = deque([1, 2, 3, 4])
print(dq.pop())       # 4
print(dq.popleft())   # 1
print(dq)             # deque([2, 3])
(3)扩展队列
  • extend(iterable):在右端扩展队列。
  • extendleft(iterable):在左端扩展队列(反向添加)。
dq = deque([1, 2])
dq.extend([3, 4])
dq.extendleft([0, -1])
print(dq)  # deque([-1, 0, 1, 2, 3, 4])
(4)旋转队列
  • rotate(n):将队列右移 (n) 步(负值为左移)。
dq = deque([1, 2, 3, 4])
dq.rotate(2)
print(dq)  # deque([3, 4, 1, 2])
dq.rotate(-1)
print(dq)  # deque([4, 1, 2, 3])
(5)访问队列
  • 索引访问:可直接用索引访问队列中的元素。
dq = deque([1, 2, 3])
print(dq[0])  # 1
print(dq[-1]) # 3
(6)清空队列
  • clear():清空队列。
dq = deque([1, 2, 3])
dq.clear()
print(dq)  # deque([])
(7)队列长度
  • len(deque):获取队列长度。
dq = deque([1, 2, 3])
print(len(dq))  # 3

4. maxlen 限制

maxlendeque 的特殊功能,限制队列长度。如果长度超过 maxlen,新添加的元素会自动移除另一端的元素。

dq = deque([1, 2, 3], maxlen=3)
dq.append(4)  # 超出长度限制,左端元素被移除
print(dq)     # deque([2, 3, 4])
dq.appendleft(0)
print(dq)     # deque([0, 2, 3])

5. 时间复杂度

  • 添加和删除(两端):(O(1))
  • 随机访问:(O(n))(不如列表高效)
  • 遍历:(O(n))

6. 常见用法场景

队列

用于先进先出的队列:

dq = deque()
dq.append(1)
dq.append(2)
dq.append(3)
print(dq.popleft())  # 1
print(dq.popleft())  # 2
滑动窗口

deque 实现固定大小的滑动窗口:

dq = deque(maxlen=3)
for i in range(1, 6):
    dq.append(i)
    print(list(dq))  # 窗口内的元素
# 输出:
# [1]
# [1, 2]
# [1, 2, 3]
# [2, 3, 4]
# [3, 4, 5]
回文检测

检查字符串是否为回文:

def is_palindrome(s: str) -> bool:
    dq = deque(s)
    while len(dq) > 1:
        if dq.popleft() != dq.pop():
            return False
    return True

print(is_palindrome("radar"))  # True
print(is_palindrome("hello"))  # False

deque 的灵活性和高效性能,使它在实现队列、双端队列、滑动窗口等场景中非常常用。

标签:deque,maxlen,python,双端,元素,队列,print,dq
From: https://blog.csdn.net/qq_17405059/article/details/143885784

相关文章