python学习笔记-分治算法-leah

分治算法

分治系列主要用于排序,在n次遍历中,使用恰当的算法或者数据结构避开o(n)的内部遍历,巧妙利用数据之间的关系避免重复运算,达到o(nlogn)的复杂度,二分法就是一个经典例子。
其他:线段树 堆 离散化 树状数组 平衡树

堆(heap)

又被称作优先队列,按照元素优先级取出
二叉堆满足两点:

  1. 父节点key总是不小于或不大于任何一个子节点的key,前者称作最大堆,后者称作最小堆。
  2. 每个节点的左右子树都是二叉堆

功能
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)上两个组合起来可以加速,逻辑上先放入再弹出
heapq.heapreplace(heap, item)同为组合,逻辑上先弹出再放入
先放入保证了弹出的那个值比item小

高级用法(暂时没写原理和复杂度)
heapq.merge(*iterables, key=None, reverse=False)把多个有序输入合并排序,输出迭代器
heapq.nlargest(n, iterable, key=None)返回数据集中前n个最大元素组成的列表
heapq.nsmallest(n, iterable, key=None)返回数据集中前n个最小元素组成的列表

python学习笔记-分治算法-leah

线段树与离散化

平衡树

未完待续