Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不使用堆数组的元素零?_Java_Heap - Fatal编程技术网

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?

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

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

有一种使用零元素的方法;还有一种不使用零元素的方法:

  • 根是元素0;元素
    n
    的子元素是元素
    2n+1
    2n+2
  • 根是元素1;元素
    n
    的子元素是元素
    2n
    2n+1
  • 两者都不比另一个更“正确”。前者更适合使用的编程语言,而后者更适合使用

    您似乎遇到了使用第二种方法的实现。由于所讨论的语言Java使用基于零的数组,所以元素zero存在但未被使用

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

    如果不使用它,则索引从
    1
    开始,您可以使用教科书中的算法

    大多数算法书籍描述的算法从
    1
    开始,而不是
    0

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

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


    随便你选吧

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

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

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

    您可能在某些文本中遇到过对堆数据结构/算法的描述,这些描述是由喜欢“数学”约定而不是“软件工程”约定的人编写的。然后,您已经用Java编写了算法,它(像大多数现代PLs一样)使用基于零的数组

    如果您觉得这令人不安,只需修改代码,从索引值中减去1即可


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

    • FORTRAN、COBOL、RPG和其他一些编程语言-请参阅
    • JDBC中的参数和列编号
    • domapi中的节点编号


    (我提到的合理理由都归结为这样一个事实,即如果零是第一个元素的索引,则涉及索引计算的算法通常更简单。对此进行了解释。)

    您从何处得到不应使用数组元素零的想法?谁说
    array[0]
    必须为空?您在说什么实现?第二种方法浪费了完美的内存,没有任何好处,所以我认为这使它不如第一种方法。你可能还是right@Voo:如果语言使用基于1的数组,那么第二种方法不是浪费。这里,数组[1]是第一个元素,没有数组[0],没有浪费任何东西。@Philip是的,如果我们谈论这样一种语言,是的。但上次我检查时,java使用了合理的数组索引方法;)更严重的是:我的评论是关于答案的早期版本的——我同意,现在更新的版本不太好(你可以通过点击“编辑”旁边的日期来查找答案的旧版本)。我想指出,使用基于一的索引,operations
    PARENT=[n/2]
    LEFTCHILD=2n
    可以通过位移位有效地实现。@Max您还可以通过在像这样移位之前减去1,将位移位到基于0的索引中
    (n-1)>>1