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

这篇博客探讨了分治算法在排序中的应用,通过利用数据结构如堆、线段树和平衡树来优化算法效率。详细介绍了堆的性质、操作以及Python中heapq库的使用。线段树和平衡树作为分治策略的其他数据结构也得到了提及,但内容未展开详述。
摘要由CSDN通过智能技术生成

分治算法

分治系列主要用于排序,在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)上两个组合起来可以加速,逻辑上先放入再弹出
heap

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值