堆是一种树数据结构,其中较高级别的树总是包含比较低级别更大(或更少,如果它是这样设置的话)的值。“该”堆是程序可用于动态分配的一堆空闲 RAM。它们都被称为“堆”,但一个与另一个有什么关系?
10 回答
老实说,没什么。我想堆这个词只是简单地使用它的日常(非技术)用法,并作为相当好的类比分别应用于这两个概念。
在第一种情况下(树数据结构的含义),描述堆是最合适的,因为“更大”的对象被放置在树的更高位置(其中“更大”由任意键函数确定) - 即有一种堆积较小的物体放在较大的物体上(或较大的物体放在上面,取决于您的想法)。这就是我的解释;最先将堆这个名字应用到这个数据结构上的人都认为这是一个合适的名字,但它只是卡住了。
在第二种情况下(RAM 块),堆的名称可能更明显一些。“堆”在这里只是“以高度任意顺序排列的大量事物的集合”,这似乎与动态分配的内存块一样适用于常见用法。
无论如何,我不会担心你可以在这两个想法之间得出抽象的隐喻相似性。完全分开对待它们,在任何情况下都不会出错。
编辑:似乎基于树的数据结构的名称可能来自抽象代数堆,这在计算机科学中相当普遍。但是,我不想确认或否认这一点......
请参阅此站点,以探索用于内存免费存储的“堆”名称的起源。
他们两个名字一样,就是这样。
那里的“堆”从未被安排为实际的堆数据结构。
堆(数据结构)是这样调用的,因为如果你绘制它,它看起来像一个堆。堆(内存)被称为堆,因为它以某种方式组织但不完全。您在堆上积累数据,但其中可能存在漏洞和违规行为。就好像你把文件放在一堆一样。有时你会从底部移除一个。这有一种堆的形式,即以某种方式组织但不完全。
他们……同名!而已。
两者之间唯一的关系就是“堆”这个名字。
使问题进一步复杂化:在某些系统(例如 Microsoft Windows)上,在内存分配意义上存在多个“堆”。“The ”堆只是默认堆。但是,如果您调用HeapAlloc()
,您可以从您想要子分配的内存分配中选择。
没有什么。没有关系。
来自 answers.com 的定义
堆:一组放置或抛出的东西,一个在另一个之上:一堆放在角落里的脏破布。
由于以无序的方式扔东西的概念形象,这只是基本的命名。正如其他海报指出的那样,堆不是作为堆数据结构组织的。这取决于系统库中的内存分配例程(例如检查 malloc 的工作方式)
堆是一种数据结构,它实际上是具有一些额外属性的完整二叉树。有两种类型的堆:
- 最小堆
- 最大堆
在最小堆中,根在树中具有最低值,当您弹出根时,下一个最低元素位于顶部。要将树转换为堆,我们使用 heapify 算法。它也被称为 C++ 中的优先级队列。通常作为一个有竞争力的程序员,我们将 STL 函数用于堆,这样我们就不必从头开始创建堆。最大堆正好相反,最大堆在根。通常使用堆,因为它具有 O(logN) 时间复杂度来删除和插入元素,因此甚至可以在 10^6 之类的严格约束下工作。
现在我可以理解你在内存中的堆和堆数据结构之间的混淆,但它们是完全不同的东西。数据结构中的堆只是存储数据的一种方式。