为什么两个不同的概念都被称为“堆”?
为什么用于C风格语言的动态内存分配的运行时堆和数据结构都称为“堆”? 有一些关系吗?
唐纳德克努特说(计算机程序设计艺术,第三版,第1卷,第435页):
几位作者于1975年开始将可用内存池称为“堆”。
他没有说出哪些作者,也没有提及任何具体的论文,但确实表示,与优先级队列有关的术语“堆”的使用是传统意义上的单词。
他们有相同的名字,但他们确实不相似(甚至在概念上)。 内存堆被称为堆,就像您将洗衣篮称为“衣服堆”一样。 这个名字用来表示一个有点混乱的地方,可以随意分配和释放内存。 数据结构(如您参考的维基百科链接所指出的)完全不同。
名字碰撞是不幸的,但不是那么神秘。 堆是一个小的常用词,用于表示堆,集合,组等。数据结构这个词的使用在日期(我很确定)是内存池的名称。 事实上,在我看来,游泳池对于后者来说会是更好的选择。 堆意味着垂直结构(如堆),它适合数据结构,但不适合内存池。 我们不认为内存池堆是分层的,而数据结构背后的基本思想是将最大的元素保留在堆(和子堆)的顶部。
把数据结构堆起来可以追溯到60年代中期; 堆内存池,70年代初。 至少早在1971年Wijngaarden就Algol的讨论中使用了术语堆(意思是记忆池)。
可能最早使用堆作为数据结构是在七年前发现的
Williams,JWJ 1964.“Algorithm 232-Heapsort”,ACM Communications 7(6):347-348