2012-02-27 45 views
9

这是我的一个堆开始的草图任意值为什么不使用堆数组的元素零?

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

为什么一定要在数组元素[0]总是被设置为空?
或者为什么我们不应该使用它?

+6

哪里你有没有想到数组元素0不应该被使用? – 2012-02-27 08:32:31

+0

它不能为空? – 2012-02-27 08:32:50

+0

谁说'array [0]'必须为空? – 2012-02-27 08:33:11

回答

15

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

有一种方法,使用元素零;还有一种方式,其中元件是零不使用

  1. 根是元素0;元素n的孩子是元素2n+12n+2;
  2. 根是元素1;子元素n的子元素为2n2n+1

也不是更“正确”比其他。前者更适合使用zero-based arrays的编程语言,而后者更适合于编写one-based arrays的语言。

看来您已经遇到了使用第二种方法的实现。由于所讨论的语言Java使用从零开始的数组,所以元素零存在但未被使用。

+0

那么第二种方法浪费完美的记忆,没有任何好处,所以我会说这使得它比第一个好。你仍然可能是对的 – Voo 2012-02-27 10:43:00

+0

@Voo:如果语言使用基于1的数组,则第二种方法不会浪费。在那里,array [1]是第一个元素,没有数组[0],没有什么是浪费的。 – 2012-03-27 23:38:29

+0

@Philip是的,如果我们在谈论这样一种语言,那是真的。但是上次我查了一下java使用了明智的方法来进行数组索引;)更严重的是:我的评论是关于早期版本的答案 - 现在用我更新的版本并不好,通过点击“编辑”旁边的日期来回答这个问题) – Voo 2012-03-27 23:58:54

0

还是那为什么我们不应该使用它?

通过不使用它,然后你的索引开始于1,你可以只使用教科书算法。

大多数算法书籍描述开始1代替0算法。

您可以使用元素0但随后你将不得不修改您的索引作为@aix答案。

有些人认为,不使用0是浪费空间。
其他感觉不使用0会产生更多可读代码。

任你选

4

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

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

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

你可能遇到的堆数据结构的描述/在一些文字的算法,是写的人谁更喜欢“数学”公约“软件工程”的约定。然后你用Java编写了算法(与大多数现代PL一样)使用了基于零的数组。

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


注意,也有例外的软件工程领域:

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

(我称之为都可归结为一个事实,即涉及指数计算的算法一般是简单的,如果零是第一个元素的索引声音的原因。This article解释它。)

相关问题