Python数据结构与算法的双端队列详解

Python数据结构与算法的双端队列详解

双端队列(deque)是一种具有队列和栈的性质的数据结构。与队列和栈不同的是双端队列允许从两端添加和删除元素。Python语言中内置了deque模块,使得在实现双端队列时更加方便快捷。

1.双端队列基本操作

from collections import deque

# 创建双端队列
d = deque()

# 在队首添加元素
d.appendleft(1)

# 在队尾添加元素
d.append(2)

# 在队首删除元素
d.popleft()

# 在队尾删除元素
d.pop()

# 获取队首元素
d[0]

# 获取队尾元素
d[-1]

# 查询队列大小
len(d)

2. 双端队列应用之滑动窗口

在相关数据结构的问题中,滑动窗口经常被用来解决子串或者子数组的问题。比如搜素连续的字串,搜素在窗口中的某些属性是否符合条件等。

示例:给出一组序列和一个整数k,求序列中所有长度为k的子串的最大值。

from collections import deque

def maxSlidingWindow(nums, k):
    # 维护一个双端队列
    d = deque()
    result = []

    for i in range(len(nums)):
        # 只有队列尾部的元素小于等于当前数字,此时该元素变得不重要,弹出它
        while d and nums[d[-1]] <= nums[i]:
            d.pop()

        # 存储数字下标
        d.append(i)

        # 队列头部存储的下标是最大值,判断当前下标是否在合法范围内
        if d[0] < (i - k + 1):
            # 超出范围,弹出头部下标
            d.popleft()

        # 找到了一个子窗口,记录窗口中的最大值
        if i >= k - 1:
            result.append(nums[d[0]])

    return result

使用 maxSlidingWindow([1,3,-1,-3,5,3,6,7], 3) 就能得到结果 [3, 3, 5, 5, 6, 7]

3. 结语

双端队列是一种经常被用到的数据结构,它能够更加有效地解决问题。通过Python内置模块deque,实现双端队列的代码会更加简洁优美。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据结构与算法的双端队列详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构之实现哈希表的分离链接法

    Java数据结构之实现哈希表的分离链接法 哈希表是一种非常常用的数据结构,它将数据存储在一个数组中,每个数组元素都存储着链表中的一个节点,这样可以实现高效的数据存储和查找操作。在哈希表中,我们可以通过哈希函数将关键字映射到数组中的特定位置。 但是,当哈希表的负载因子过高时,就会造成哈希冲突,这意味着两个或更多的关键字映射到了同一个数组位置。一种常见的解决方案…

    数据结构 2023年5月17日
    00
  • Java数据结构之插入排序与希尔排序

    Java数据结构之插入排序与希尔排序 插入排序 插入排序是一种简单而有效的排序算法。它的基本思想是将一个元素插入已经排好序的部分中。插入排序的过程可以用以下伪代码表示: for i=1 to length-1 j = i while j > 0 and array[j-1] > array[j] swap array[j] and array[j…

    数据结构 2023年5月17日
    00
  • C语言数据结构算法基础之循环队列示例

    标题:C语言数据结构算法基础之循环队列示例 1. 简介 循环队列是一种常见的数据结构,它采用固定大小的数组来模拟队列的数据结构,可以高效地处理队列的进出操作。本文将会讲解循环队列的实现原理和示例代码。 2. 循环队列基本原理 循环队列通过两个指针front和rear来实现队列的添加和删除操作。在初始化时,front和rear的初始值都为0。每当数据进入队列时…

    数据结构 2023年5月17日
    00
  • 数据结构之哈夫曼树与哈夫曼编码

    一、背景 编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。但其在传输和存储等情况下编码效率不高。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例] 将百分制的考试成绩转换成五分制的成绩 按顺序分别编码。 按频率分别编码(高频短编码,类似于香…

    算法与数据结构 2023年4月17日
    00
  • 一行python实现树形结构的方法

    想要一行Python实现树形结构,我们需要使用Python的字典数据类型来完成任务。下面是详细的操作步骤: 创建树形结构字典 我们可以用嵌套字典来表示树形结构,我们需要选择其中一个节点作为根节点,并以键值对的形式保存其子节点。最终,我们将根节点作为整个字典的返回值。下面是实现代码: tree = lambda: defaultdict(tree) 插入节点 …

    数据结构 2023年5月17日
    00
  • python数据结构之二叉树的统计与转换实例

    下面是针对“python数据结构之二叉树的统计与转换实例”的详细讲解攻略: 什么是二叉树 二叉树指的是一种树状结构,具有如下特点: 每个节点最多有两个子节点,分别为左子节点和右子节点 左子节点的值比父节点小,右子节点的值比父节点大 二叉树可以是空树,也可以是非空树。 二叉树的遍历 在对二叉树进行操作时,需要对其节点进行遍历。二叉树的遍历方式一般有以下三种: …

    数据结构 2023年5月17日
    00
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 什么是线性表 线性表,简单来说,就是一种有序的数据结构,数据元素起来往往构成一列,比如数组、链表等等。 数组实现线性表 数组是一种容器,它可以存储相同类型的数据元素。使用数组实现线性表,就是将数据元素按照一定的顺序依次存储在数组中。 数组实现线性表的基本思路 定义一个数组,用来存储数据元素; 定义一个变量,用来记录线性表中元…

    数据结构 2023年5月17日
    00
  • C语言 数据结构堆排序顺序存储(升序)

    C语言 数据结构堆排序顺序存储(升序)攻略 1. 堆排序概述 堆排序是一种常见的排序算法,通过构建最大堆或最小堆来实现排序。本文介绍的是使用顺序存储方式实现的最大堆排序,也就是升序排序。 2. 最大堆的定义和实现 最大堆指的是堆结构中父节点的值大于子节点的值,根节点的值最大。对于一棵完全二叉树,若父节点的下标为i,则其左子节点的下标为2i+1,右子节点的下标…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部