为什么C语言风格的语言会使用运行时堆来进行动态内存分配,而数据结构也被称为“堆”?它们之间有关联吗?
为什么C语言风格的语言会使用运行时堆来进行动态内存分配,而数据结构也被称为“堆”?它们之间有关联吗?
唐纳德·克努斯(Donald Knuth)在《计算机程序设计艺术》第三版第一卷第435页中说:
大约从1975年开始,一些作者将可用内存池称为“堆”。
他没有说出是哪些作者,并且没有提供任何具体论文的参考文献,但是他确实说,在与优先队列相关的术语中,“堆”这个词的传统含义是指可用内存池。
它们的名字相同,但它们并不相似(即使在概念上)。内存堆被称为“heap”,就像您将洗衣筐称为“一堆衣服”一样。这个名字用于指示一个有点凌乱的位置,可以任意地分配和释放内存。数据结构(正如您所引用的维基百科链接所指出的那样)是相当不同的。
堆这个数据结构可以追溯到60年代中期;堆这个内存池则是在70年代初出现的。至少在1971年,"heap"(指内存池)这个术语就已经在Wijngaarden关于Algol的讨论中使用过了。
可能最早将"heap"用作数据结构的例子可以在7年前的Williams, J. W. J. 1964. "Algorithm 232 - Heapsort", Communications of the ACM 7(6): 347-348中找到。
实际上,阅读有关内存分配方式的文章(请参见Buddy Blocks)让我想起了数据结构中的堆。
堆数据结构被用于寻找可用内存分配的算法。以下内容摘自http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html。
当调用
new
时,它会开始查找一个适合你请求大小的空闲内存块。假设找到了这样一个内存块,它将被标记为已保留,并返回指向该位置的指针。由于需要在扫描整个内存中查找最小的大于对象大小的空闲块之间做出折衷,或者返回第一个满足所需内存的块,因此有几种算法可以实现这一点。为了提高获取内存块的速度,所以维护了一个类似于二叉树的数据结构,称为堆来存储空闲和保留的内存区域。
Q. 什么是堆(heap)? A. 堆(heap)是一组对象按照顺序堆叠在一起的集合。
回答你的问题: 无论是内存堆还是二叉堆,都使用了相同的概念。 数据以堆(heap)的形式按照程序中编写的顺序存储在内存中,而二叉堆是一种数据结构,遵循相同的概念,以堆(heap)的形式有序地存储数据(数据放在其他数据之上)。 请在评论区告诉我你的想法。