堆栈和队列

242 阅读2分钟

堆 heap

可以迅速找到一堆数中的最大 或 最小值的数据结构。

image.png

分类

  • 小顶堆 (Mix Heap) 根节点最小
  • 大顶堆 (Max Heap) 根节点最大
  • 二叉堆
  • 斐波那契堆

大顶堆复杂度

find-max O(1) delete-max O(logN) insert(create) O(1) 或 O(logN)

  • 斐波那契堆 可以达到O(1)

小顶堆 (Mix Heap):

  • 最小的元素在堆顶 元素越小优先级越高
  • 父节点要比左右孩子小

大顶堆(Max Heap)

  • 最大的元素在堆顶 元素越大优先级越高
  • 父节点要比左右孩子大

二叉堆(大顶)

通过完全二叉树实现(所有的叶子节点都是满的)

特性

  • 是一个完全树
  • 任意节点的值 总是 >=其儿子节点的值

image.png

image.png

二叉搜索树

使用场景: 经常一个数一个数的进来 一遍输入 一边还要消费

堆栈(stack)

基本概念

  • FILO 先进后出
  • 可以是数组、链表
  • 元素是无序的

复杂度

  • 添加、删除、插入O(1)
  • 查询O(n)

栈是一种后进先出(LIFO)的数据结构,它可以用于以下场景:

  1. 函数调用栈:在程序执行过程中,每个函数的调用都会将当前的上下文压入栈中,当函数返回时,会将上下文弹出栈。这种方式可以保证函数调用的顺序和代码的结构。
  2. 表达式求值:例如,计算后缀表达式。
  3. 括号匹配:例如,检查一个字符串中的括号是否匹配。
  4. 深度优先搜索:在图论中,深度优先搜索算法可以使用栈来实现。
  5. 撤销操作:例如,文本编辑器中的撤销操作。
  6. 状态机:状态机可以使用栈来存储状态转换的过程。

队列(queue)

基本概念

  • FIFO 先入先出

复杂度

  • 添加、删除、插入O(1)
  • 查询O(n)

双端队列(dqueue)

  • 两边都可以 出入

优先队列

  • 时间复杂度

    • 添加、删除、插入O(1)
    • 查询O(log n) 按照元素的优先级取出
  • 底层实现机制

    • 堆(heap)
    • 二叉搜索树 bst(binary search tree)
  • 如果任意节点的左子树不能为空, 左子树所有的节点的值 小于 根节点的值

  • 如果任意节点的右子树不能为空, 右子树所有的节点的值 大于 根节点的值

各种数据结构和算法的时间复杂度

练习题

分析Queue和PriorityQueue的源码

  • 理解
  • 实现原理

docs.python.org/zh-cn/2.7/l…

docs.python.org/zh-cn/2.7/l…