Swift Collections 中的 Deque 双端队列深度解析

Swift Collections 中的 Deque 双端队列深度解析

swift-collections Commonly used data structures for Swift swift-collections 项目地址: https://gitcode.com/gh_mirrors/sw/swift-collections

什么是 Deque

Deque(发音同"deck")是 Swift Collections 中实现的双端队列数据结构,全称为 Double-Ended Queue。与普通队列只能在一端操作不同,双端队列允许在队列的头部和尾部都进行高效的插入和删除操作。

基本特性

Deque 是一个泛型集合类型,声明方式如下:

import DequeModule

@frozen struct Deque<Element>

它具有以下核心特点:

  1. 有序随机访问集合:支持通过下标快速访问任意位置的元素
  2. 双端高效操作:在头部和尾部插入/删除元素都非常高效
  3. 值语义:遵循 Swift 的值类型语义,修改副本不会影响原集合

基本使用示例

创建一个 Deque 非常简单:

var colors: Deque = ["red", "yellow", "blue"]

访问元素的方式与数组相同:

print(colors[1]) // 输出 "yellow"

插入和删除操作:

colors.insert("green", at: 1)
// ["red", "green", "yellow", "blue"]

colors.remove(at: 2) // 返回 "yellow"
// ["red", "green", "blue"]

与 Array 的性能对比

Deque 和 Array 虽然接口相似,但底层实现和性能特征有显著差异:

| 操作 | Deque 性能 | Array 性能 | |---------------|-----------|-----------| | 头部插入/删除 | O(1) | O(n) | | 尾部插入/删除 | O(1) | O(1) | | 随机访问 | O(1) | O(1) | | 中间插入/删除 | O(n) | O(n) |

Deque 使用环形缓冲区实现,这使得它在两端操作时性能优异,但存储可能不连续。而 Array 使用连续缓冲区,尾部操作很快但头部操作需要移动所有元素。

特有操作方法

除了标准的集合操作外,Deque 提供了一些特有的双端操作方法:

// 在头部添加元素
colors.prepend("orange")

// 移除并返回头部元素
let first = colors.popFirst()

// 移除并返回尾部元素
let last = colors.popLast()

// 在头部添加多个元素
colors.prepend(contentsOf: ["purple", "teal"])

实现细节与优化

  1. 写时复制(Copy-on-Write):多个 Deque 副本共享存储,直到某个副本被修改时才进行复制
  2. 动态扩容:虽然没有公开的 capacity 属性,但提供 reserveCapacity 方法预分配空间
  3. 存储不透明:与 Array 不同,Deque 不直接暴露底层存储,保证实现灵活性

适用场景

Deque 特别适合以下场景:

  1. 需要频繁在集合两端进行操作的场景
  2. 实现先进先出(FIFO)或后进先出(LIFO)数据结构
  3. 需要队列功能但性能要求高于普通数组的场景

注意事项

  1. 与数组一样,访问越界索引会导致运行时错误
  2. 目前不提供 unsafe 访问底层存储的方式
  3. 中间位置的插入/删除操作性能与数组相同,都是 O(n)

通过合理使用 Deque,可以在特定场景下获得比标准 Array 更好的性能表现,特别是在需要双端操作的场合。

swift-collections Commonly used data structures for Swift swift-collections 项目地址: https://gitcode.com/gh_mirrors/sw/swift-collections

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

### Python `collections.deque` 使用方法与实例 #### 创建双端队列 可以利用元组、列表或其他可迭代对象来初始化一个双端队列。 ```python from collections import deque iterable = (1, 2, 3) q = deque(iterable) print(q) # Output: deque([1, 2, 3]) ``` 此段代码展示了如何通过给定的一个三元素组成的元组创建了一个包含这些数值的新双端队列[^1]。 #### 添加元素到两端 支持向左或右两侧追加新项,这使得操作更加灵活高效。 ```python # 向右侧添加单个元素 q.append(4) # 向左侧添加单个元素 q.appendleft(0) print(q) # Output: deque([0, 1, 2, 3, 4]) ``` 上述例子说明了怎样分别在队首和队尾增加新的成员。 #### 移除并返回最左边或最右边的元素 提供了弹出功能可以从任意一端移走项目,并获取其值。 ```python right_most_element = q.pop() left_most_element = q.popleft() print(f"Popped elements are {left_most_element}, {right_most_element}") print(q) # After popping operations the queue looks like this: deque([1, 2, 3]) ``` 这里演示了从两个方向各取出一项的操作过程。 #### 扩展双端队列 允许一次性加入多个元素至指定位置。 ```python new_elements = [5, 6] # 将 new_elements 列表中的所有元素都附加到右侧 q.extend(new_elements) # 或者可以在左侧执行相同动作 another_new_elements = [-1, -2] q.extendleft(another_new_elements[::-1]) print(q) # Now it becomes: deque([-2, -1, 1, 2, 3, 5, 6]) ``` 这段脚本解释了扩展函数的作用以及具体应用方式。 #### 反转顺序 能够轻松改变当前存储序列的方向而不必重新构建整个结构体。 ```python reversed_q = reversed(q) for elem in list(reversed_q): print(elem, end=" ") # This will output all items but starting with last one added. ``` 该部分介绍了反转现有数据排列的方法及其效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余印榕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值