堆 heap
可以迅速找到一堆数中的最大 或 最小值的数据结构。
分类
- 小顶堆 (Mix Heap) 根节点最小
- 大顶堆 (Max Heap) 根节点最大
- 二叉堆
- 斐波那契堆
大顶堆复杂度
find-max O(1) delete-max O(logN) insert(create) O(1) 或 O(logN)
- 斐波那契堆 可以达到O(1)
小顶堆 (Mix Heap):
- 最小的元素在堆顶 元素越小优先级越高
- 父节点要比左右孩子小
大顶堆(Max Heap)
- 最大的元素在堆顶 元素越大优先级越高
- 父节点要比左右孩子大
二叉堆(大顶)
通过完全二叉树实现(所有的叶子节点都是满的)
特性
- 是一个完全树
- 任意节点的值 总是 >=其儿子节点的值
二叉搜索树
使用场景: 经常一个数一个数的进来 一遍输入 一边还要消费
堆栈(stack)
基本概念
- FILO 先进后出
- 可以是数组、链表
- 元素是无序的
复杂度
- 添加、删除、插入O(1)
- 查询O(n)
栈是一种后进先出(LIFO)的数据结构,它可以用于以下场景:
- 函数调用栈:在程序执行过程中,每个函数的调用都会将当前的上下文压入栈中,当函数返回时,会将上下文弹出栈。这种方式可以保证函数调用的顺序和代码的结构。
- 表达式求值:例如,计算后缀表达式。
- 括号匹配:例如,检查一个字符串中的括号是否匹配。
- 深度优先搜索:在图论中,深度优先搜索算法可以使用栈来实现。
- 撤销操作:例如,文本编辑器中的撤销操作。
- 状态机:状态机可以使用栈来存储状态转换的过程。
队列(queue)
基本概念
- FIFO 先入先出
复杂度
- 添加、删除、插入O(1)
- 查询O(n)
双端队列(dqueue)
- 两边都可以 出入
优先队列
-
时间复杂度
- 添加、删除、插入O(1)
- 查询O(log n) 按照元素的优先级取出
-
底层实现机制
- 堆(heap)
- 二叉搜索树 bst(binary search tree)
-
如果任意节点的左子树不能为空, 左子树所有的节点的值 小于 根节点的值
-
如果任意节点的右子树不能为空, 右子树所有的节点的值 大于 根节点的值
各种数据结构和算法的时间复杂度
练习题
分析Queue和PriorityQueue的源码
- 理解
- 实现原理