stringtranslate.com

matriz paralela

En informática , un grupo de matrices paralelas (también conocido como estructura de matrices o SoA) es una forma de estructura de datos implícita que utiliza múltiples matrices para representar una matriz singular de registros . Mantiene una matriz de datos separada y homogénea para cada campo del registro, cada uno con el mismo número de elementos. Entonces, los objetos ubicados en el mismo índice en cada matriz son implícitamente los campos de un solo registro. Los punteros de un objeto a otro se reemplazan por índices de matriz. Esto contrasta con el enfoque normal de almacenar todos los campos de cada registro juntos en la memoria (también conocido como matriz de estructuras o AoS). Por ejemplo, se podría declarar una matriz de 100 nombres, cada uno de ellos una cadena, y 100 edades, cada una de ellas un número entero, asociando cada nombre con la edad que tiene el mismo índice.

Ejemplos

Un ejemplo en C usando matrices paralelas:

int edades [] = { 0 , 17 , 2 , 52 , 25 }; char * nombres [] = { "Ninguno" , "Mike" , "Billy" , "Tom" , "Stan" }; int parent [] = { 0 /*Ninguno*/ , 3 /*Tom*/ , 1 /*Mike*/ , 0 /*Ninguno*/ , 3 /*Tom*/ };                          for ( i = 1 ; i <= 4 ; i ++ ) { printf ( "Nombre: %s, Edad: %d, Padre: %s \n " , nombres [ i ], edades [ i ], nombres [ padre [ i ]]); }            

en Perl (usando un hash de matrices para contener referencias a cada matriz):

mis %datos = ( primer_nombre => [ 'Joe' , 'Bob' , 'Frank' , 'Hans' ], apellido => [ 'Smith' , 'Seger' , 'Sinatra' , 'Schultze' ], altura_en_cm => [ 169 , 158 , 201 , 199 ]);                    para $i ( 0 .. $# { $datos { nombre }}) { printf "Nombre: %s %s\n" , $datos { nombre }[ $i ], $datos { apellido }[ $i ]; printf "Altura en CM: %i\n" , $datos { altura_en_cm }[ $i ]; }          

O, en Python :

primeros nombres  =  [ "Joe" ,  "Bob" ,  "Frank" ,  "Hans"  ] apellidos  =  [ "Smith" , "Seger" , "Sinatra" , "Schultze" ] alturas_en_cm  =  [ 169 ,  158 ,  201 ,  199  ]para  i  en  rango ( len ( nombres )):  print ( "Nombre: %s %s " % ( nombres [ i ], apellidos [ i ])) print ( "Altura en cm: %s " % alturas_en_cm [ i ])       # Usando zip: para  nombre ,  apellido ,  altura en cm  en  zip ( nombres ,  apellidos ,  altura en cm ):  print ( f "Nombre: { primer_nombre } { apellido } " ) print ( f "Altura en cm: { altura en cm } " )  

Pros y contras

Los arreglos paralelos tienen una serie de ventajas prácticas sobre el enfoque normal:

Varias de estas ventajas dependen en gran medida del lenguaje de programación particular y de la implementación que se utilice.

Sin embargo, las matrices paralelas también tienen varias desventajas importantes, lo que explica por qué generalmente no se prefieren:

La mala localidad de referencia se puede aliviar en algunos casos: si una estructura se puede dividir en grupos de campos a los que generalmente se accede juntos, se puede construir una matriz para cada grupo, y sus elementos son registros que contienen sólo estos subconjuntos de la estructura más grande. campos. (ver diseño orientado a datos ). Esta es una forma valiosa de acelerar el acceso a estructuras muy grandes con muchos miembros, manteniendo al mismo tiempo unidas las partes de la estructura. Una alternativa a unirlos usando índices de matriz es usar referencias para unir las partes, pero esto puede ser menos eficiente en tiempo y espacio.

Otra alternativa es utilizar una única matriz, donde cada entrada sea una estructura de registro. Muchos lenguajes proporcionan una forma de declarar registros reales y matrices de ellos. En otros lenguajes puede ser factible simular esto declarando una matriz de tamaño n*m, donde m es el tamaño de todos los campos juntos, empaquetando los campos en lo que efectivamente es un registro, aunque el lenguaje en particular carezca de soporte directo para registros. Algunas optimizaciones del compilador , particularmente para procesadores vectoriales , pueden realizar esta transformación automáticamente cuando se crean matrices de estructuras en el programa. [ cita necesaria ]

Ver también

Referencias