这是我对具有任意值的堆的开头的粗略草图
0 1 2 3 4 5 6 7 8 9 ...
[-] [10] [14] [15] [22] [21] [24] [23] [44] [30] ...
为什么array [0]中的元素必须始终设置为null? 或者为什么我们不应该使用它?
答案 0 :(得分:18)
有几种方法可以将二进制堆表示为数组。
有一种方法可以使用元素零;还有一种方法,即元素零不使用:
n
的子元素是元素2n+1
和2n+2
; n
的子元素是元素2n
和2n+1
。两者都不比另一个更“正确”。前者更适合使用zero-based arrays的编程语言,而后者更适合使用one-based arrays的语言。
您似乎遇到过使用第二种方法的实现。由于所讨论的语言Java使用从零开始的数组,因此元素零存在但未被使用。
答案 1 :(得分:4)
这实际上归结为数学家和软件工程师之间的文化差异。
传统上,数学家使用1(一)作为向量的第一个元素或矩阵的第一列/行的索引。
出于多种(声音)原因,软件工程师使用0(零)代替。所有现代主流编程语言都是这样做的。
您可能在某些文本中遇到过堆数据结构/算法的描述,这些文本是由喜欢“软件工程”约定的“数学”约定的人编写的。然后你用Java编写了算法(和大多数现代PL一样)使用从零开始的数组。
如果您发现这令人不安,只需修改您的代码,从索引值中减去1。
请注意,软件工程领域有例外情况:
(我提到的声音原因都归结为如果零是第一个元素的索引,涉及索引计算的算法通常更简单。This article解释了它。)
答案 2 :(得分:0)
或者为什么我们不应该使用它?
如果不使用它,那么您的索引将从1
开始,您只需使用教科书算法即可。
大多数算法书都描述了从1
而不是0
开始的算法。
您可以使用元素0
,但是您必须将索引修改为@aix answer。
有些人认为不使用0
是浪费空间
其他人认为不使用0
会导致代码更易读。
选择