2012-02-27 5 views
9

Aquí es mi esbozo de principio de un montón con valores arbitrarios¿Por qué no se usa el elemento cero de una matriz de montón?

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

¿Por qué es necesario que el elemento de array [0] siempre se establece en null?
¿O por qué es que se supone que no debemos usarlo?

+6

Dónde ¿Te surgió la idea de que el elemento de matriz cero no debería usarse? –

+0

No debe ser nulo? –

+0

¿Quién dice que 'array [0]' debe ser nulo? –

Respuesta

15

Hay varias formas de representar un montón binario como una matriz.

Hay una manera por la cual se usa el elemento cero; también hay un camino por el cual elemento cero es no utilizarse:

  1. raíz es el elemento 0; los elementos secundarios del elemento n son los elementos 2n+1 y 2n+2;
  2. raíz es el elemento 1; Los elementos secundarios del elemento n son los elementos 2n y 2n+1.

Ninguno es más "correcto" que el otro. El primero es un mejor ajuste para los lenguajes de programación que usan zero-based arrays, mientras que el último es un mejor ajuste para los idiomas con one-based arrays.

Parece que ha encontrado una implementación que utiliza el segundo enfoque. Dado que el lenguaje en cuestión, Java, usa matrices basadas en cero, el elemento cero existe, pero no se está utilizando.

+0

Bueno, el segundo enfoque desperdicia memoria perfectamente buena sin ningún beneficio en absoluto, así que diría que la hace inferior a la primera. Aún así, probablemente tenga razón – Voo

+0

@Voo: el segundo enfoque no es derrochador si el lenguaje usa arreglos basados ​​en 1. Allí, la matriz [1] es el primer elemento, no hay una matriz [0] y no se desperdicia nada. –

+0

@Philip Sí, si habláramos de ese tipo de lenguaje, cierto. Pero la última vez que revisé, java usó el enfoque sensato para la indexación de matrices;) Más serio: mi comentario fue con respecto a una versión anterior de la respuesta; no es muy buena ahora con la versión actualizada, estoy de acuerdo (puede buscar viejos versiones de la respuesta haciendo clic en la fecha al lado de "editado") – Voo

0

¿O por qué se supone que no debemos usarlo?

Al no utilizar entonces su indexación comienza a 1 y sólo se puede utilizar el libro de texto algoritmos.

La mayoría de los libros de algoritmos describen el algoritmo que comienza en 1 en lugar de 0.

Puedes usar el elemento 0 pero luego deberías modificar tus índices como @aix answer.

Algunas personas sienten que no usar 0 es una pérdida de espacio.
Otros consideran que no usar 0 da como resultado un código más legible.

una serie de opciones

4

Esto realmente se reduce a una diferencia cultural entre los matemáticos y los ingenieros de software.

  • Convencionalmente, matemáticos usan 1 (uno) como el índice del primer elemento de un vector o primera columna/fila de una matriz.

  • Por una serie de razones (de sonido), los ingenieros de software usan 0 (cero) en su lugar. Y todos los lenguajes de programación convencionales modernos hacen lo mismo.

Usted ha encontrado probablemente una descripción de la estructura de datos del montón/algoritmos en un texto que fue escrito por alguien que prefiere la convención "matemática" a la convención de la "ingeniería de software". Luego has codificado el algoritmo en Java que (como la mayoría de los PL modernos) usa matrices basadas en cero.

Si le parece molesto, simplemente modifique su código para restar 1 de los valores de índice.


Tenga en cuenta que hay excepciones en el campo de la ingeniería de software:

  • FORTRAN, COBOL, RPG y algunos otros lenguajes de programación - ver Wikipedia.
  • Numeración de parámetros y columnas en JDBC.
  • Numeración de nodos en DOM API.

(Las razones de peso que he hecho referencia a todas se reducen al hecho de que los algoritmos que implican cálculos del índice son generalmente más simple si el cero es el índice del primer elemento. This article lo explica.)

Cuestiones relacionadas