堆实际上是堆吗?

2022-09-02 04:19:53

可能的重复:
为什么两个不同的概念都被称为“堆”?
“a”堆和“the”堆之间有什么关系?

在.NET(据我所知和Java)中,动态分配对象的区域称为托管堆。但是,大多数描述托管堆如何工作的文档都将其描述为线性数据结构,如链表或堆栈。

那么,托管堆实际上是一个,还是使用其他一些数据结构实现的?如果它实际上没有使用堆数据结构,似乎是术语重载这个词的含义的重大失败。

如果它实际上是一个堆数据结构,那么满足堆属性的值是什么:分配的内存区域的大小?


答案 1

不,堆根本不是堆有序的二项式树。目前还不清楚(对我来说)术语冲突是谁的错,但堆的两种使用都可以追溯到几十年前(似乎在1970年中期)。本文将讨论一些历史。


答案 2

我当然没有历史知识来评论这个问题,但我相信术语“堆”用于描述.NET和Java中长期存在的对象的内存分配机制,更像是一个令人回味的描述性词 - 就像这个巨大的非结构化(从开发人员的角度来看)内存质量的东西。相比之下,“堆栈”唤起了一个更加结构化的数据区域的形象(同样,从开发人员的角度来看):堆栈上的“位置”感觉比它们位于堆上的“位置”更相关。

这显然与实际的堆数据结构非常不同,后者使用“堆”一词来指代所谓的堆属性(来自维基百科):

如果 B 是 A 的子节点,则键(A) ≥键(B)。

所以,是的,它们实际上是无关的。一个只是一个描述性术语,而另一个则有一个更正式的定义。