算法描述

完全二叉树,父节点值比子节点大。(不保证左节点值大于右节点值。)

新元素插入时要满足的条件

为了满足完全二叉树的条件,新加入的元素一定要放在最下一层作为叶节点,并填补在由左至右的第一个空格,也就是把新元素插入在底层vector的end()处。

用到的技巧

这里有一个小技巧,如果用array存储所有节点,并且将array的#0位置的元素保留(即下标从1开始),那么当完全二叉树的某个节点位移array的i处时,其左节点必位于array的2i处,其右节点必位于array的2i+1处,其父节点必位于”i/2”处(i/2取整)。用array实现完全二叉树的方式称为隐式表述法(implicit representation)。

SGI  STL  push_heap算法实现

SGI STL计算父节点与左右节点的方式与上面的技巧略有不同,但原理类似(可以认为SGI中下标从1开始)。

算法核心:

// 以下這組 push_back()不允許指定「大小比較標準」
template <class RandomAccessIterator, class Distance, class T>
void __push_heap(RandomAccessIterator first, Distance holeIndex,Distance topIndex, T value) {Distance parent = (holeIndex - 1) / 2;    // 找出父節點while (holeIndex > topIndex && *(first + parent) < value) {// 當尚未到達頂端,且父節點小於新值(於是不符合 heap 的次序特性)// 由於以上使用 operator<,可知 STL heap 是一種 max-heap(大者為父)。*(first + holeIndex) = *(first + parent); // 令洞值為父值holeIndex = parent; // percolate up:調整洞號,向上提昇至父節點。parent = (holeIndex - 1) / 2;    // 新洞的父節點}    // 持續至頂端,或滿足 heap 的次序特性為止。*(first + holeIndex) = value;  // 令洞值為新值,完成安插動作。
}

 
接口函数:
 
template <class RandomAccessIterator, class Compare>
inline void push_heap(RandomAccessIterator first, RandomAccessIterator last,Compare comp) {__push_heap_aux(first, last, comp, distance_type(first), value_type(first));
}

template <class RandomAccessIterator, class Compare, class Distance, class T>
inline void __push_heap_aux(RandomAccessIterator first,RandomAccessIterator last, Compare comp,Distance*, T*) {__push_heap(first, Distance((last - first) - 1), Distance(0), T(*(last - 1)), comp);
}

转载于:https://www.cnblogs.com/helloweworld/archive/2013/01/05/2845528.html

push_heap算法 (即满足max-heap条件,最大值在根节点)相关推荐

  1. 分治算法求n个元素的最大值和最小值

    分治算法求n个元素的最大值和最小值 算法思想:         1.将n个数均分为s1和s2         2.分别求解s1和s2的最大值和最小值            s1最大值为max1,s1最 ...

  2. 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

    题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...

  3. 主题:基于改进粒子群算法的含源配电网静态重构 利用IEEE-33节点系统进行仿真计算

    主题:基于改进粒子群算法的含源配电网静态重构 利用IEEE-33节点系统进行仿真计算 以网络最小损耗为目标函数 基于改进粒子群算法进行重构 可以加入不同数量的分布式电源 包含M文件.模型图.程序框图以 ...

  4. Java数据结构习题:编写一个max(),接受首节点作为参数,返回链表中数值最大的结点的值(假设所有数据都是正整数,如果链表为空则返回0)

    编写一个max(),接受首节点作为参数,返回链表中数值最大的结点的值(假设所有数据都是正整数,如果链表为空则返回0) 核心代码: // 编写一个max(),接受首节点作为参数,返回链表中数值最大的结点 ...

  5. python中的max_row_基于row max定位条件列值

    这是一个更大的df_data1000x150的简单版本Date A B C D A' B' C' D' 31/01/2017 47 15 45 40 10 7 12 8 28/02/2017 22 3 ...

  6. java 最大递减数_算法--求先递增后递减数组最大值的下标

    题目: 给定数组a, 里面的元素先严格递增后严格递减, 求最大值元素的下标. 分析: 看到这道题目的时候, 我脑海中首先浮现出现的是爬山坡. "先递增"就是爬坡, "后递 ...

  7. 粒子群算法和遗传算法求多元函数的最大值、最小值对比

    目录 前言 1.粒子群算法寻优 1.1 求目标函数最大值 1.2 求目标函数最小值 2.遗传算法寻优 前言 个人认为粒子群算法和遗传算法思想都很接近,都是一个通过对比去寻找最优解的过程,如果对比我比你 ...

  8. 算法--获取生成数组中的最大值(Kotlin)

    题目 给你一个整数 n .按下述规则生成一个长度为 n + 1 的数组 nums : nums[0] = 0 nums[1] = 1 当 2 <= 2 * i <= n 时,nums[2 ...

  9. PyTorch max()函数取最大值

    max() 函数 本人在复现 LeNet5 网络进行 MNIST 数据集的训练,在模型预测阶段,需要用到 max() 函数进行结果的处理.将模型输出的 fc7 层的 10 个结果,变为最后的一个最大概 ...

最新文章

  1. 强烈推荐一款Python可视化神器!
  2. Expression Web 3 安装问题
  3. python调用gitlab api自动合并分支_Python3 如何使用 GitLab API 进行批量的合并分支
  4. Python中字符串使用方法总结(学习笔记)
  5. 你还在为20倍的连麦成本发愁吗?
  6. UnityShader RenderTypeQueue 渲染顺序
  7. 安卓跑linux程序_Android下运行Linux可执行程序
  8. spring mvc学习(37):JavaEE-JSP基础-EL表达式和JSTL标签库(Taglibs)
  9. 一条消息未发,粉丝已破千万
  10. 115配额怎么增加_笔电、平板接口少怎么办,ORICO八合一多功能扩展坞助你一臂之力...
  11. keyshot怎么让物体发光_户外发光字的防水措施怎么做,不亮了怎么修。
  12. 西单大悦城苹果店4s_“神秘列车”复活!金融街-西单,3号免费专线今天回归...
  13. 9206 1225 mybank系统 随堂笔记
  14. 摩拜单车又涨价了!真的要骑不起了
  15. 吴恩达神经网络和深度学习-学习笔记-23-快速搭建你的第一个系统原型,然后迭代
  16. @Bean和@Componet区别
  17. android 时区表以及设置系统时区
  18. 用最少的箭射爆全部气球
  19. X取个好的英文名字(男性)
  20. Python杀死了Excel

热门文章

  1. JSP_通过表格显示数据库的信息
  2. 实现DFS之“骨头的诱惑”
  3. 腾讯面试--原来bitmap也可以用来排序
  4. 大型网站核心要素--伸缩性
  5. 汇编中类似数组的寻址方式
  6. C#之windows桌面软件第十课:电脑ADC值显示(上位机)(单通道显示)
  7. 类的构造函数和析构函数详解
  8. mybaits十六:使用choose标签实现分支选择
  9. 线程安全: 互斥锁和自旋锁(10种)
  10. RHEL/CentOS 下安装yum源地址汇集---不定期更新