[C con Clase] SPREADSHEET en la Memoria
Steven Davidson
srd4121 en njit.edu
Jue Mayo 29 18:26:40 CEST 2008
Hola Diego,
Diego wrote:
> Hola,
[CORTE]
> He estado investigando un programa de codigo abierto llamado
> gnumeric, para linux, y este tiene un Hashtable donde guarda todos
> las celdas, como lo haria un diccionario. Me han dicho que este
> programa tambien usa regiones y arreglos segmentados para hacer las
> operaciones mas eficientemente, pero no conozco los arreglos
> segmentados ni entiendo como puede funcionar un hash con regiones.
>
Sospecho que array segmentado es "sparse array" en inglés. Básicamente,
es un array que no tiene que contener todos los elementos, ya que no
serán rellenados completamente. Por ejemplo, para implementar la hoja de
cálculo que quieres hacer, podríamos crear un array bidimensional de
3000 x 3000; o sea,
Celda tabla[3000][3000];
Sin embargo, lo más seguro es que la mayoría de las celdas estará vacía.
Por lo tanto, en lugar de crear todas las celdas, simplemente creamos
las celdas que queremos llenar, suponiendo que las demás están vacías,
que es el estado por defecto. Esto se puede implementar con listas
dinámicamente enlazadas.
> Ademas algunos miembros de la comunidad gnumeric me han dicho que
> estan trabajando para usar un quadtree, o un arbol de 4 ramas para
> dividir las celdas en regiones, pero tambien me es confuso. Por
> favor ayudenme. No estoy interesado en usar OLE o Active X, ya que
> necesito yo mismo hacer las grillas, y no depender de Excel.
>
Un árbol cuaternario ciertamente se compone de nodos de 4 ramas. Su uso
típico es para solucionar los problemas espaciales del tema de gráficos
para implementar un modelado de la información (vértices, aristas,
caras, etc.).
La idea básica es que partimos de un área rectangular que contiene todos
los elementos de la información. Subdividimos este rectángulo en cuatro
cuadrantes, obviamente rectangulares. Seguimos subdividiendo cada
cuadrante en otros cuatro cuadrantes hasta que obtenemos rectángulos que
tienen una cantidad de elementos más manejable. Las hojas del árbol
contienen la información. Sería algo así,
raíz(0,0,3000,3000)
/ / \ \
/ | | \
nodo11 nodo12 nodo13 nodo14
/ | | \ / | | \ / | | \ / | | \
nodo11 : (0,0,1500,1500)
nodo12 : (1500,0,3000,0)
nodo13 : (1500,0,1500,3000)
nodo14 : (1500,1500,3000,3000)
Cada nodo representa un área rectangular que contiene todos los
elementos en tal rectángulo. Cada rama representa otro rectángulo menor
que contiene un subconjunto de los elementos de su nodo pariente.
Puedes observar, que con unos cuantos recorridos del árbol llegamos a la
información que nos interesa.
Espero que esto aclare algunas dudas.
Steven
Más información sobre la lista de distribución Cconclase