堆及其操作

原创 2016年08月30日 20:04:03

大作业,小作业,插队
有时确实需要插队才可以。

堆,Heap, 正是考虑了适合于特权需求的数据结构。因此,堆也被称作”优先队列”
在C++中有成型的优先队列的数据结构可供调用。

本篇主讲里面的一些算法的有趣操作。

最小堆:任何一个结点的值小于或等于其子节点的值。兄弟结点之间不存在特定的约束关系。小心的是,这里其实也是递归性质。每一棵子树也是堆结构。

最大堆,vice versa.

用途:大键值优先用大顶堆,反之,小键值小顶堆。
完全二叉树。

最大堆的插入:先按照完全二叉树的插入规定次序,增加一个位置,然后,从新增结点的父结点开始,用要插入的元素向下过滤上层结点。,新建个空位置,但我这个新人不一定就坐在这里,向上逐个比较,拉上级下马,自己上位。由于是把上级往下拖,所以叫作向下过滤
再掰开来说就是,父亲需要比儿子,孙子都要大。那么要插入的元素,首先是从基层做起,但是它的能力很强,所以先和上级比比,如果比上级小,老老实实待着,如果比自己的上级大了,那么,对不起,请上级下方到自己的位子,我要当领导。OK,现在踏出第一步了,但并不是结束,外面的世界还很大,需要再往上走走,直到最高级–根为止。

完全二叉树的插入规定次序:指的是在树的最右下方加入结点。

最大堆的删除(首长下台,却拆迁底层百姓的房子):在树中,要取出根节点的元素,即最大值。同时,要删除堆中的一个结点。现在完全二叉树中的最后一个结点家都要被拆了,它怎么办?虽然总书记的位置已经空了,但是它又不能一跃成为一号人物。
于是,这个家已经没了的无业游民以钦察大臣的身份从根开始,与根的两个儿子比较,若是大于这两个儿子,根据堆的性质,此人果然能耐不小,属于大隐隐于市的人物,因为拆迁逼出来了,那么给你做一号人物。若是,比不过这两个儿子,只好选一个牛的继位(儿子中选择一个做首长),你再往下找找。如此循环,直到大于两个儿子的情况出现。则这个无家的结点就有了安排。且因它,让结点有了向上前进的机会,于是,称其为:从根结点开始,用最大堆的最后一个元素向上过滤下层结点。

简单总结,优先队列中的结点插入和删除,是一种可以映射到现实生活中的有趣算法。
首先看插入,就是一个新人的奋斗史,从底层开始往上奋斗,能力有多大,位置就可以做到多高。这是一个公平的社会该给人的进步阶梯。
删除呢,讲的是最高领袖退位,谁来继承的故事。假设最高位的结点(根),我们想删除这个元素值。考虑一个萝卜一个坑的原则,删掉一个元素,也需要删掉一个坑,要是直接删掉最高王座,那整个架构都乱了,所以拆掉了最底层的那个坑。
但是,这也是一个机会,一个重新洗牌的机会。被拆了无家可归了的这个节点,变身为一个钦察大使,开始从最高王位向下找自己的家,在此过程中,它也帮助筛选出来谁是王位的继承人,然后是诸侯的继承人等等。

希望以上的两个过程解析,能够帮助你理解优先队列的操作。
单纯的枯燥的思考,很难觉得这是一个有趣的过程。
以上。

版权声明:本文为博主原创文章,未经博主允许不得转载。

堆的概念及基本操作实现

1.堆的基本概念: 严格来讲,堆有不同的种类,但是我们在算法学习中,主要用的还是二叉堆,而二叉堆有最大堆和最小堆之分。 最大(最小)堆是一棵每一个节点的键值都不小于(大于)其孩子(如果存在)的键值的树...
  • liujian20150808
  • liujian20150808
  • 2016年03月25日 17:28
  • 3483

堆及其操作

1. 背景: 队列,他的一个基本特征是“先进先出”或者说是“先来先服务”,队列中的任何原始都没特权,前面的元素未被处理完,后面的元素只能等待。 但在现实世界中,许多情况需要有特权。例如:有许多客户在一...
  • u013354805
  • u013354805
  • 2016年04月22日 18:08
  • 193

堆操作与堆排序

首先,我们来认识堆:   堆的建立:将给定的序列按层次遍历建立完全二叉树,然后从最后一个非终端结点开始自下向上逐步调整为堆。   这里就有两个重要的操作,shift_up(int t)和shift_d...
  • ACdreamers
  • ACdreamers
  • 2013年11月11日 19:35
  • 3909

【DS】堆操作及其应用

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构。 堆结构的二叉树存储是 最大堆:每个父节点的都大于孩子节点。 最小堆:每个父节点的都小于孩子节点。 代码如下: #include #inclu...
  • Always__
  • Always__
  • 2016年06月04日 22:33
  • 263

数据结构::堆及堆的应用~

【堆】: 1.概念:   堆是一种特殊的树形结构,堆的把每一个节点都有一个值,我们通常所说的堆这种数据结构,指的就是二叉堆。     其实它可以被看做一个完全二叉树。   它的每个节点的子树又可以被...
  • lalu58
  • lalu58
  • 2016年12月31日 13:47
  • 916

算法与数据结构-堆的基本操作C语言实现

数据结构,二叉堆,创建/插入/删除,大顶堆/小顶堆,堆调整算法
  • baidu_35692628
  • baidu_35692628
  • 2017年05月21日 14:30
  • 973

STL 堆heap的用法

STL中并没有把heap作为一种容器组件,heap的实现亦需要更低一层的容器组件(诸如list,array,vector)作为其底层机制。Heap是一个类属算法,包含在algorithm头文件中。虽然...
  • zsc2014030403015
  • zsc2014030403015
  • 2015年05月20日 16:51
  • 898

二项堆与斐波那契堆各个操作时间复杂度

过程 二项堆 斐波那契堆 MAKE_HEAP Θ(1) Θ(1) INSERT Ω(lgn) Θ(1) ...
  • ustcqi
  • ustcqi
  • 2013年01月05日 17:10
  • 1223

堆原理及其基本应用

一、堆的定义:   一个(二叉)堆是一个几乎完全二叉树,它的每个节点都有满足堆的每个特性:如果v和p(v)分别是它的节点和父节点,那么存储在p(v)中的数据项中的键值不小于(或不大于)存储在v中的数据...
  • qq872425710
  • qq872425710
  • 2016年12月02日 21:38
  • 232

最小堆操作(元素的添加和删除)

public interface HeapOperation { int[] addNumber(int[] array, int length, int num); int[] deleteNu...
  • bbewx
  • bbewx
  • 2014年04月19日 18:46
  • 3387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆及其操作
举报原因:
原因补充:

(最多只允许输入30个字)