大根堆的建立(python)
来源:互联网 发布:猪八戒淘宝刷销量 编辑:程序博客网 时间:2024/04/28 01:35
二叉堆是一个近似的完全二叉树。
最大堆的性质是对每个节点来说,节点的值大于等于孩子节点的值。
用数组来保存堆这一数据结构,因为堆接近于完全二叉树,所以用数组实现堆结构,不会浪费很大的内存空间。下标为i的节点,左孩子的下标为2*i,右孩子的下标为2*i+1。
维护堆的性质,对节点i来说,键值为key(i),key(i)要大于等于key(i*2),key(i*2+1),下标i*2是节点i的左孩子节点下标,i*2+1是节点的右孩子节点下标。最大堆的每个子树都要是最大堆。所以要维护每个节点,对节点i来说,如果小于左孩子节点或者小于右孩子节点,需要与其进行交换。策略是:选择左孩子节点和右孩子节点的较大值与i进行交换。然后递归的处理孩子节点。
建堆:用数组a[]存储堆,数组下标就是节点的编号。由完全二叉树的性质可知,数组的后半部分就是叶子节点,所以我们只要维护数组的前半部分最大堆的性质。
下面是python实现的维护堆和建立最大堆的代码,建立最大堆的时间复杂度为O(n)。
python 的函数,对于列表和字典来说是传址,对于整型,字符串等是参数传值。
最大堆可以进行堆排序,时间复杂度为O(nlog)。最小堆用于实现优先队列。
最小堆的性质与最大堆的性质相反,实现也相似。
def make_heap(a,n,i): l = 2*i r = 2*i + 1 largest = i if l <= n and a[l] > a[i]: largest = l else: largest = i if r <= n and a[r] > a[largest]: largest = r if largest != i: tmp = a[i] a[i] = a[largest] a[largest] = tmp make_heap(a,n,largest)def build_heap(a,n): for i in range(n/2,0,-1): make_heap(a,n,i)if __name__ == '__main__': a = [0,1,2,3,4,5,6,7,8] build_heap(a,8) print a
阅读全文
0 0
- 大根堆的建立(python)
- Python二维数组的建立
- Python学习笔记(11)--模块的建立以及调用
- Python环境的建立(windows平台)
- Python建立SSH连接的方法
- Python建立SSH连接的方法
- Python建立最简单的web服务器
- Python建立SSH连接的方法
- Mac Python建立简单的本地服务器
- 建立Anaconda的多Python环境
- 建立一个中文名字的文件夹Python
- kd树建立的python实现
- python的mysql数据库建立表
- [python相关]用Python建立最简单的web服务器
- Fragment的建立(-)
- 页面的建立(-)
- 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络
- python django 学习(一)数据库 目的根据已有BBS建立新的网站步骤
- C#中(int)、Conver.Toint32()、int.Parse()三种类型转换方式的区别与联系--C#基础知识
- 拷贝构造函数----深拷贝、浅拷贝
- C# 面试图解
- 仿微信朋友圈发表图片拖拽和删除功能
- 联发科初赛第二题《情报破译》
- 大根堆的建立(python)
- Selenium&&PhantomJS获取网站中的JS返回的数据
- hdfs网络拓扑与机架感知
- 【C++】联发科初赛第一题《最大序列和》
- javawebday04(dom dhtml概述 获取打开页面的源页面)
- 学习笔记2 只有长得帅的人才能看
- 3378: [Usaco2004 Open]MooFest 狂欢节
- HTML标签
- JSTL 标签 ------ 核心标签库