版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
郭炜信息科学技术学院数据结构与算法
(Python描述)课程信息教材数据结构与算法(Python语言实现)郭炜编著清华大学出版社另有Java语言实现,C/C++语言实现两本,均已经由清华大学出版社出版堆信息科学技术学院3堆的定义、性质
和用途信息科学技术学院美国鹅颈湾堆的定义堆(二叉堆)是一个完全二叉树堆中任何结点优先级都高于或等于其两个子结点(什么叫优先级高可以自己定义)一般将堆顶元素最大的堆称为大根堆(大顶堆),堆顶元素最小的堆称为小根堆(小顶堆)5一个“大”就算优先级高的堆:(即大根堆)堆的存储用列表存放堆。堆顶元素下标是0。下标为i的结点,其左右子结点下标分别为i*2+1,i*2+2。6堆的性质堆顶元素是优先级最高的(啥叫优先级高可自定义)堆中的任何一棵子树都是堆往堆中添加一个元素,并维持堆性质,复杂度O(log(n))删除堆顶元素,剩余元素依然维持堆性质,复杂度O(log(n))在无序列表中原地建堆,复杂度O(n)7堆的作用堆用于需要经常从一个集合中取走(即删除)优先级最高元素,而且还要经常往集合中添加元素的场合(堆可以用来实现优先队列)可以用堆进行排序,复杂度O(nlog(n)),且只需要O(1)的额外空间,称为“堆排序”。递归写法需要o(log(n))额外空间,非递归写法需要O(1)额外空间。8堆的操作信息科学技术学院泰国普吉岛最南端堆的操作:添加一个元素10假设堆存放在列表a中,长度为n添加元素x到列表a尾部,使其成为a[n]若x优先级高于其父结点,则令其和父结点交换,直到x优先级不高于其父结点,或x被交换到a[0],变成堆顶为止。此过程称为将x"上移"x停止交换后,新的堆形成,长度为n+1堆的操作:添加一个元素117104258361971042589613在堆中添加新元素9堆的操作:添加一个元素1291042587613堆的操作:添加一个元素13显然,交换过程中,以x为根的子树,一直都是个堆由于n个元素的完全二叉树高度为log2(n+1)向上取整,每交换一次x就上升一层,因此上移操作复杂度O(log(n)),即添加元素复杂度O(log(n))堆的操作:删除堆顶元素14假设堆存放在列表a中,长度为n将a[0]和a[n-1]交换将a[n-1]删除(pop)记此时的a[0]为x,则将x和它两个儿子中优先级较高的,且优先级高于x的那个交换,直到x变成叶子结点,或者x的儿子优先级都不高于x为止。将此整个过程称为将x"下移"x停止交换后,新的堆形成,长度为n-1下移过程复杂度为O(log(n)),因此删除堆顶元素复杂度O(log(n))堆的操作:删除堆顶元素157104258371676425837110堆的操作:删除堆顶元素16764258371784256371堆的操作:删除堆顶元的操作:删除堆顶元素18重要结论:如果a[i]的两棵子树都是堆,则对a[i]的下移操作完成后,以新a[i]为根的子树会形成堆。堆的操作:建堆19一个长度为n的列表a,要原地将a变成一个堆方法:将a看作一个完全二叉树。假设有H层。根在第0层,第H-1层都是叶子对第H-2层的每个元素执行下移操作对第H-3层的每个元素执行下移操作.....对第0层的元素执行下移操作堆即建好。复杂度O(n)。证明较难,略堆的操作:建堆2085642177329无序列表85642197327堆的操作:建堆218562419732795624781327堆的操作:建堆225962478132789624751327堆的操作:建堆2389624771325堆的应用信息科学技术学院香港维多利亚湾堆的应用:哈夫曼编码树的构造25Initialleaves{(A8)(B3)(C1)(D1)(E1)(F1)(G1)(H1)}Merge{(A8)(B3)({CD}2)(E1)(F1)(G1)(H1)}Merge{(A8)(B3)({CD}2)({EF}2)(G1)(H1)}Merge{(A8)(B3)({CD}2)({EF}2)({GH}2)}Merge{(A8)(B3)({CD}2)({EFGH}4)}Merge{(A8)({BCD}5)({EFGH}4)}Merge{(A8)({BCDEFGH}9)}Finalmerge{({ABCDEFGH}17)}哈夫曼编码树不唯一用"堆"存放结点集合,便于快速取出最小权值的两个结点,以及加入合并后的新结点。堆的应用:堆排序26将待排序列表a变成一个堆(O(n))将a[0]和a[n-1]交换,然后对新a[0]做下移,维持前n-1个元素依然是堆。此时优先级最高的元素就是a[n-1]将a[0]和a[n-2]交换,然后对新a[0]做下移,维持前n-2个元素依然是堆。此时优先级次高的元素就是a[n-2]......直到堆的长度变为1,列表a就按照优先级从低到高排好序了。整个过程相当不断删除堆顶元素放到a的后部。堆顶元素依次是优先级最高的、次高的....一共要做n次下移,每次下移O(log(n)),因此总复杂度O(nlog(n))堆排序27如果用递归实现,需要O(log(n))额外栈空间(递归要进行log(n)层)。如果不用递归实现,需要O(1)额外空间。堆的实现信息科学技术学院美国胡佛水坝堆的实现29classHeap: def__init__(self,array=[],less=lambdax,y:x<y): #若x为堆顶元素,y为堆中元素,则less(x,y)为True #默认情况下,小的算优先级高#i的儿子是2*i+1和2*i+2 self._a=array[:]#array是列表 self._size=len(array) self._less=less #less是比较函数
self.makeHeap() deftop(self): returnself._a[0] defpop(self): #删除堆顶元素 tmp=self._a[0] self._a[0]=self._a[-1] self._a.pop() self._size-=1 self._goDown(0)#_goDown是下移操作,将a[0]下移 returntmp堆的实现30 defappend(self,x): #往堆中添加x self._size+=1 self._a.append(x) self._goUp(self._size-1)#_goUp是上移 def_goUp(self,i):#将a[i]上移
#只在append的时候调用,不能直接调用或在别处调用
#被调用时,以a[i]为根的子树,已经是个堆
ifi==0: return f=(i-1)//2#父结点下标 ifself._less(self._a[i],self._a[f]): self._a[i],self._a[f]=self._a[f],self._a[i] self._goUp(f)#a[f]上移堆的实现31 def_goDown(self,i):#a[i]下移
#前提:在a[i]的两个子树都是堆的情况下,下移
ifi*2+1>=self._size:#a[i]没有儿子
return L,R=i*2+1,i*2+2 ifR>=self._sizeorself._less(self._a[L],self._a[R]): s=L else: s=R #上面选择小的儿子 ifself._less(self._a[s],self._a[i]): self._a[i],self._a[s]=self._a[s],self._a[i] self._goDown(s)堆的实现32 defmakeHeap(self):#建堆 i=(self._size-1-1)//2#i是最后一个叶子的父亲 forkinrange(i,-1,-1): self._goDown(k) defheapSort(self):#建好堆之后调用,进行堆排序 foriinrange(self._size-1,-1,-1): self._a[i],self._a[0]=self._a[0],self._a[i] self._size-=1 self._goDown(0) self._a.reverse() returnself._a堆的实现33#下面是堆的用法,不是堆内部的代码importrandomdefheapSort(a,less):#对列表a进行堆排序,哪个less哪个排在前面
hp=Heap(a,less) returnhp.heapSort()s=[iforiinrange(17)]random.shuffle(s)print(s)h=heapSort(s,lambdax,y:x<y)print(h)Python中的堆信息科学技术学院新疆安集海大峡谷python中的堆:heapq35要importheapqheapq中的函数:heapq.heapify(s) 将列表s变成一个堆heapq.heappush(s,item) 往已经是堆的列表s里面添加元素itemheapq.heappop(s) 取出并返回堆顶元素。s必须已经是个堆(注意:会减少s长度)heapq.heapreplace(s,item)取出并返回堆顶元素,并将元素item加入堆(s还是个堆,
长度不变)heapq.nlargest(n,s,key) 返回序列s中的最大n个元素构成的列表。key是关键字函数heapq.nsmallest(n,s,key) 返回序列s中的最小n个元素构成的列表#key(x)<key(y)x就比y小python中的堆:heapq36importheapqheapq.heapify(s) 将列表s变成一个堆heapq.heappush(s,item) 往已经是堆的s里面添加元素itemheapq.heappop(s) 弹出堆顶元素(会减少s长度)......defheapsort(iterable):#iterable是个序列#函数返回一个列表,内容是iterable中元素排序的结果 h=[] forvalueiniterable: h.append(value) heapq.heapify(h) return[heapq.heappop(h)foriinrange(len(h))]不便之处:没有设定排序规则的机会。如果要形成大元素在顶的整数堆,只能取相反数进堆。出来的时候再取相反数python中的堆:heapq37importheapqdefheapSorted(iterable):#iterable是个序列#函数返回一个列表,内容是iterable中元素排序的结果,不会改变iterable h=[] forvalueiniterable: h.append(value) heapq.heapify(h) ret
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027届广西壮族梧州市藤县数学六上期末预测试题含解析
- 2027届山西省忻州市忻府区某校数学六年级第一学期期末质量检测模拟试题含解析
- 2027届西藏日喀则地区拉孜县四上数学期末达标检测模拟试题含解析
- 漳州市漳浦县2027届数学六年级第一学期期末检测试题含解析
- 广东省肇庆市四会市星华学校2027届四年级数学第一学期期末调研试题含解析
- 2027届攀枝花市米易县四年级数学第一学期期末质量跟踪监视试题含解析
- 江西省上饶市玉山县2027届六年级数学第一学期期末质量跟踪监视模拟试题含解析
- 2027届甘肃省金昌市数学六上期末经典模拟试题含解析
- 2026汽车制造行业市场深入研究及未来方向和资本动向分析报告
- 2026中国智能机器人旅游行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030美国社区银行倒闭潮成因分析与区域性金融风险预警报告
- 2026年甘肃庆阳宁县直事业单位选聘24人笔试模拟试题及答案详解
- 2026年压力容器考试题库及答案
- 2026年山西省运城市重点学校初一入学数学分班考试试题及答案
- 2026年江苏省高考地理试卷(含答案及解析)
- cnas-cl01-2018检验和校准实验室能力认可准则培训
- 2026年初级注册安全工程师《安全生产法律法规》真题(附答案解析)
- 口腔科医疗质量控制标准
- 碳九MSDS安全技术说明
- 消毒管理办法、消毒技术规范培训试题(附答案)
- 2023年评审准则版机动车检验机构质量手册
评论
0/150
提交评论