2011-07-03 11 views
8

Algunos lenguajes de scripts, como Python y Javascript, tienen matrices (también conocidas como listas) como un tipo de datos separado de las tablas hash (también conocidos como diccionarios, mapas, objetos). En otros lenguajes de scripts, como PHP y Lua, una matriz es simplemente una tabla hash cuyas claves son enteros. (La implementación puede optimizarse para ese caso especial, como se hace en la versión actual de Lua, pero eso es transparente para la semántica del lenguaje.)Matrices como tipo separado

¿Cuál es el mejor enfoque?

  1. El enfoque unificado es más elegante en el sentido de tener una cosa en lugar de dos, aunque la ganancia no es tan grande como podría parecer a primera vista, ya que todavía tiene que tener la noción de iterando sobre las teclas numéricas específicamente.

  2. El enfoque unificado es posiblemente más flexible. Puede comenzar con matrices anidadas, encontrar que necesita anotarlas con otras cosas, y simplemente agregar las anotaciones, sin tener que volver a trabajar las estructuras de datos para intercalar las matrices con tablas hash.

  3. En términos de eficiencia, parece ser más o menos un lavado (siempre que la implementación se optimice para el caso especial, como lo hace Lua).

¿Qué me falta? ¿El enfoque separado tiene alguna ventaja?

Respuesta

3

Una matriz es más que una tabla restringida intencionalmente a claves enteras consecutivas. Es una secuencia , una colección de n elementos (no pares clave-valor, solo los valores) con un orden bien definido. Esto es, en mi opinión, una estructura de datos que no tiene lugar para datos adicionales en forma de claves no enteras. Es conceptualmente más simple.

Además, la aplicación de ambos por separado puede ser más simple, especialmente cuando se considera la adición de una optimización (que al parecer es lo suficientemente oscuro que un lenguaje orientado al rendimiento como Lua no puso en práctica durante muchos muchos años) que hace las matrices funcionan bien.

Además, el punto de flexibilidad es discutible. Si surge la necesidad de una anotación más compleja, es muy posible que pronto también necesite polimorfismo, en cuyo caso debe cambiar a objetos con una matriz entre otros atributos.

+0

La simplicidad conceptual es un punto válido; al pensarlo un poco más, las tablas en realidad tienen dos requisitos adicionales, una tabla principal (para la programación basada en objetos) y un parámetro de función hash (para que pueda hacer tablas hash según sus propios criterios). Si también intentas arrojar semántica de secuencia en la misma mezcla, no estoy tan seguro de que el resultado sea aún tratable conceptualmente. – rwallace

4

Tener tipos separados significa que puede garantizar el rendimiento, y sabe que tendrá una semántica "normal" para cosas como el corte de matrices. Si tiene un sistema unificado, necesita averiguar qué significan todas las operaciones, como cortar, en matrices dispersas.

+1

Puntos razonables; votado. Sin embargo, una tabla hash podría ofrecerle la misma garantía de rendimiento que obtiene en un lenguaje de scripting de todos modos, y podría definir de una vez por todas que la parte de matriz de un objeto son las claves contiguas 0..N, y tienen todas las operaciones como como cortar el trabajo en eso. – rwallace

+0

@rwallace: Absolutamente. Es completamente una cuestión de gusto y enfoque si prefiere ser explícito sobre sus tipos de datos o abstractos. – Marcin

0

Como se mencionó, existen problemas de velocidad y complejidad en el hecho de tener dos tipos distintos. Sin embargo, una de las cosas que me parece importante sobre tener dos tipos es que expresa la intención del almacén de datos.

  • Una lista es una lista ordenada de elementos. Los artículos y su orden SON los datos, las claves solo existen de manera conceptual para describir el orden de los artículos.
  • Un mapa es un mapeo de las claves de los valores. Las claves y los valores que representan SON los datos.

El punto a tener en cuenta que las claves son parte de los datos de un mapa, no son para una lista ... conceptualmente.Cuando eliges un tipo de datos sobre el otro, estás especificando tu intención.

Agregaré aparte que cada idioma que comparte un tipo de datos para listas y mapas tiene ciertas ... molestias que vienen con él. Siempre hay ciertas concesiones que deben hacerse para permitir la combinación, y pueden morderlo a veces. Generalmente no es un gran problema, pero puede ser molesto.

Cuestiones relacionadas