Python collections.deque双边队列原理详解

Python中的collections模块提供了一种双边队列(deque)的数据结构,它可以在两端进行插入和删除操作,具有比列表更快的操作速度。本文将详细介绍Python collections.deque双边队列的原理和使用方法。

deque(双边队列)的原理

deque(双边队列)是一种具有栈和队列性质的数据结构,因此可以在其中同时进行插入、删除等操作。与列表相比,deque具有如下特点:

  1. deque可以从队列任意一端插入元素。
  2. deque可以从队列任意一端删除元素。
  3. deque具有O(1)的时间复杂度进行插入和删除操作。

deque可以通过以下方式进行创建:

from collections import deque

d = deque()

创建空的deque对象后,我们就可以向其内部插入和删除元素。deque中内置了许多方法,例如append、appendleft、pop、popleft等方法,可以方便地操作deque。

下面我们来分别介绍这些方法:

append和appendleft方法

通过append方法,可以向deque的右侧插入一个元素,而通过appendleft方法,可以向deque的左侧插入一个元素。例如:

from collections import deque

d = deque()
d.append(1)  # 右侧插入1,返回None
d.appendleft(2)  # 左侧插入2,返回None
print(d)  # deque([2, 1])

pop和popleft方法

通过pop方法,可以从deque的右侧弹出一个元素,而通过popleft方法,可以从deque的左侧弹出一个元素。例如:

from collections import deque

d = deque([1, 2, 3])
d.pop()  # 弹出3
d.popleft()  # 弹出1
print(d)  # deque([2])

其他方法

deque内置了许多其他方法,例如rotate、remove等方法,可以方便地进行元素旋转、元素删除等操作。例如:

from collections import deque

d = deque([1, 2, 3])
d.rotate(1)  # 右侧旋转一位,返回None
d.remove(2)  # 删除元素2,返回None
print(d)  # deque([3, 1])

实际应用示例

示例1:使用deque实现窗口大小固定的滑动窗口

deque可以用于实现窗口大小固定的滑动窗口,可以通过左侧弹出和右侧插入的方法实现。例如,我们有一个长度为n的整数数组,给定窗口大小k,在该整数数组中找到所有长度为k的滑动窗口的最大值。代码如下:

from collections import deque

def sliding_window(nums, k):
    n = len(nums)
    if n < k or k <= 0:
        return []
    res = []
    q = deque()
    for i in range(n):
        # 当队列非空且当前元素大于队列末尾元素时,删除队列末尾元素
        while len(q) > 0 and nums[q[-1]] < nums[i]:
            q.pop()
        q.append(i)
        # 当队列中队头元素已经不在滑动窗口内时,删除队头元素
        while q[0] < i + 1 - k:
            q.popleft()
        # 当队列中元素个数等于窗口大小时,将队头元素作为滑动窗口最大值
        if i + 1 >= k:
            res.append(nums[q[0]])
    return res

print(sliding_window([1, 3, -1, -3, 5, 3, 6, 7], 3))  # [3, 3, 5, 5, 6, 7]

上面的代码中,我们通过双端队列来保存滑动窗口中的元素。队列中保存的是元素下标,而不是元素本身,这样可以避免出现重复元素的情况。

示例2:使用deque实现二叉树的层次遍历

deque可以用于实现二叉树的层次遍历,可以通过左侧插入和右侧插入的方法实现。例如,我们有一个二叉树,需要进行层次遍历。代码如下:

from collections import deque

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def level_order(root):
    res = []
    if not root:
        return res
    q = deque([root])
    while q:
        level = []
        size = len(q)
        for _ in range(size):
            node = q.popleft()
            level.append(node.val)
            if node.left:
                q.append(node.left)
            if node.right:
                q.append(node.right)
        res.append(level)
    return res

root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20)
root.right.left = TreeNode(15)
root.right.right = TreeNode(7)
print(level_order(root))  # [[3], [9, 20], [15, 7]]

