博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python数据结构——双端队列
阅读量:6955 次
发布时间:2019-06-27

本文共 1846 字,大约阅读时间需要 6 分钟。

双端队列(Deque),是一种类似于队列的元素的有序集合。它拥有两端,队首和队尾,并且元素保持在当前的位置。双端队列的一个不同点就是,添加和删除元素的位置不受限制。新元素可以在队首或者队尾添加。同样地,双端队列中的元素可以从两端弹出。在某种意义上,这种混合的线性结构同时具有栈和队列的性质。

basicdeque.png

很重要的一点,即使双端队列具有栈和队列的特性,但它不会被强制执行的LIFO和FIFO操作。这取决于你做出统一的添加和删除操作。

双端队列的操作如下:

Deque()          创建一个空的双端队列,无参数,返回值是空队列。add_front(item)  在队首添加入一个元素,参数是数据项,无返回值。add_rear(item)   在队尾添加入一个元素,参数是数据项,无返回值。remove_front()   删除队首的元素,不需要参数,返回值是被删除的元素,队列本身有变化。remove_rear()    删除队尾的元素,不需要参数,返回值是被删除的元素,队列本身有变化。is_Empty()       检测队列是否为空。无参数,返回布尔值。size()           返回队列元素的个数。无参数,返回一个整数。

双端队列操作举例:

Deque Operation Deque Contents Return Value
d.isEmpty() [] True
d.addRear(4) [4]
d.addRear('dog') ['dog',4,]
d.addFront('cat') ['dog',4,'cat']
d.addFront(True) ['dog',4,'cat',True]
d.size() ['dog',4,'cat',True] 4
d.isEmpty() ['dog',4,'cat',True] False
d.addRear(8.4) [8.4,'dog',4,'cat',True]
d.removeRear() ['dog',4,'cat',True] 8.4
d.removeFront() ['dog',4,'cat'] True

列表 VS 双端队列

双端队列支持线程安全,在双端队列的任何一端执行添加和删除操作,它们的内存效率几乎相同(时间复杂度为O(1))。

虽然list也支持类似的操作,但是它对定长列表的操作表现很不错,而当遇到pop(0)和insert(0, v)这样既改变了列表的长度又改变其元素位置的操作时,其时间复杂度就变为O(n)了。

在双端队列中最好不使用切片和索引,你可以用popleft和appendleft方法,双端队列对这些操作做了优化。在两端的索引访问时间复杂度为O(1),但是访问中间元素的时间复杂度为O(n),速度较慢,对于快速随机的访问,还是用列表代替。

列表用于随机访问和定长数据的操作,包括切片,而双端队列适用于在两端压入或弹出元素,索引(但不包括切片)的效率可能低于列表。

实现双端队列:

class Deque:    """模拟双端队列"""     def __init__(self):        self.items = []    def isEmpty(self):        return self.items == []    def addFront(self, item):        self.items.append(item)    def addRear(self, item):        self.items.insert(0,item)    def removeFront(self):        return self.items.pop()    def removeRear(self):        return self.items.pop(0)    def size(self):        return len(self.items)

以下是测试代码:

d=Deque()print(d.isEmpty())d.addRear(4)d.addRear('dog')d.addFront('cat')d.addFront(True)print(d.size())print(d.isEmpty())d.addRear(8.4)print(d.removeRear())print(d.removeFront())

转载地址:http://bbtil.baihongyu.com/

你可能感兴趣的文章
为了使用好Apache Flink,Yelp实现了一个连接算法
查看>>
定制你的敏捷方法:以结果为导向
查看>>
Swift 4进入最后阶段,ABI稳定性被推迟
查看>>
专访徐勇州:腾讯云全球化布局势如破竹,构建全球24小时无差别服务︱大咖访谈录...
查看>>
Visual Studio的Node.js插件:NTVS 1.0正式发布
查看>>
DevOps与持续交付实践
查看>>
前百度资深科学家技术分享:大规模机器学习与AutoML
查看>>
AI犯错谁之过?切勿盲目相信之
查看>>
Blazor正式成为Microsoft官方.NET 和WebAssembly项目
查看>>
IBM发布Open Liberty 18.0.0.4,支持MicroProfile 2.1和反应性扩展框架
查看>>
Adaptive Execution让Spark SQL更高效更好用
查看>>
基于Flink的超大规模在线实时反欺诈系统的建设与实践
查看>>
Studio 3T:MongoDB SQL探究
查看>>
Java SE 12扩展Switch语句/表达式完整指南
查看>>
MySQL曝设计缺陷,多家公司被窃取文件
查看>>
CRI Shimv2:一种 Kubernetes 集成容器运行时的新思路
查看>>
Checkly如何借助Terraform实现零宕机部署
查看>>
独家揭秘:微博深度学习平台如何支撑4亿用户愉快吃瓜?
查看>>
Go 1.12发布:改进了运行时性能以及模块支持
查看>>
元数据驱动设计 —— 设计一套用于API数据检索的灵活引擎
查看>>