为什么没有使用堆数组的元素零?

时间:2012-02-27 08:30:48

标签: java heap

这是我对具有任意值的堆的开头的粗略草图

 0   1    2    3    4    5    6    7    8    9   ...
[-] [10] [14] [15] [22] [21] [24] [23] [44] [30] ...

为什么array [0]中的元素必须始终设置为null? 或者为什么我们不应该使用它?

3 个答案:

答案 0 :(得分:18)

有几种方法可以将二进制堆表示为数组。

有一种方法可以使用元素零;还有一种方法,即元素零使用:

  1. root是元素0;元素n的子元素是元素2n+12n+2;
  2. root是元素1;元素n的子元素是元素2n2n+1
  3. 两者都不比另一个更“正确”。前者更适合使用zero-based arrays的编程语言,而后者更适合使用one-based arrays的语言。

    您似乎遇到过使用第二种方法的实现。由于所讨论的语言Java使用从零开始的数组,因此元素零存在但未被使用。

答案 1 :(得分:4)

这实际上归结为数学家和软件工程师之间的文化差异。

  • 传统上,数学家使用1(一)作为向量的第一个元素或矩阵的第一列/行的索引。

  • 出于多种(声音)原因,软件工程师使用0(零)代替。所有现代主流编程语言都是这样做的。

您可能在某些文本中遇到过堆数据结构/算法的描述,这些文本是由喜欢“软件工程”约定的“数学”约定的人编写的。然后你用Java编写了算法(和大多数现代PL一样)使用从零开始的数组。

如果您发现这令人不安,只需修改您的代码,从索引值中减去1。


请注意,软件工程领域有例外情况:

  • FORTRAN,COBOL,RPG和其他一些编程语言 - 请参阅Wikipedia
  • JDBC中的参数和列编号。
  • DOM API中的节点编号。

(我提到的声音原因都归结为如果零是第一个元素的索引,涉及索引计算的算法通常更简单。This article解释了它。)

答案 2 :(得分:0)

  

或者为什么我们不应该使用它?

如果不使用它,那么您的索引将从1开始,您只需使用教科书算法即可。

大多数算法书都描述了从1而不是0开始的算法。

您可以使用元素0,但是您必须将索引修改为@aix answer。

有些人认为不使用0是浪费空间 其他人认为不使用0会导致代码更易读。

选择