Java 为什么不使用堆数组的元素零?
这是我对具有任意值的堆的开始的粗略描述Java 为什么不使用堆数组的元素零?,java,heap,Java,Heap,这是我对具有任意值的堆的开始的粗略描述 0 1 2 3 4 5 6 7 8 9 ... [-] [10] [14] [15] [22] [21] [24] [23] [44] [30] ... 为什么数组[0]中的元素必须始终设置为null? 或者为什么我们不应该使用它?有几种方法可以将二进制堆表示为数组 有一种使用零元素的方法;还有一种不使用零元素的方法: 根是元素0;元素n的子元素是元素2n+1和2n+2 根是元素1;元素n的子元素
0 1 2 3 4 5 6 7 8 9 ...
[-] [10] [14] [15] [22] [21] [24] [23] [44] [30] ...
为什么数组[0]中的元素必须始终设置为null?或者为什么我们不应该使用它?有几种方法可以将二进制堆表示为数组 有一种使用零元素的方法;还有一种不使用零元素的方法:
n
的子元素是元素2n+1
和2n+2
李>
n
的子元素是元素2n
和2n+1
1
开始,您可以使用教科书中的算法
大多数算法书籍描述的算法从1
开始,而不是0
您可以使用元素0
,但随后必须将索引修改为@aix answer
有些人认为不使用0
是浪费空间。其他人认为不使用
0
会导致代码更可读
随便你选吧这实际上可以归结为数学家和软件工程师之间的文化差异
- 通常,数学家使用1(一)作为向量的第一个元素或矩阵的第一列/行的索引
- 出于许多(合理的)原因,软件工程师使用0(零)代替。所有现代主流编程语言都是这样做的
请注意,软件工程领域存在例外情况:
- FORTRAN、COBOL、RPG和其他一些编程语言-请参阅
- JDBC中的参数和列编号
- domapi中的节点编号
(我提到的合理理由都归结为这样一个事实,即如果零是第一个元素的索引,则涉及索引计算的算法通常更简单。对此进行了解释。)您从何处得到不应使用数组元素零的想法?谁说
array[0]
必须为空?您在说什么实现?第二种方法浪费了完美的内存,没有任何好处,所以我认为这使它不如第一种方法。你可能还是right@Voo:如果语言使用基于1的数组,那么第二种方法不是浪费。这里,数组[1]是第一个元素,没有数组[0],没有浪费任何东西。@Philip是的,如果我们谈论这样一种语言,是的。但上次我检查时,java使用了合理的数组索引方法;)更严重的是:我的评论是关于答案的早期版本的——我同意,现在更新的版本不太好(你可以通过点击“编辑”旁边的日期来查找答案的旧版本)。我想指出,使用基于一的索引,operationsPARENT=[n/2]
和LEFTCHILD=2n
可以通过位移位有效地实现。@Max您还可以通过在像这样移位之前减去1,将位移位到基于0的索引中(n-1)>>1