当前位置: 首页 > news >正文

手机微信网站广州市数商云网络科技有限公司

手机微信网站,广州市数商云网络科技有限公司,重庆企业网站建设公司,嘉祥县网站建设目录 一、二叉堆的操作 二、二叉堆的实现 2.1 结构属性 2.2 堆的有序性 2.3 堆操作 队列有一个重要的变体,叫作优先级队列。和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的。优先级最高的元素在最前&#xff…

目录

一、二叉堆的操作

二、二叉堆的实现

2.1 结构属性

2.2 堆的有序性

2.3 堆操作


队列有一个重要的变体,叫作优先级队列。和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的。优先级最高的元素在最前,优先级最低的元素在最后。因此,当一个元素入队时,它可能直接被移到优先级队列的头部。

实现优先级队列的经典方法是使用叫作二叉堆的数据结构。二叉堆的入队操作和出队操作均可达到O(logn)

二叉堆有两个常见的变体:最小堆(最小的元素一直在队首)与最大堆(最大的元素一直在队首)。

本篇文章实现的是最小堆

一、二叉堆的操作

我们将实现以下基本的二叉堆方法。

  • BinaryHeap()新建一个空的二叉堆。
  • insert(k)往堆中加入一个新元素。
  • findMin()返回最小的元素,元素留在堆中。
  • delMin()返回最小的元素,并将该元素从堆中移除。
  • isEmpty()在堆为空时返回True,否则返回False。
  • size()返回堆中元素的个数。
  • buildHeap(list)根据一个列表创建堆。
>>> from pythonds.trees import BinaryHeap
>>> bh=BinaryHeap()
>>> bh.insert(5)
>>> bh.insert(7)
>>> bh.insert(3)
>>> bh.insert(11)
>>> print(bh.delMin())
3
>>> print(bh.delMin())
5
>>> print(bh.delMin())
7
>>> print(bh.delMin())
11

二、二叉堆的实现

2.1 结构属性

为了使二叉树能够高效地工作,我们利用树的对数性质来表示它。为了保证对数性能,必须维持树的平衡。平衡的二叉树是指,其根节点的左右子树含有数量大致相等的节点。在实现二叉堆时,我们通过创建一颗完全二叉树来维持树的平衡。在完全二叉树中,除了最底层,其他每一层的节点都是满的。在最底层,我们从左往右填充节点。

完全二叉树的另一个有趣之处在于,可以用一个列表来表示它,而不需要采用“列表之列表”或“节点与引用”表示法。由于树是完全的,因此,因此对于在列表中处于位置p的节点来说,它的左子节点正好处于位置2p;同理,右子节点处于位置2p+1。若要找到树中任意节点的父节点,只需使用python的整数除法即可。给定列表中位置n处的节点,其父节点的位置就是n/2。

2.2 堆的有序性

我们用来存储堆元素的方法依赖于堆的有序性。堆的有序性是指:对于堆中任意元素x及其父元素p,p都不大于x。

2.3 堆操作

新建二叉堆:

def __init__(self):self.heapList=[0]self.currentSize=0

接下来实现insert方法。将元素加入列表的最简单、最高效的方法就是将元素追加到列表的末尾。追加操作的优点在于,它能保证完全数的性质,但缺点是很可能会破坏堆的结构性质。不过可以写一个方法,通过比较新元素与其父元素来重新获得堆的结构性质。如果新元素小于其父元素,就将二者交换。

perUp方法:

def perUp(self,i):while i//2>0:if self.heapList[i]<self.heapList[i//2]:tmp=self.heapList[i//2]self.heapList[i//2]=self.heapList[i]self.heapList[i]=tmpi=i//2

向二叉堆中新加元素:

def insert(self,k):self.heapList.append(k)self.currentSize=self.currentSize+1self.perUp(self.currentSize)

正确定义insert方法后,就可以编写delMin方法。既然堆的结构性质要求根节点是树的最小元素,那么查找最小值就很简单。delMin方法的难点在于,如果在移除根节点之后重获堆的结构性质和有序性。可以分两步重建堆。第一步,取出列表中的最后一个元素,将其移到根节点的位置。移动最后一个元素保证了堆的结构性质,但可能破坏二叉堆的有序性。第二步,将新的根节点沿着树推到正确的位置,以重获堆的有序性。

perDown方法和minChild方法:

def percDown(self,i):while (i*2)<=self.currentSize:mc=self.minChild(i)if self.heapList[i]>self.heapList[mc]:tmp=self.heapList[i]self.heapList[i]=self.heapList[mc]self.heapList[mc]=tmpi=mcdef minChild(self,i):if i*2+1>self.currentSize:return i*2else:if self.heapList[i*2]<self.heapList[i*2+1]:return i*2else:return i*2+1

从二叉堆中删除最小的元素:

def delMin(self):retval=self.heapList[1]self.heapList[1]=self.heapList[self.currentSize]self.currentSize=self.currentSize-1self.heapList.pop()self.percDown(1)return retval

根据元素列表构建堆:

def bulidHeap(self,alist):i=len(alist)//2self.currentSize=len(alist)self.heapList=[0]+alist[:]while (i>0):self.percDown(i)i=i-1
http://www.yayakq.cn/news/328481/

相关文章:

  • 网站的话术中国在线商城注册管理平台
  • 做网站需要记哪些代码新产品市场推广方案
  • 毕业设计网站开发任务安排wordpress打开html文件下载
  • 电器网站建设免费咨询白城市网站建设
  • 网站拒绝被百度收录wordpress安卓下载
  • 360网站建设官网个人网站备案做淘宝客
  • 天动力网站开发网站开发检测用户微信号
  • 广州网站排名推广公司如何编写一个app
  • 湖南省城乡与建设厅网站大庆seo推广
  • 浪起科技做的网站怎么样php快速开发平台
  • 网站开发方案书博客做一个app融资需要多少钱
  • 四川大学毕业设计网站电商详情页模板免费套用
  • 淄博百度网站建设网站的建设成本的账务处理
  • 中小型网站建设如何网站怎么做qq微信登陆
  • 游戏下载网站 wordpress郑州网站建设哪家最好
  • 网站建设的心得与体会企业网站推广有哪些
  • 做系统正版win10系统下载网站不会写程序如何建网站
  • 四川省住房和城乡建设厅官网站网网站开发国内外研究现状
  • 昆明网站建设_云南网站建设iis7架设网站
  • seo怎样新建网站注册网址查询
  • 运维网站制作富锦网站
  • 企业宣传网站公司男子做网站
  • 一般网站维护费用网站建设价格西安
  • 快速搭建网站的工具网迎客 网站建设
  • 济南网站建设公司排行高端手机网站 制作公司
  • 深圳福田商城网站建设怎样查网站有没有做CDN加速
  • 网站建设 业务板块名称wordpress代码高亮显示
  • 中卫市建设网站wordpress环保公司主题
  • 做影视网站对服务器要求网站空间邮箱
  • 摄影摄像网站建设广州市市场监督管理局