上面的代码中,我们通过双端队列来保存每一层的节点。先将根节点加入队列,然后循环遍历队列,弹出队列中的节点,并保存其值。将弹出的节点的左右子节点加入队列中,直到队列为空为止。每一层的节点保存在一个列表中,最终将列表保存在结果中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python collections.deque双边队列原理详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python List cmp()知识点总结

    以下是详细讲解“Python中的Listcmp()函数”的完整攻略。 在Python中,可以使用Listcmp()函数来比较两个列表的大小关系。本文将介绍中Listcmp()函数的用法、返回值以及一些示例说明。 Listcmp()函数的用法 Listcmp()函数用于比较两个列表的大小关系。它的语法如下: cmp(list1, list2) 其中,list1…

    python 2023年5月13日
    00
  • Python笔试面试题小结

    Python笔试面试题小结攻略 为什么要学习Python笔试面试题? Python已成为最热门的编程语言之一,越来越多的公司都希望自己的员工能够熟练掌握Python语言。因此,当你面试一个Python编程的岗位时,你必须能够熟练应对笔试与面试中的各种问题,从而更好地展示自己的技能和理解能力。 如何准备Python笔试面试题? 为了准备Python笔试面试题,…

    python 2023年6月5日
    00
  • python实现自动整理文件

    Python实现自动整理文件 文件整理是计算机日常工作中不可或缺的部分,几乎每个人都会遇到需要整理文件夹的情况。Python作为一种优秀的编程语言,可以帮助我们自动化完成文件整理的任务。这里将介绍如何实现Python自动整理文件,以及进行几个文件整理的示例。 1. 检查文件目录 当我们想要整理一个文件夹时,首先要进行的是查看目录中存在哪些文件。在Python…

    python 2023年5月19日
    00
  • python中的sys模块和os模块

    下面我来为你详细讲解 Python 中的 sys 模块和 os 模块。 sys 模块 sys 模块是 Python 内置的一个模块,主要用于读取 Python 解释器的相关信息以及在程序执行过程中动态地修改这些信息。下面是 sys 模块中常用的函数。 模块导入 在使用 sys 模块之前,需要先导入该模块: import sys 获取 Python 解释器信息…

    python 2023年5月30日
    00
  • python re正则匹配网页中图片url地址的方法

    以下是详细讲解“Python re正则匹配网页中图片URL地址的方法”的完整攻略,包括正则表达式的基本语法、使用re模块匹配网页内容的方法和两个示例说明。 正则表达式基本语法 正则表达式是一种用于匹配文本的模式。Python中,我们可以使用re模块来处理正则表达式。正则表达式的基本语法如下: 符号:匹配指定的字符。 字集:匹配指定的字符集。 量词:匹配指定的…

    python 2023年5月14日
    00
  • 如何使用Python在MySQL中使用分组查询?

    在MySQL中,分组查询是一种将数据分组并对每个组执行聚合函数的查询。在Python中,可以使用MySQL连接来执行分组查询。以下是在Python中分组查询的完整攻略,包分组查询的基本语法、使用分组查询的示例以及如何在Python中使用分组查询。 分组查询的基本语法 分组查询的基本语法如下: SELECT column_name(s) FROM table_…

    python 2023年5月12日
    00
  • Python中关于字典的常规操作范例以及介绍

    下面是Python中关于字典的常规操作范例以及介绍的完整攻略。 什么是字典? 字典是一种无序的、可变的数据类型,可以存储任意类型的键和值。字典存储的是键值对,即每个键都与一个值相关联,可以通过键来访问对应的值。在Python中,字典用大括号{}来表示,键值对之间用冒号:隔开,不同键值对之间用逗号,隔开。 1. 字典的常规操作 创建字典 可以使用大括号{}和键…

    python 2023年5月13日
    00
  • Pandas0.25来了千万别错过这10大好用的新功能

    Pandas0.25来了千万别错过这10大好用的新功能 Pandas是Python中常用的数据分析库之一,它提供了很多方便数据操作的功能,如数据预处理、清洗、建模等。Pandas 0.25版本带来了许多新功能,下面我们来一一解析。 1. 新的字符串操作(String Methods) Pandas 0.25中增加了一种可直接在Series和Index上进行的…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部