Autor Tema: Fórmula para mapear un arreglo n-dimensional...

0 Usuarios y 1 Visitante están viendo este tema.

09 Septiembre, 2013, 07:45 am
Leído 3688 veces

rodmoreno

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 1
  • Karma: +0/-0
  • Sexo: Masculino
Qué tal, recurro a ustedes debido a que estoy en medio de una tarea y a mi eso de las matemáticas no se me dan muy bien.

El problema en si es idear una formula para mapear la dirección de un elemento de un arreglo n-dimensional. Trataré de explicarme mejor:

Supongamos que en el lenguaje C declaro el siguiente arreglo: char arr[4][4]; esto nos denota un espacio de 16 bytes para guardar datos. Y en este caso hipotético el elemento [0][0] vive en la dirección 0, por lo que una representación grafica del arreglo y de este en memoria se vería como esto:



Ahora aquí lo importante sería cómo sabe la maquina en qué dirección de memoria vive el elemento [2][2] por ejemplo... Lo que vimos en clase es que C y cualquier otro lenguaje de programación tienen métodos para encontrar de manera rápida y eficiente la dirección de memoria donde vive un elemento determinado, el profesor le llamó mapeo.

Para este ejemplo de un arreglo de 2D nos sugirió la siguiente fórmula: \( \texttt{Loc}A(c,d) = \texttt{Direcci\'onBase} + (c*\texttt{colsize}+d)\cdot \texttt{Tama\~no del tipo de dato} \)
Tomando el ejemplo anterior para localizar [2][2] sería: \( \texttt{Loc}A(2,2) = 0 + (2 * 4 + 2) * 1 = 10 \) <-- Esa es la dirección donde vive [2][2] para este ejemplo hipotético.

Ahora el problema viene en idear una formula que permite calcular para n-dimensiones, el profesor nos indicó que llevaría una sumatoria y una multiplicatoria, después de pensar un rato y analizar los códigos que me enviaste y platicar con algunos compañeros llegué a está formula:

\( \texttt{Array}[n_1,n_2...n_d] = \texttt{Direcci\'onBase} + (\displaystyle\sum_{k=1}^d(\prod_{l=k+1}^d N_l)n_k) \cdot \texttt{Tama\~no del tipo de dato} \)

No sé... ¿qué opinan ustedes?

09 Septiembre, 2013, 04:13 pm
Respuesta #1

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,447
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Suponiendo que tienes un arreglo multidimensional de tamaño \( d_1\times d_2\times \cdots \times d_n \) una manera natural de hacer ese mapeo es:

\( (i_1,\dots,i_n)\mapsto i_1+d_1i_2+d_1d_2i_3+\cdots+d_1d_2\cdots d_{n-1}i_n \)

Con sumatorias y productorias, sería así:

\( (i_1,\dots,i_n)\mapsto \displaystyle \sum_{j=1}^n(\prod_{k=1}^{j-1}d_k) i_j \)
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print