Page 325

4 Estructuras de datos: memoria din´amica

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

matriz columna sig

fila

cols

1

sig

columna

3

6

valor

valor

2.5

1.2

columna

sig

sig

2 sig

fila

valor

cols

3.7

3

columna sig

fila

cols

6

sig

columna

sig

columna

2

3

8

valor

valor

valor

1.3

8.1

0.2

sig

El ahorro de memoria es notabil´ısimo: si un float ocupa 8 bytes, hemos pasado de 800 a 132 bytes consumidos. El ahorro es relativamente mayor cuanto mayor es la matriz. Eso s´ı, la complejidad de los algoritmos que manipulan esa estructura es tambi´en notabil´ısima. ¡Imagina el procedimiento que permite multiplicar eficientemente dos matrices dispersas representadas as´ı! Un a ´rbol binario de b´ usqueda es una estructura montada con registros enlazados, pero no es una lista. Cada nodo tiene cero, uno o dos hijos: uno a su izquierda y uno a su derecha. Los nodos que no tienen hijos se llaman hojas. El nodo m´as alto, del que descienden todos los dem´ as, se llama nodo ra´ız. Los descendientes de un nodo (sus hijos, nietos, biznietos, etc.) tienen una curiosa propiedad: si descienden por su izquierda, tienen valores m´as peque˜ nos que el de cualquier ancestro, y si descienden por su derecha, valores mayores. Aqu´ı tienes un ejemplo de ´ arbol binario de b´ usqueda: raiz der

info

izq

10 der

info

izq

der

3 der

info

izq

1

info

izq

15 der

info

6

izq

der

info

12

izq

der

info

izq

23

Una ventaja de los ´ arboles binarios de b´ usqueda es la rapidez con que pueden resolver la pregunta ((¿pertenece un valor determinado al conjunto de valores del ´arbol?)). Hay un m´etodo recursivo que recibe un puntero a un nodo y dice: • si el puntero vale NULL; la respuesta es no; • si el valor coincide con el del nodo apuntado, la respuesta es s´ı; • si el valor es menor que el valor del nodo apuntado, entonces la respuesta la conoce el hijo izquierdo, por lo que se le pregunta a ´el (recursivamente); • y si el valor es mayor que el valor del nodo apuntado, entonces la respuesta la conoce el hijo derecho, por lo que se le pregunta a ´el (recursivamente). Ingenioso, ¿no? Observa que muy pocos nodos participan en el c´alculo de la respuesta. Si deseas saber, por ejemplo, si el 6 pertenece al ´arbol de la figura, s´olo hay que preguntarle a los nodos que tienen el 10, el 3 y el 6. El resto de nodos no se consultan para nada. Siempre es posible responder a una pregunta de pertenencia en un ´arbol con n nodos visitando un n´ umero de nodos que es, a lo sumo, igual a 1 + log2 n. Rapid´ısimo. ¿Qu´e costar´ a, a cambio, insertar o borrar un nodo en el ´arbol? Cabe pensar que mucho m´as que un tiempo proporcional al n´ umero de nodos, pues la estructura de los enlaces es muy compleja. Pero no es as´ı. Existen procedimientos sofisticados que consiguen efectuar esas operaciones en tiempo proporcional ¡al logaritmo en base 2 del n´ umero de nodos! Introducci´ on a la Programaci´ on con C

319

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement