这是我的一个堆开始的草图任意值为什么不使用堆数组的元素零?
0 1 2 3 4 5 6 7 8 9 ...
[-] [10] [14] [15] [22] [21] [24] [23] [44] [30] ...
为什么一定要在数组元素[0]总是被设置为空?
或者为什么我们不应该使用它?
这是我的一个堆开始的草图任意值为什么不使用堆数组的元素零?
0 1 2 3 4 5 6 7 8 9 ...
[-] [10] [14] [15] [22] [21] [24] [23] [44] [30] ...
为什么一定要在数组元素[0]总是被设置为空?
或者为什么我们不应该使用它?
有几种方法可以将二进制堆表示为数组。
有一种方法,使用元素零;还有一种方式,其中元件是零不使用:
n
的孩子是元素2n+1
和2n+2
;n
的子元素为2n
和2n+1
。也不是更“正确”比其他。前者更适合使用zero-based arrays的编程语言,而后者更适合于编写one-based arrays的语言。
看来您已经遇到了使用第二种方法的实现。由于所讨论的语言Java使用从零开始的数组,所以元素零存在但未被使用。
那么第二种方法浪费完美的记忆,没有任何好处,所以我会说这使得它比第一个好。你仍然可能是对的 – Voo 2012-02-27 10:43:00
@Voo:如果语言使用基于1的数组,则第二种方法不会浪费。在那里,array [1]是第一个元素,没有数组[0],没有什么是浪费的。 – 2012-03-27 23:38:29
@Philip是的,如果我们在谈论这样一种语言,那是真的。但是上次我查了一下java使用了明智的方法来进行数组索引;)更严重的是:我的评论是关于早期版本的答案 - 现在用我更新的版本并不好,通过点击“编辑”旁边的日期来回答这个问题) – Voo 2012-03-27 23:58:54
还是那为什么我们不应该使用它?
通过不使用它,然后你的索引开始于1
,你可以只使用教科书算法。
大多数算法书籍描述开始1
代替0
算法。
您可以使用元素0
但随后你将不得不修改您的索引作为@aix答案。
有些人认为,不使用0
是浪费空间。
其他感觉不使用0
会产生更多可读代码。
任你选
这真的归结为数学家和软件工程师之间的文化差异。
传统上,数学家使用1(一)作为向量的第一个元素或矩阵的第一列/行的索引。
对于一些(音)的原因,软件工程师使用0(零)来代替。所有现代主流编程语言都是这样做的。
你可能遇到的堆数据结构的描述/在一些文字的算法,是写的人谁更喜欢“数学”公约“软件工程”的约定。然后你用Java编写了算法(与大多数现代PL一样)使用了基于零的数组。
如果您发现这种令人不安的情况,只需修改您的代码即可从索引值中减去1。
注意,也有例外的软件工程领域:
(我称之为都可归结为一个事实,即涉及指数计算的算法一般是简单的,如果零是第一个元素的索引声音的原因。This article解释它。)
哪里你有没有想到数组元素0不应该被使用? – 2012-02-27 08:32:31
它不能为空? – 2012-02-27 08:32:50
谁说'array [0]'必须为空? – 2012-02-27 08:33:11