`
eriol
  • 浏览: 408004 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

映射二分堆

阅读更多

引入

 

平常,我们用堆最常见的就是随机地加入元素,随机地取最大值或最小值。这些基本的操作C++中的priority_queue和set都能很好的完成,而且C++中还有一个make_heap,效率较前面2个会更高。而且前面提到的STL都是采用红黑树实现的,很具有稳定性。

 

上面的堆虽然使用简单,但功能上还是有些局限。比如前面提到的堆都只能实现删除最值并没有办法删除指定的值。而且一般STL中的堆都是采用数据存储的,但父亲节点和儿子节点需要交换时,我们需要拷贝所存储的整个数据单元,但数据单元较大时,拷贝的效率就低了。因此,这里介绍一中堆变种,在堆中引入了映射。

 

 

定义

 

具有映射功能的堆称为双向映射堆。又因其常常是在二分堆的基础上实现的,所以也常常叫映射二分堆。

 

 

特点

 

映射二分堆其与普通堆不同的地方是它的节点并不真正保存数据单元本身,而是保存指向数据单元的指针。因此当需要交换父子节点的数据时,我们可以避免拷贝大量数据所消耗的时间。同时,映射二分堆还有一个功能,它可以根据具体的数据单元的索引来删除该单元,即使这个单元不是堆中的最值。

 

 

实现

 

在实现时,我们可以用数字 H[] 存储数据单元,然后采用数组 ind[i]=j 表示 H[i] 存放的是索引号为 j 的数据,mp[j]=i 表示索引索引为 j 的元素存储在 H[i] 中,这样就可以实现双向映射了。

 

(1) 插入堆,我们只需要将插入的元素放在堆尾,然后逐级调整,这个跟普通的二叉堆一样。

 

(2) 删除最值,也跟普通的二叉堆一样,先把堆中最后一个元素与最值对调,然后再调整堆。

 

(3) 删除固定索引的数据单元。我们可以先通过 mp[i],找到其在 H[] 中存放的位置,然后该位置的值跟堆最后一个元素对调,接着从该节点向上调整堆,此时得到的还不是一个正规的堆,还需要重新堆整个堆进行从上到下调整。

 

上面的3中操作中都提到了堆的调整,在调整时我们不需要拷贝数据单元,我们只需交换 ind[] 和 mp[] 2个数组的对应值即可。

 

 

原文地址:http://www.zhongsisi.com/stack-and-mapping/

分享到:
评论

相关推荐

    在一堆数中取得前K个最大最小的数的方法

    - **快速更新最大权重**:在搜索引擎中需要实时更新权重的情况下,可以考虑使用映射二分堆或堆排序的方法,使得更新操作的时间复杂度为O(logn)。 #### 总结 针对“在一堆数中取得前K个最大最小的数”的问题,存在...

    电子政务-极板流道分堆并接式电堆构成的直接甲醇燃料电池.zip

    二、极板与流道 在DMFC中,极板是关键组件之一,通常由双极板构成,分别位于电池单元的两侧。它们不仅起到电导体的作用,还负责引导反应气体(如氧气和甲醇蒸汽)的流动,以及排除产生的水。流道设计在极板上,用于...

    哈工程本科算法实验-二分搜索

    二分搜索,也被称为二分查找,是一种在有序数组中查找特定元素的高效算法。它主要利用了分治的思想,将问题...同时,这个算法是许多高级数据结构和算法的基础,如二分插入排序、二分堆、以及在平衡二叉搜索树中查找等。

    二分法排序

    需要注意的是,这个程序没有实现二分排序,因为二分排序通常是指使用二分插入排序或者二分堆等方法对数据进行排序。二分插入排序是一种改进的插入排序,它利用二分查找将新元素插入到已排序的序列中的合适位置;二...

    易语言文本栈

    易语言文本栈源码,文本栈,IsEmpty,IsFull,Clear,Push,Pop,Remalloc,设置内存增量,GetTop,GetBottom,GetData,进入许可区,离开许可区,InitializeCriticalSection_临界许可,DeleteCriticalSection_临界许可,...

    完整视频-coursera公开课 普林斯顿算法 ⅠⅡ部分

    相关主题有:并查集算法,二分查找,栈,队列,背包,插入排序,选择排序,希尔排序,快速排序, 三切分快排,归并排序,堆排序,二分堆,二分查找树,红黑树,链表,线性哈希表,Graham扫描,kd树。 算法(二)...

    7.2.2 折半查找1

    此外,二分查找也是许多高级算法的基础,如二分插入排序、二分堆、最小堆、最大堆等。 总结来说,二分查找是一种高效的查找策略,通过不断地将查找区间对半分割,快速定位目标值的位置。其效率高、适用场景明确,是...

    二年级奥数A版举一反三.doc

    - 例12: 趣味数学二的题目主要涉及策略和逻辑推理,如如何有效地组织运输和分配资源。 这些题目旨在训练二年级学生的基础数学技能,提升他们的逻辑思维能力,为更高年级的数学学习打下坚实基础。通过解决这些问题...

    【精品】小学数学《二年级下册数学》同步试题及答案解析 (12).doc

    第九题通过分堆萝卜的问题,引导学生理解整数的组合,找出不同的取法。 9. 路径选择: 第十题是一个简单的路径问题,通过组合不同的路线,培养孩子的路径规划意识。 10. 商品选择与计算: 第十一题涉及到商品选择...

    数据结构AS2实现 V1.0

    这里是部分数据结构的实现, 二分堆, 红黑树, Splay树, 图, Set, Collection ...还有很多未完成. 之后有时间的话继续完成其他数据结构实现, 并实现一些经典算法. 比如回溯, 动态规划, 贪心算法, 分治策略 ... 作为对...

    二年级奥数【举一反三】全.doc

    4. **最大值问题**:第九周的题目8、9和10,是关于分堆问题,寻找最多一堆能有多少物品,需要考虑分配的不等性和限制条件。 5. **最优化问题**:比如第十周的题目5、6,要求在有限的资源下(船只数量、车辆容量)...

    二年级奥数【举一反三】.doc

    6. 分堆问题:如30颗珠子分成双数堆,或者萝卜、小棒的分配,需要找到满足条件的组合。 7. 最大值问题:如12根萝卜分成数量不等的4堆,最多的一堆有多少,通过尝试和比较找出最大值。 8. 乘车问题:如多人过河的...

    五年级数学上册第十三周答案往年数学知识点.doc

    这个题目就属于此类,具体来说是关于不相同数量物体的分堆问题。在这个问题中,目标是将15个乒乓球分成四堆,且每堆的乒乓球数量不同。解决这类问题通常需要逻辑推理和有序列举的技巧。 首先,我们要理解“有序列举...

    ACM常用模板及北大ACM-题型分类代码

    二分堆是一种基于完全二叉树的数据结构,可以高效地实现优先队列。它有两种类型:最小堆和最大堆。在ACM竞赛中,二分堆常用于实现Dijkstra算法等最优化问题。 ### 4. 多边形与几何计算 多边形切割和半平面交是几何...

    acm常用模版

    3. 二分堆(binary heap):二分堆是一种特殊的完全二叉树,满足堆属性(父节点的值总是大于或等于其子节点)。二分堆常用于实现优先队列,提供O(logn)的插入和删除操作。常见的有最大堆和最小堆。 4. 多边形:...

    订单分批matlab代码-Unpaired-GANCS:当该对(x,y)无法用于训练时,此代码实现了从欠采样测量y中恢复图像x的功能。但是,我

    订单分批matlab代码不成对的GANCS 当该对(x,y)无法用于训练时,此代码实现了从欠采样测量y中恢复图像x的功能。 但是,我们有少量来自y的地面真相x。 这对于通常无法访问所有器官的高分辨率数据的医学成像应用而言...

    第二单元教案.docx

    【第二单元:表内除法(一)】 本单元主要教授学生关于除法的基本概念,旨在让学生理解除法运算的含义以及如何运用除法解决实际问题。教学目标分为知识与技能、过程与方法以及情感、态度和价值观三个层面。 知识与...

    2004年4月-2009年4月全国高等教育自学考试概率论与数理统计二.pdf

    14. **组合概率**:围棋子分堆的问题涉及到组合计数,可以使用排列组合的方法来计算概率。 15. **二项分布的性质**:X服从二项分布时,其平方Y的分布可以通过转换得出。 16. **分布函数的转换**:知道X的分布函数...

    人工智能-分硬币问题

    《人工智能在分硬币问题中的应用——以极大极小的递归搜索算法为例》 人工智能在游戏策略领域有着广泛的应用,其中一个经典的实例便是解决“分硬币问题”。在这个问题中,参与者试图通过最优策略来分割硬币,以获得...

Global site tag (gtag.js) - Google Analytics