分治算法
分治系列主要用于排序,在n次遍历中,使用恰当的算法或者数据结构避开o(n)的内部遍历,巧妙利用数据之间的关系避免重复运算,达到o(nlogn)的复杂度,二分法就是一个经典例子。
其他:线段树 堆 离散化 树状数组 平衡树
堆(heap)
又被称作优先队列,按照元素优先级取出
二叉堆满足两点:
- 父节点key总是不小于或不大于任何一个子节点的key,前者称作最大堆,后者称作最小堆。
- 每个节点的左右子树都是二叉堆
功能
3. 存储成数组,从上到下,从左到右存储。i节点的左右子节点是2i+1,2i+2。
4. 插入:将新插入的节点放在最后,和父节点比较,如果比父节点小,则交换,知道不比父节点小或成为根 o(logn)
5. 删除:只能删除根节点,然后把最后一个节点当成新的根,围绕根进行上下交换 o(logn)
6. 建立堆:从倒数第二层开始遍历,相当于从最下面的父节点开始遍历,保证每一个子树都是一个堆 o(n)
python实现
7.堆是一个list,这里记为heap
import heapq
建最小堆(索引从零开始):
heapq.heapify(heap)
heapq.heappush(heap, item)
heapq.heappop(heap)
heapq.heappushpop(heap,item)上两个组合起来可以加速,逻辑上先放入再弹出
heap