热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c–在arr[0]处使用root的二进制堆有什么好处?

我正在数组arr上写一个二进制堆.除叶节点之外的每个节点都有两个子节点.根可以是arr[0]或arr[1].在Whyinaheapimplementedbyarraytheinde

我正在数组arr上写一个二进制堆.

除叶节点之外的每个节点都有两个子节点.

根可以是arr [0]或arr [1].

在Why in a heap implemented by array the index 0 is left unused?接受的答案说arr [1]更快.

但是在该答案下面的一条评论说,大多数实施都是在arr [0].

将根置于arr [0]有什么好处?

解决方法:

我是回答你关联的问题的人.

在具有基于0的数组的语言中创建具有arr [1]根的二进制堆是愚蠢的.不是因为它浪费了大量的空间,而是因为它造成了不必要的混乱代码而没有任何好处.

为什么代码混乱?因为它破坏了我们作为程序员多年来一直工作的基本规则:数组从0开始.如果你想要一个包含100个项目的数组,你就这样声明:

int a[100];

除了二进制堆.因为在1973年将一些原始二进制堆代码从Algol(其数组基于1)转换为C(基于0的数组)的白痴没有改变子计算和父计算的大脑,我们最终得到了在这一个特殊情况下,您需要分配101个项目:

int a[101];

当有人在不一致的情况下打电话给那个人时,他想出了一个似是而非的表演论点.

是的,在计算左子索引的代码中有一个额外的增量指令,在计运算符的父索引时有一个额外的减量指令.在二进制堆的更广泛的上下文中,这两个指令对使用堆的任何程序的运行时间没有实际的区别.没有.如果差异是可测量的,那肯定会有噪音.您的计算机上还有许多其他事情会对您的程序性能产生更大的影响.

如果您正在编写需要高性能优先级队列的程序,那么您首先要使用二进制堆做什么?如果你真的要在你的优先级队列中存储大量的东西,你可能应该使用像Pairing堆这样的东西,它会胜过二进制堆,虽然内存成本更高.

C STL priority_queue,Java PriorityQueue和python的heapq都使用基于0的二进制堆.编写这些包的人了解性能方面的考虑因素.如果使用基于1的二进制堆获得显着的性能提升,他们就会这样做.他们使用0-based堆应该告诉你,基于1的堆的任何性能增益都是虚幻的.

有关更完整的讨论,请参见http://blog.mischel.com/2016/09/19/but-thats-the-way-weve-always-done-it/.


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了如何通过维持两个堆来获取一个数据流中的中位数。通过使用最大堆和最小堆,分别保存数据流中较小的一半和较大的一半数值,可以保证两个堆的大小差距为1或0。如果数据流中的数量为奇数,则中位数为较大堆的最大值;如果数量为偶数,则中位数为较大堆的最大值和较小堆的最小值的平均值。可以使用优先队列来实现堆的功能。本文还提供了相应的Java代码实现。 ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
author-avatar
ya的sky
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有