Está en la página 1de 129

UNIVERSIDAD TECNICA DE ORURO FACULTAD NACIONAL DE INGENIERIA INGENIERIA DE SISTEMAS E INFORMATICA

TEXTO GUIA:

ESTRUCTURA DE DATOS

SIS2204

Ing. Juan Gregorio Choque Uo Fecha de Realizacin: Marzo del 2008


Docente:

Oruro - Bolivia

CONTENIDO
INTRODUCCION
1.1 ESTRUCTURA DE DATOS. 1.2 OPERACIONES SOBRE ESTRUCTURAS DE DATOS.

6
6 9

PILAS Y COLAS
2.1 PILAS. PILA SECUENCIAL OPERACIONES CON PILAS DISTRIBUCIN DE PILAS. Manejo de Dos Pilas y Operaciones Primitivas. 2.2 COLAS. COLA SECUENCIAL OPERACIONES CON COLAS INICIAR COLA. ACCEDER A UN ELEMENTO EN LA COLA INSERTAR UN ELEMENTO EN LA COLA. ELIMINAR UN ELEMENTO DE LA COLA. 2.3 COLAS CIRCULARES. INSERCIN EN COLA CIRCULAR ELIMINAR EL NODO DELANTERO DE LA COLA 2.4 APLICACIONES DE LISTAS RESTRINGIDAS. ALGORITMO DE NOTACIN INFIJA A POSFIJA ALGORITMO DE EVALUACIN EN NOTACIN POSFIJA

10
10 10 11 14 14 17 17 17 17 18 18 19 19 20 20 22 22 24

ARCHIVOS, REGISTROS Y CAMPOS


3.1 ARCHIVOS 3.2 TIPOS DE ARCHIVOS. ARCHIVOS SECUENCIALES. ARCHIVOS DIRECTOS. OPERACIONES SOBRE ARCHIVOS 3.3 REGISTROS Y CAMPOS. TIPOS DE REGISTROS OPERACIONES SOBRE REGISTROS.

26
26 26 26 27 27 28 29 29

TRATAMIENTO DE ARCHIVOS
4.1 INTRODUCCION 4.2 OPERACIONES SOBRE ARCHIVOS ADICION DE DATOS ELIMINAR DATOS CONSULTAS DE DATOS BUSQUEDA DE DATOS

30
30 30 31 32 33 34

4.3 PARTICION DE ARCHIVOS PARTICION POR CONTENIDO PARTICION POR UNA SECUENCIA " P " DADA PARTICIN DE ARCHIVOS POR TRAMOS ORDENADOS 4.4 MEZCLAS DE ARCHIVOS MEZCLA POR CONTENIDO TOTAL MEZCLA POR SECUENCIAS " P " MEZCLA POR TRAMOS ORDENADAS 4.5 ORDENACIN EXTERNA ORDENACIN POR MEZCLA DIRECTA ORDENACIN POR VON NEWMAN ORDENACIN POR MEZCLA EQUILIBRADA ORDENACIN POR DIGITOS

35 36 36 37 38 39 39 41 42 42 45 47 49

LISTAS ENCADENADAS
5.1 LISTAS ENCADENADAS TIPOS DE LISTAS. 5.2 LISTAS SIMPLEMENTE ENLAZADAS OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS RECORRIDO BUSQUEDA INSERCION DE DATOS ELIMINAR DATOS 5.3 LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES. OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES RECORRIDO BUSQUEDA INSERCION DE DATOS ELIMINAR DATOS 5.4 LISTAS DOBLEMENTE ENLAZADAS. OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS. RECORRIDO INSERCION DE DATOS ELIMINAR DATOS 5.5 LISTAS CIRCULARES DOBLEMENTE ENLAZADAS. OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS CIRCULARES. RECORRIDO INSERCION DE DATOS ELIMINAR DATOS

52
52 52 53 54 54 55 55 58 59 60 60 61 61 63 64 65 66 67 69 72 73 73 74 76

RBOLES
6.1 DEFINICION. REPRESENTACIN MATRIZ DE ADYACENCIA LISTA DE ADYACENCIA ESTRUCTURA DINMICA PURA 6.2 CONCEPTOS ASOCIADOS

78
78 78 79 79 79 80

6.3 ARBOL BINARIO DEFINICION OPERACIONES BASICAS INSERCIN DE DATOS ELIMINAR UN DATO BSQUEDA DE DATOS 6.4 RBOLES BINARIOS DE EXPRESIONES CONSTRUCCIN A PARTIR DE UNA EXPRESIN EN NOTACIN CONVENCIONAL 6.5 RBOLES EQUILIBRADOS O AVL DEFINICIN INSERCIN EN AVL IMPLEMENTACIN DE LA INSERCIN BORRADO EN AVL IMPLEMENTACIN DE LA ELIMINACIN RBOLES BINARIOS DE EXPRESIONES

81 82 82 88 88 90 90 91 92 93 93 100 103 109 113

GRAFOS
7.1 DEFINICIONES. 7.2 ALMACENAMIENTO DE UN GRAFO EN MEMORIA. 7.3 APLICACIONES.

115
115 122 126

TEMA 1

INTRODUCCION
OBJETIVOS
Conceptuar las diferentes etapas por las que atraviesa el procesamiento de datos desde la abstraccin de los mismos hasta la obtencin de los resultados en la computadora.

CONTENIDO
1.1 Estructura de Datos 1.2 Operaciones Sobre Estructuras de Datos

1.1 ESTRUCTURA DE DATOS.


Estructuras de datos y tipos de datos abstractos (TDA) Un tipo de datos es una coleccin de valores Un tipo de datos abstracto (TDA) es un tipo de datos definido de forma nica mediante un tipo y un conjunto dado de operaciones definidas sobre el tipo. Una estructura de datos es la implementacin fsica de un tipo de datos abstracto. Debido al proceso de abstraccin, el diseo deber realizarse siguiendo tres pasos fundamentales: 1.- Anlisis de datos y operaciones 2.- Eleccin del Tipo de Datos Abstracto 3.- Eleccin de la implementacin Tipos de datos bsicos TDA Entero: tiene como tipo el conjunto de nmeros enteros, y como operaciones la suma, resta, multiplicacin y divisin entera TDA Real: tiene como tipo el conjunto de nmeros reales y como operaciones la suma, resta multiplicacin y divisin TDA Booleano: tiene como tipo el conjunto de valores booleanos True, False y como operaciones las definidas en el lgebra de Boole (AND, OR, NOT) TDA Carcter: tiene como tipo el conjunto de caracteres definido por un alfabeto dado y como operaciones todos los operadores relacionales (<, >, =, >=, <=, <>) Se denominan tipos de datos escalares a aquellos en los que el conjunto de valores est ordenado y cada valor es atmico: Carcter, Entero, Real y Booleano. Se denominan tipos de datos ordinales a aquellos en los que cada valor tiene un predecesor (excepto el primero), y un nico sucesor (excepto el ltimo): Carcter, Entero y Booleano. Los lenguajes de alto nivel suelen presentar tres funciones adicionales asociadas a los tipos de datos ordinales: posicin (Ord), predecesor (Pred) y sucesor (Suc) de un elemento. Otro tipo de datos son los denominados compuestos, dado que son divisibles en componentes que pueden ser accedidas individualmente. Las operaciones asociadas a los tipos compuestos o estructurados son las de almacenar y recuperar sus componentes individuales. 6

Los TDA compuestos bsicos: TDA Conjunto: coleccin de elementos tratados con las operaciones unin, interseccin y diferencia de conjuntos. TDA Arreglo: coleccin homognea de longitud fija tal que cada una de sus componentes pueden ser accedidas individualmente mediante uno o varios ndices, que sern de tipo ordinal, y que indican la posicin de la componente dentro de la coleccin. TDA Registro: tipo de datos heterogneo compuesto por un nmero fijo de componentes denominadas campos a las que se accede mediante un selector de campo. El TDA Conjunto no es estructurado ya que no est organizado mediante el modo de acceso a sus componentes individuales, mientras que el Arreglo y el Registro si lo son. Los registros pueden tener como campos tipos de datos simples o arreglos o incluso otros registros. Los TDA bsicos son los utilizados con mayor frecuencia, pero adems cada problema puede requerir la definicin de varios TDA propios. Por ejemplo, un TDA muy utilizado en aplicaciones informticas es el TDA lista definido de la siguiente forma: TDA lista (o Secuencia): coleccin homognea de datos, ordenados segn su posicin en ella, tal que cada elemento tiene un predecesor (excepto el primero) y un sucesor (excepto el ltimo) y los operadores asociados son: Insertar: inserta un elemento x, en una posicin p de la lista Localizar: localiza la posicin p en la que se encuentra el dato x Recuperar: encuentra el elemento x que esta en la posicin p Suprimir: elimina de la lista el elemento de la posicin p Suprimir_dato: elimina de la lista cualquier aparicin del elemento x Anula: ocasiona que la lista se vace Primero (Fin): proporciona el primer (ltimo) elemento de la lista Imprimir: imprime todos los elementos de la lista en su orden. En general el trmino lista se utiliza cuando el TDA se implementa sobre memoria principal mientras que secuencia suele reservarse para implementaciones sobre memoria secundaria. La lista es una estructura dinmica ya que su longitud depender del nmero de elementos que tenga, aumentar al insertar y se reducir al suprimir. Ahora bien, la lista puede implementarse de formas muy diferentes. Una de ellas es mediante arreglos. As, la lista, que es dinmica independientemente de su implementacin, se realiza mediante una implementacin esttica. Estructura Es un conjunto de elementos entrelazados regidos por una serie de leyes. En general, las estructuras que nos presenta el mundo real estn regidas por las leyes fsicas. Estructura de Datos Una estructura de datos es una coleccin organizada de elementos de datos bajo las leyes de la informtica. Estos elementos, o ladrillos, son los tipos de datos, con los cuales se forman las estructuras de datos que incluyen los diferentes lenguajes:

Binarios Enteros 7

Reales Caracteres o Doble precisin o Vectores o Arreglos bidimensionales o Arreglos n-dimensionales o Registros Complejos

El tipo de dato determina:


Los rangos de la variable. La cantidad de memoria que se le asigna a la variable. Las operaciones que se pueden realizar.

Debido a lo limitado de los lenguajes de alto nivel, los programadores estaban insatisfechos por el nivel de abstraccin que lograban. Este problema, se ha superado al proveer los nuevos lenguajes con mecanismos que le permiten al programador construir sus propias abstracciones con base en su necesidad, a travs de los tipos de datos definidos por el usuario. El enfoque de los nuevos lenguajes, orientados por objetos, es tener un conjunto fijo de estructuras y un conjunto poderoso de primitivas que permiten su manipulacin, brindandole al usuario la oportunidad de definir datos (atributos) y operaciones (mtodos). Estructura Lgica. Es la estructura que define el usuario a nivel de anlisis y parte de diseo, al relacionar lgicamente los elementos para satisfacer un requerimiento determinado.

Estructura Fsica. Corresponde a la forma en que a travs de un lenguaje de programacin se crea la estructura lgica, en memoria auxiliar. struct ID_CARRO { char placa[6]; struct PROPIETARIO prop; struct CARACTER car; }; struct PROPIETARIO { 8

char direccion[50]; struct NOMBRE nomb; }; struct CARACTERISTICAS { char marca[20]; int modelo[2]; char color[10]; }; struct NOMBRE { char nombre[10]; char apellido_1[10]; char apellido_2[10]; };

1.2 OPERACIONES SOBRE ESTRUCTURAS DE DATOS.


Son varias las operaciones que se efectan sobre las estructuras de datos, y una vez establecidas se definen como funciones. Funcin Constructora Son los algoritmos y mecanismos que permiten construir una estructura. Asigna memoria en forma dinmica o espacios en medios magnticos. Funcin Destructora Son los algoritmos y mecanismos que desasignan memoria y liberan recursos del sistema. Funcin de Acceso Son los algoritmos a travs de los cuales se llega a una estructura y sus elementos Funcin de Prueba Por medio de la funcin de acceso se llega a un elemento y se prueba si posee determinado atributo. Funcin de Insercin Permite la inclusin de un elemento en una estructura. Funcin de Eliminacin Permite la exclusin de un elemento de una estructura. Funcin Inversa Las funciones de acceso proveen un nombre o valor. Estas funciones son los mecanismos o procesos, en que dado un valor o un nombre, se determina la posicin del elemento de dato en la estructura.

TEMA 2

PILAS Y COLAS
OBJETIVOS
Emplear y desarrollar aplicaciones empleando estructuras estticas de datos como apoyo a procesos ms complejos.

CONTENIDO
2.1 Pilas 2.2 Colas 2.3 Colas Circulares 2.4 Aplicaciones de Listas Restringidas 2.5 Ejercicios En este captulo se introducen dos tipos de listas, pilas y colas, que se pueden actualizar, solo de una manera muy limitada. Son estructuras bastante importantes utilizadas en multitud de aplicaciones.

2.1 PILAS.
Una pila es una lista en donde tanto las inserciones como las supresiones se hacen por el mismo extremo, que se conoce como el tope de la pila. Por ejemplo, la pila de carritos de los supermercados, porque el ltimo carro que se coloca es el primero que se saca. Esta propiedad de la pila se conoce como LIFO (Last In First Out; ltimo que entra primero que sale).

PILA SECUENCIAL
Aqu se trabaja como una lista secuencial de acceso restringido. Para su manejo se requieren dos apuntadores, uno que indica la posicin del ltimo elemento insertado, llamado TOPE de la pila, y otro denominado BASE que apunta al fondo de la pila. Cuando la pila est vaca, no hay elementos, BASE=TOPE.

Figura 2.1 Pila, se inserta y se elimina por el mismo extremo. El apuntador TOPE apunta al ltimo elemento de la pila; el apuntador BASE no apunta a ningn elemento de la pila 10

OPERACIONES CON PILAS


Las operaciones primitivas que se efectan sobre una pila son: 1. 2. 3. 4. 5. 6. Iniciar la pila (dejarla en condiciones de pila vaca). Probar si la pila est vaca. Acceder al elemento del tope de la pila. Insertar un elemento en el tope de la pila (PUSH). Eliminar el elemento tope de la pila (POP). Destruir la pila.

Para la implementacin de esta estructura de datos, se har uso de un arreglo que aqu llamamos PILA, de dimensin M. Esta es la estructura esttica con la que se trabajan estos algoritmos. Iniciacin de una pila. En el arreglo PILA, se inicia la lista restringida. Precondicin: Que exista el arreglo. Poscondicin: Condicin de pila vaca.
INIC_PILA Inicio BASE = 0 TOPE = BASE Fin

Aqu, la base apunta al elemento 0 del arreglo, que como se haba determinado, no corresponde a ningn elemento de la lista. Prueba de Pila Vaca: En general es importante, para todo tipo de estructura, establecer si se encuentra vaca, pues el proceso vara dependiendo de esta condicin. Este algoritmo retorna un valor verdadero si la pila est vaca. Precondicin: No hay. Poscondicin: Retorna verdadero cuando no hay elementos en la pila. En caso contrario retorna el valor falso.
ENTERO PILA_VACIA() Inicio Si (TOPE==BASE) Entonces RETORNA VERDADERO Sino RETORNA FALSO Fin-Si Fin

Esta rutina se emplea en el algoritmo ELIM_PILA que saca el elemento que apunta el TOPE de la pila.

11

Acceder al Elemento Tope de la Pila: Con esta operacin se lee el ltimo elemento de la pila y se lleva a DATO. Precondicin: Pila vlida. Poscondicin: En DATO queda una copia del elemento que apunta el ndice TOPE si hay elementos en la pila, en caso contrario DATO queda indefinido.
ACCE_PILA(DATO,I) Inicio I = Verdadero Si (NO PILA_VACIA()) Entonces DATO = PILA[TOPE] Sino I = Falso Fin-Si Fin

Insertar un Dato en la Pila: Se coloca DATO en un nodo que queda en el TOPE de la pila. Es posible que no se pueda hacer la insercin debido a que no hay nodos disponibles recordemos que con la variable I se indica si se pudo, o no, hacer la insercin. Precondicin: TOPE < M Poscondicin: I verdadero indica que se hizo la insercin de DATO y el ndice TOPE apunta a DATO.
INSER_PILA(DATO,I) Inicio I = Verdadero Si (TOPE>=M) Entonces I = Falso Sino TOPE = TOPE + 1 PILA[TOPE] = DATO Fin-Si Fin

Figura 2.2 Estado de la pila luego de la insercin La condicin de saturacin generalmente es un error y significa que el rea disponible est llena y que aun se tratan de colocar ms datos en ella. La poltica comn es, en primer lugar, tratar de manejar dicha condicin para superarla, o rechazar la insercin e informar al sistema operacional para una terminacin anormal de la tarea. 12

Eliminar un Elemento de la Pila: En DATO se coloca el elemento que inicialmente apunta al TOPE de la pila. Al disminuir TOPE el elemento anterior permanece en el rea de memoria como basura. Precondicin: Pila vlida. Poscondicin: Si se pudo realizar la operacin, I verdadero, DATO queda con elemento que haba en el tope de la pila. Si la pila estaba vaca I es falso y DATO indeterminado.
ALGORITMO ELIM_PILA(DATO,I) Inicio I = Verdadero Si (NO PILA_VACIA()) Entonces DATO = PILA[TOPE] TOPE = TOPE - 1 Sino I = Falso Fin-Si Fin

La condicin de pila vaca se presenta cuando se trata de obtener un elemento inexistente, la cual no es una condicin de error. Esta condicin se puede considerar en el sentido de que hay una serie de recursos disponibles para procesar el DATO que se espera, en caso de que no llegue, simplemente se liberan los recursos o se inicia el proceso de los datos anteriores. Es semejante a la condicin que se presenta cuando se est procesando un archivo secuencial y se llega al fin del archivo. Destruir la Pila. Se sacan todos los elementos de la lista. Precondicin: Pila vlida. Poscondicin: Pila vaca.
ALGORITMO DEST_PILA Inicio I = Verdadero Mientras I Hacer ELIM_PILA(DATO,I) Rutina_usa (Dato) Fin-M Fin

En muchas aplicaciones es necesario vaciar la pila, para esto se incluye la rutina apropiada que utiliza DATO dentro del ciclo.

13

DISTRIBUCIN DE PILAS.
En los lenguajes de programacin, las subrutinas y los diferentes componentes de los sistemas operacionales requieren la utilizacin de varias pilas, las cuales se pueden disponer de muchas formas, buscando optimizar el uso de la memoria.

Manejo de Dos Pilas y Operaciones Primitivas.


Como se vio en la insercin, el hecho de que haya saturacin implica una terminacin anormal, perdindose todo lo procesado.

Figura 2.3 Pilas enfrentadas. El rea comn es todo el arreglo con sus M elementos. La base de la pila 1 tiene el ndice 0 y el ndice de la base de la pila 2 es M. Se debe observar la figura 2.3 y dejar claro cmo se trabajan los ndices y a que nodos apuntan. En los siguientes algoritmos se incluye la variable IP (indicador de pila) que dir sobre cual de las dos pilas se debe realizar la operacin. Iniciacin de las Pilas. Precondicin: Arreglo vlido. Poscondicin: Las dos pilas en condicin de pila vaca.
INIC2PILAS Inicio BASE1 = 0; TOPE1 = BASE1 BASE2 = M; TOPE2 = BASE2 Fin

Prueba de Pila Vaca Precondicin: IP solo puede timar valores 1 o 2. Poscondicin: No hay cambio en la pila. Vaca queda en V si la pila IP est vaca sino vaca queda en F.
ALGORITMO 2PILASVAC(IP,VACIA) Inicio Si (IP=1) Entonces Si (BASE1 = TOPE1) VACIA = V Sino VACIA = F

14

Fin-Si Sino Si (BASE2 = TOPE2) VACIA = V Sino VACIA = F Fin-Si Fin-Si Fin

Acceder al Elemento de una de las Dos Pilas Precondcin: IP solo puede tomar valores de 1 o 2. Poscondicin: Si hay datos en la pila IP, I es falso, y en Dato queda copia del elemento indicado por el tope de la pila IP, sino I es verdadero.
ACC2PILAS(DATO,IP,I) Inicio I = V 2PILASVAC(IP,VACIA) Si (VACIA) Entonces I = F Sino Si (IP=1) Entonces DATO = PILA[TOPE1] Sino DATO = PILA[TOPE2] Fin-Si Fin-Si Fin

Insertar un Dato en una de las Dos Pilas. Precondicin: IP es 1 o 2, no hay saturacin mientras ( TOPE1+1) < TOPE2. Poscondicin: Insercin de DATO en una de las dos pilas o la imposibilidad de hacerlo, I=FALSO.
ALGORITMO INSER2PILAS(DATO,IP,I) Incio I = F Si ((TOPE1+1) < TOPE2) Entonces Si (IP=1) Entonces TOPE1 = TOPE1 + 1 PILA[TOPE1] = DATO Sino TOPE2 = TOPE2 - 1 PILA[TOPE2] = DATO Fin-Si Sino I = V Fin-Si Fin

15

Eliminar un Elemento de una de las Pilas Precondicin: IP solo puede tomar los valores 1 o 2. Poscondicin: Se elimina el elemento tope de pila IP.
ALGORITMO ELIM2PILAS(DATO,IP,I) Inicio I = V 2PILASVAC(IP,VACIA) Si (NO VACIA) Entonces Si (IP = 1) Entonces DATO = PILA[TOPE1] TOPE1 = TOPE1 - 1 Sino DATO = PILA[TOPE2] TOPE2 = TOPE2 + 1 Fin-Si Sino I = F Fin-Si Fin

Destruir una de las Pilas. Precondicin: Poscondicin: Se elimina el elemento tope de pila IP.
ALGORITMO DESTR2PILAS(IP) Incio Si (IP = 1) Entonces Mientras I Ejecute ELIM_2PILAS(DATO,IP,I) Rutina_Usa(Dato) Fin-M Sino Mientras I Ejecute ELIM_2PILAS(DATO,IP,I) Rutina_Usa(Dato) Fin-M Fin-Si Fin

16

2.2 COLAS.
Es una lista de proceso restringido en la cual las inserciones se hacen por un extremo llamado "ltimo" y las eliminaciones se hacen por el otro extremo llamado "delantero". Por ejemplo, los aviones que esperan despegar de un aeropuerto forman una cola, el que llega a la pista queda de ltimo y el que va a despegar est de delantero en la cola. Se dice que una cola tiene poltica FIFO(First In, First Out) El primer elemento en entrar ser el primero en salir.

COLA SECUENCIAL
Aqu se trabaja la cola como una lista secuencial de acceso restringido, dentro del arreglo COLA. Para su manejo se requieren dos ndices, ULTIMO que indica el ltimo elemento insertado en la cola, y DELANTERO que indica el primer elemento de la cola.

Figura 2.4 Cola, se inserta por el ltimo y se suprime por delante. El apuntador U, ltimo, apunta al ltimo elemento insertado. El apuntador D, delantero, apunta al primer elemento en la cola

OPERACIONES CON COLAS


Sobre una cola se pueden efectuar las siguientes operaciones primitivas, similares a las operaciones de la pila: 1. 2. 3. 4. 5. 6. Iniciar una cola Probar si la cola est vaca Acceder al elemento delantero de la cola Insertar un elemento en la cola Eliminar el elemento delantero de la cola Destruir la cola

INICIAR COLA. Se tiene un arreglo COLA asignado para almacenar la cola, con M posiciones disponibles. Precondicin: Arreglo vlido Poscondicin: Se tiene condicin de cola vaca
INIC-COLA Inicio D = 0 U = D Fin

17

PROBAR SI LA COLA EST VACA Precondicin: Arreglo vlido Poscondicin: Si la cola est vaca retorna verdadero, sino falso.
ENTERO COLA_VACIA() Inicio Si (D = 0) Entonces RETORNA V Sino RETORNA F Fin-Si Fin

ACCEDER A UN ELEMENTO EN LA COLA Precondicin: Arreglo vlido Poscondicin: Se saca en DATO el elemento que indica D, sino I es falso.
ACCED-COLA(DATO,I) Inicio I = V Si (NO COLA_VACIA()) Entonces DATO = COLA[D] Sino I = F Fin-Si Fin

INSERTAR UN ELEMENTO EN LA COLA. Se coloca DATO en el nodo siguiente al ltimo, quedando como ltimo. Es posible que no se pueda hacer la insercin debido a que no hay espacio. La variable I indica si se pudo o no hacer la insercin. Precondicin: Que exista la cola Poscondicin: La cola queda con un elemento adicional DATO, que queda como ltimo elemento de la cola, o hay terminacin normal.
INSER-COLA(DATO,I) Inicio I = V Si (U > M) Entonces I = F Sino Si (COLA_VACIA()) Entonces D = 1 U = D Sino U = U + 1 Fin-Si COLA[U] = DATO Fin-Si Fin

18

ELIMINAR UN ELEMENTO DE LA COLA. Se elimina el elemento que est de delantero en la cola. Precondicin: Que haya cola. Poscondicin: Se elimina el primer elemento de la cola, si existe, sino, I = falso.
ELIM-COLA(DATO,I) Inicio Si (COLA_VACIA()) Entonces I = F Sino Dato =Cola [D] I = V Si (D == U) Entonces U = 0 D = U Sino D = D + 1 Fin-Si Fin-Si Fin

DESTRUIR LA COLA Precondicin: Cola vlida. Poscondicin: Cola vaca.


DESTRU-COLA(IP) Inicio I=V Mientras I Ejecute ELIM-COLA(DATO,I) Rutina-Usa(Dato) Fin-M Fin

2.3 COLAS CIRCULARES.


Observemos que en el numeral anterior, al hacer eliminaciones, se va corriendo el apuntador D, y las inserciones tambin van desplazando el apuntador U, llegando incluso a condiciones de saturacin, cuando hay memoria desperdiciada. Una solucin a este inconveniente es formar una cola circular. Es decir, hacer un manejo de ndices.

Figura 2.5 Despus de que U = M se U = 1. 19

Figura 2.6 Si se presenta una insercin, hay saturacin. Los algoritmos de iniciacin, prueba, acceso y destruccin de la cola son similares a los del caso anterior. Los de insercin y eliminacin vara por la condicin inicial: U=0 U=D; y por la condicin de saturacin: D=U. INSERCIN EN COLA CIRCULAR Aunque es similar al de insercin en colas comunes, se debe considerar, cuando U = M, para enviarlo a 0. Tambin se debe tener en cuenta la nueva condicin de saturacin. Precondicin:Que haya cola. Poscondicin: D apunta al nuevo nodo, si hay espacio, sino, I =falso.
INSER-COL-CIR(DATO,I) Inicio I = V Si (COLA_VACIA() Entonces D = 1 U = 1 COLA[U] = DATO Sino U = U+1 Si (U = M) Entonces U = 1 Sino Fin-Si Si (D=U) Entonces I = F Sino COLA[U] = DATO Fin-Si Fin-Si Fin

ELIMINAR EL NODO DELANTERO DE LA COLA

Figura 2.7 (a) Condicin inicial crtica (b) Condicin final una vez se ha eliminado el nodo delantero 20

Precondicin: Que haya cola. Poscondicin: U apunta al ltimo elemento de la cola, si hay elementos, sino, queda la cola en condicin de cola vaca.
ALGORITMO ELIM-COLA-CIR(DATO,I) Inicio I = V Si (COLA_VACIA()) Entonces I = F Sino DATO = COLA[D] Si (D=U) Entonces D = 0 U = D Sino D = D + 1 Si (D = M) Entonces D = 1 Sino Fin-Si Fin-Si Fin-Si Fin

21

2.4 APLICACIONES DE LISTAS RESTRINGIDAS.


Son muchas las aplicaciones de estas listas restringidas, en especial en sistemas operativos, compiladores e interpretadores. Vamos a trabajar una aplicacin universal, la evaluacin de una expresin. ALGORITMO DE NOTACIN INFIJA A POSFIJA La gran mayora de lenguajes representa las expresiones aritmticas en la llamada forma INFIJA, en la cual los operadores se encuentran dentro de los operandos. Otra manera de hacerlo es usando notacin POSFIJA o POLACA. En este tipo de notacin los operadores aparecen despus de los operandos, as se facilita la evaluacin de la expresin. Vamos a suponer que se tienen los siguientes operadores, con sus respectivas prioridades. ... Asignacin Suma, Resta Multiplicacin, Divisin Potencia Operador Prioridad = 0 +,1 *,/ ^ 2 3

El algoritmo analiza carcter a carcter la expresin infija, de izquierda a derecha y sigue el siguiente manejo: 1. Todos los operandos pasan directamente a una cola salida. 2. Los operadores van a una pila. Su posicin depende de los que haya en el tope de la pila: Si el operador que entra, tiene mayor prioridad que el operador que est en el tope de la pila, se coloca en el tope de la pila. Si el operador que entra es de prioridad menor o igual al del tope de la pila, la pila se desocupa enviando los operadores a la cola, hasta que el operador tenga mayor prioridad al del tope de la pila. 3. Si es un parntesis izquierdo "(", se manda a la pila. 4. Si es un parntesis derecho ")", se desocupa la pila hasta encontrar el parntesis izquierdo y se mandan los operadores a la cola de salida. 5. Desocupar la pila. La expresin infija que se va a convertir a posfija, se encuentra en un arreglo X, con N posiciones, donde X[J], J=1,...,N; es una letra (operando), un parntesis izquierdo o derecho, o uno de los operadores = , +, -, *, /, ^ Observaciones sobre la expresin infija. 1. Se supone que la entrada es una expresin infija vlida. 22

2. Los operandos consisten de una sola letra 3. No se espera la entrada de constantes ni de referencia a funciones 4. No deben aparecer funciones unarias. Se define una funcin de prioridad P: P( ) ) = -1 P(( ) = -1 P( = ) = 0 P(+) = 1 P(-) = 1 P(*) = 2 P(/) = 2 P(^) = 3

ALGORITMO INF-A-POSF Precondicin: nicamente los caracteres ya definidos. Poscondicin:


Comience CREA_PILA D = 0 TOPE = 0 INSER-PILA( ,I) Si (I) Entonces J = 1 K = 1 Mientras (K < N) Ejecute Si (X[K] = LETRA) Entonces Y[J] = X[K] J = J+1 Sino Si (X[K] = ")" ) Entonces Mientras (PILA [TOPE]) <> "(" ) Ejecute Y[J] = PILA[TOPE] J = J+1 TOPE = TOPE - 1 Fin-Mientras TOPE = TOPE - 1 Sino Mientras (P(X[K])<= P(PILA[TOPE]) Ejecute Y[J] = PILA[TOPE] J = J+1 TOPE = TOPE-1 Fin-Mientras TOPE=TOPE+1 PILA[TOPE] = X[K] Fin-Si Fin-Si K=K+1 Fin-Mientras Mientras [(PILA[TOPE]) <>(I)] Ejecute Y[J] = PILA[TOPE] J = J+1 TOPE = TOPE -1 Fin-Mientras

23

Sino Fin-Si Termine

ALGORITMO DE EVALUACIN EN NOTACIN POSFIJA En este caso se tiene una expresin aritmtica en notacin posfija se encuentra en un arreglo X. Cada X(J), J=1,...N., puede ser una letra o un operador (<= , +, -, *, /, ). Los operandos se van guardando en una pila hasta cuando se encuentra un operador, que hace que se ejecute esa operacin entre los dos nodos operandos que se tengan en los nodos superiores de la pila. El resultado se guarda en el tope de la pila. ALGORITMO EVAL-POL Precondicin: Poscondicin:
Comience TOPE = 0 K = 1 Mientras (K<=N) Ejecute Si (X[K] = OPERANDO) Entonces TOPE = TOPE +1 PILA[TOPE] = X[K] Sino AUX1 = PILA[TOPE] TOPE = TOPE-1 AUX2 = PILA[TOPE] AUX3 = AUX2 (X[K]) AUX1 PILA[TOPE] = AUX3 Fin-Si K = K +1 Fin-Mientras Termine

Evaluacin de una expresin Vamos a seguir los dos algoritmos anteriores para la evaluacin de la siguiente expresin: G = ((AB)*C)+(D/(E ^F)) 1. Conversin a Posfija. X . 1 2 3 4 COLA . G G G G PILA

= =( =(( 24

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

GA GA GAB GABGABGAB-C GAB-C* GAB-C* GAB-C* GAB-C*D GAB-C*D GAB-C*D GAB-C*DE GAB-C*DE GAB-C*DEF GAB-C*DEF^ GAB-C*DEF^/ GAB-C*DEF^/+ GAB-C*DEF^/+=

=(( =((=((=( =(* =(* = =+ =+( =+( =+(/ =+(/( =+(/( =+(/(^ =+(/(^ =+(/ =+

2. Evaluacin de la notacin Posfija, donde A=4, B=1, C=5, D=64 , E=2, F=5 X COLA 1 G 2 GA 3 GAB 4 G3 5 G3C 6 G 15 7 G 15 D 8 G 15 D E 9 G 15 D E F 10 G 15 D 32 11 G 15 2 12 G 17 13 17 PILA G G4 G41 G3 G35 G 15 G 15 64 G 15 64 2 G 15 64 2 5 G 15 64 32 G 15 2 G 17 17

25

TEMA 3

ARCHIVOS, REGISTROS Y CAMPOS


OBJETIVOS Estructurar la informacin con el soporte fundamental para el almacenamiento externo de datos. Aprovechar de una forma eficiente el medio de almacenamiento secundario de datos. CONTENIDO 3.1 Archivos 3.2 Registros y Campos 3.3 Archivos Secuenciales y Directos

3.1 ARCHIVOS
Un archivo es un conjunto de registros relacionados entre s, que forman una entidad, que se puede identificar y manipular de modo unitario. Un archivo almacena grandes volmenes de informacin en unidades externas (Floppy, HD, Cintas ..).

3.2 TIPOS DE ARCHIVOS.


ARCHIVOS SECUENCIALES. Son aquellos en los que los registros se graban unos a continuacin de otros y el acceso a un registros determinado, necesita forzosamente el paso por todas los registros anteriores. CAMPOS DE LONGITUD VARIABLE. Se realiza este tipo de definicin de campos de longitud variable, con el objetivo principal de ahorro de memoria, ya que con campos de longitud fija se realiza un desperdicio de memoria. Para la implementacin de este tipo de campos se lo realiza con archivos de tipo texto. Existen dos mecanismos de implementacin: USO DE DELIMITACIONES DELIMITADOR DE CAMPOS : Existe un smbolo especfico para delimitar los campos ( , ; *) DELIMITADOR DE REGISTROS : Smbolo diferente al delimitador de campo. Ejemplo : 26

Nombre Direccin

Edad

Lista de Materias

$CLAUDIA, BALLIVIN@ 17, SIS-2204, SIS-1103$ANA, LA PAZ@17, SIS-1103, MAT- 2207

SUBCAMPO DE LONGITUD Registro con un numero constante de campos. Ejemplo : Nombre Direccin Edad Lista de Materias

7 CLAUDIA, 9 BALLIVIN, 2 17, 8 SIS-2204, 8 SIS-1103, 8 MAT- 2207 Para distinguir algunos registros que contienen los mismos campos se recurre a un campo que contiene informacin nica o diferente que se le llama clave. ARCHIVOS DIRECTOS. Son aquellos en los que los registros se pueden localizar mediante una direccin. El acceso a los registros es directo. CAMPOS DE LONGITUD FIJA. Los campos definidos de esta manera son almacenados en memoria con una longitud fija de datos, sin importar si se realiza el uso parcial o completo del campo. OPERACIONES SOBRE ARCHIVOS Creacin. Consiste en la grabacin, por primera vez, en un soporte de los registros de un determinado archivo. Apertura y Cierre. Un archivo debe poseer las condiciones necesarias para ser abierto, manipularse y tener acceso a los registros. Para evitar deterioros de informacin el archivo es cerrado durante el tiempo que no se utiliza y no debe permitir su acceso. Borrado. Es la eliminacin de todo el archivo, se puede hacer prohibiendo definitivamente su acceso o destruyendo la informacin que hay en el. Ordenamiento o Clasificacin. Es lograr una nueva disposicin en el soporte de los registros de un archivo, con una secuencia de ubicacin determinada por el valor de sus campos. Este orden puede ser ascendente o descendente. Copiado o Duplicacin. Consiste en crear un archivo idntico a otro y existencte, sin que se afecte el original.

27

Concatenacin. Consiste en obtener de dos archivos, con la misma estructura, un archivo que contenga ambos, de manera que queden uno a continuacin del otro. Interseccin. Consiste en formar un nico archivo mediante los registros comunes de dos archivos distintos. Funcin o Intercalacin. Llamada mezcla, consiste en obtener de dos archivos ordenados por un mismo campo y con la misma estructura, otro archivo que contenga los registros de ambos y mantenga su ordenacin. Particin. Consiste en dividir un archivo en dos, de acuerdo a alguna caracterstica determinada de sus registros. Compactacin o Empaquetamiento. Consiste en reorganizar todos los registros de un archivo, ocupando todos los huecos de memoria existentes entre ellos, dejen libres fuera de la parte de soporte ocupada por el archivo todos los espacios correspondientes que hallan sido eliminados del mismo.

3.3 REGISTROS Y CAMPOS.


REGISTROS. Un registro es un conjunto organizado de datos del mismo o diferente tipo, que estan relacionados entre s por contener informacin relativa a una entidad particular y superior, de la que forman parte y los unifica. Los registros estn compuestos por campos. Un campo es una unidad mnima de informacin, dentro del registro, independiente de las dems. Representa un concepto global en la finalidad unitaria del registro y se caracteriza por el tipo de datos asociados y el tamao de memoria que necesita para su almacenamiento. El campo se puede dividir en subcampos. CAMPOS. Los componentes de un registro se denominan campos, los campos son los atributos de los objetos de estudio, cada campo tiene los siguientes atributos. Nombre ( identificador ) de campo que es elegido por el programador. Contenido o valor. Ubicacin dentro del registro. Longitud o dimensin.

TIPOS DE CAMPOS. Existen tres tipos de campos Longitud fija. Longitud variable Campos mltiples 28

TIPOS DE REGISTROS Registro Lgico. Cada uno de los componentes de un archivo que posee una estructura para almacenar informacin referente a un tema general del archivo. Diseado por el programador. Registro Fsico. Informacin que el sistema puede transferir como una unidad, en una sola operacin de entrada o salida. Registros segn la longitud de sus campos: Registros de Longitud Fija. Su tamao no vara. En cuanto a su estructura interna, el registro puede tener el mismo nmero de campos de igual longitud cada uno, o diverso nmero de campos de diferentes longitudes. En ambos casos la suma de las longitudes de los campos es la misma para cada registro. Registros de Longitud Variable. Su tamao vara de un registro a otro. Su longitud variable puede estar determinada por un valor mximo o tambin sin ninguna limitacin. Entre las agrupaciones estructuradas de registros se tienen los archivos de datos y las bases de datos. OPERACIONES SOBRE REGISTROS. Aqu se analizan las operaciones que solo afectan a algunos registros. Todas estas operaciones necesitan la operacin de bsqueda como preliminar para localizar los registros deseados. Recuperacin (Consultas y Listados). Consiste en acceder a los registros de un archivo para obtener una informacin determinada, almacenada en el.

Consultas: Se accede a uno o varios registros determinados de un archivo y se visualiza el contenido de sus campos, por impresora o pantalla. Listados: La visualizacin de la informacin es una lista ordenada.

Actualizacin o Mantenimiento. Consiste en introducir nuevos datos en el archivo o en eliminar o modificar los ya existentes.

Inserciones: Se introducen uno o varios registros en un archivo, ya creado, al final o en cualquier lugar del mismo. Borrados: Se eliminan uno o varios registros del archivo, borrando su contenido definitivamente o prohibiendo su acceso. Modificaciones: Consiste en cambiar los datos de uno o varios campos de cualquier registro de archivo.

29

TEMA 4

TRATAMIENTO DE ARCHIVOS
OBJETIVOS Desarrollar las operaciones bsicas sobre la informacin almacenada en un medio secundario. Desarrollar nuevos mecanismos de procesamiento de acuerdo a las caractersticas del problema. CONTENIDO 4.1 Introduccin 4.2 Operaciones en Archivos 4.3 Particin de Archivos 4.4 Mezclas de Archivos 4.5 Mtodos Ordenacin Externa

4.1 INTRODUCCION
Un archivo es una coleccin de registros, donde cada registro esta conformado por un conjunto de campos. El objetivo principal del siguiente tema es realizar las siguientes operaciones para el tratamiento de archivos: 1. Almacenamiento de informacin. 2. Recuperacin de informacin. 3. Actualizacin de la informacin. Se hace nfasis en la recuperacin de la informacin, debido a que esta es imprescindible para el usuario, para contar con informacin en forma inmediata, para lo cual se toca el tema de mtodos de ordenacin externa.

4.2 OPERACIONES SOBRE ARCHIVOS


Las operaciones bsicas sobre archivos son: 1. 2. 3. 4. Adicin de datos Eliminacin de datos Consultas Bsquedas

Existen otras operaciones complejas, las cuales son: 1. Particin de Archivos 2. Mezcla o fusin de Archivos

30

Estas ltimas son operaciones auxiliares, necesarias para los mtodos de ordenacin externa.

ADICION DE DATOS
Una de las tareas mas comunes en archivos es la adicin de datos, se puede aadir datos de dos maneras a un archivo: 1. Adicin de datos en desorden 2. Manteniendo el orden del archivo

ADICION DE DATOS EN DESORDEN (al final).


Pasos a realizar para aadir un registro en un archivo: 1. Leer Dato. 2. Buscar Dato en el Archivo. 3. Si existe entonces: mostrar ' Ya Existe '.

Si no : Aadir el dato al final del Archivo

ADICION DE DATOS EN ORDEN


Para aadir un registro manteniendo el orden del archivo, es necesario el uso de un archivo auxiliar. Se deben seguir los siguientes:

31

ELIMINAR DATOS
Se puede eliminar datos de dos maneras: 1. Eliminar lgicamente 2. Eliminara fsicamente

FSICAMENTE:
En este tipo de eliminacin es necesario usar un archivo Auxiliar, por lo que este proceso es lento, y por lo tanto no es usado con frecuencia.

LOGICAMENTE:
Este tipo de eliminacin ahorra tiempo cuando se usa grandes volmenes de informacin. Ya que se cuenta con un campo adicional, que permite marcar el registro como eliminado.

32

Muchas aplicaciones usan primeramente la eliminacin lgica, y al finalizar el da utilizan la eliminacin de fsica. Esto por ser ms rpida la eliminacin lgica que la eliminacin fsica.

CONSULTAS DE DATOS
Se recupera la informacin sin alterar el estado del registro, para lo cual debe existir un criterio de seleccin de la informacin.

CRITERIOS DE SELECCIN
Consulta Simple: Cuando la clave del registro es especfica y hace referencia a un solo registr. Ejemplo:
Mientras no eof (F) y reg <= clave hacer Leer (F,reg) SI Nombre = 'Veronica' ENTONCES ...... FIN SI Fin mientras

Consultas con rango: El valor de la clave especificada hace referencia a un conjunto o rango de registros. Ejemplo :
Mientras no eof (F) y reg <= clave hacer Leer (F,reg) SI Edad > 17 ENTONCES ...... FIN SI Fin mientras

Consulta funcional: La clave hace referencia a valores que responden, a la evaluacin de un proceso o fusin. Ejemplo:
Mientras no eof (F) y reg <= clave hacer Leer (F,reg) SI Edad = prom(Edad) ENTONCES ...... FIN SI

33

Fin mientras

Consulta lgicas: Una combinacin de las tres anteriores por medio de operaciones logicas. Ejemplo:
Mientras no eof (F) y reg <= clave hacer Leer (F,reg) SI Edad = prom(Edad) or Nombre ='Martha' ENTONCES ...... FIN SI Fin mientras

BUSQUEDA DE DATOS
Existen dos formas de bsqueda de datos: 1. Secuencial en un archivo ordenado 2. Secuencial en un archivo desordenado

BSQUEDA SECUENCIAL EN UN ARCHIVO ORDENADO


Se realiza el recorrido de los registros de archivo hasta el incumplimiento de una condicin o que finalice el archivo. Ejemplo: Realizar la bsqueda del registro, donde Dato='MARIA'.

Inicio Leer Clave Abrir (F,Lectura) Leer (F,reg) Mientras no eof (F) y reg <= clave hacer Leer (F,reg) Fin mientras Si reg=clave Entonces Mostrar " Existe el dato" Si no Mostrar "No existe el dato" Fin si Cerrar (F) Fin

34

BSQUEDA SECUENCIAL EN UN ARCHIVO DESORDENADO


Se realiza el recorrido de los registros hasta encontrar el registro o hasta que se finalice el archivo. Ejemplo: Realizar la bsqueda del registro, donde Dato='MARIA'.

ALGORITMO
Inicio Leer Dato Abrir (F,Lectura) Leer (F,reg) Mientras no eof (F) y reg <> clave hacer Leer (F,reg) Fin mientras Si reg=clave Entonces Mostrar " Existe el dato" Si no Mostrar "No existe el dato" Fin si Cerrar (F) Fin

4.3 PARTICION DE ARCHIVOS


A partir de un archivo se genera dos o ms archivos de trabajo

Existen tres tipos de particin de archivos: 1. Particin por el contenido 2. Particin por una secuencia ' P ' dada. 3. Particin por secuencias ordenadas.

35

PARTICION POR CONTENIDO


Se debe establecer un criterio de particin, para determinar que registros de F1 se destinan al archivo F2. Donde el archivo F1 es solo lectura y el archivo F2 para escritura. Ejemplo: Crear un archivo llamado CARRERA seleccionando Clave = 'SIS' del Archivo FNI.

ALGORITMO
Inicio Leer Clave Abrir FNI (Lectura) Abrir Carrera (Escritura) Mientras no eof (FNI) Hacer Leer (FNI, Reg) Si Reg = Clave Entonces Grabar (Carrera, Reg) Fin si Fin Mientras Cerrar (FNI) Cerrar (Carrera) Fin

PARTICION POR UNA SECUENCIA " P " DADA


Se establece un numero entero P que ndica las secuencias para realizar la particin. Se copia 'P' registros de Arch a Arch1, luego los siguientes 'P' registros de Arch a Arch2, esto se repite hasta terminar de leer el archivo Arch Ejemplo: Realizar la particin del archivo ARCH en dos archivos ARCH1 y ARCH2, utilizando la secuencia de particin (P = 2).

36

ALGORITMO
Inicio Leer (P) Abrir Arch(Lectura) Abrir Arch1(Escritura) Abrir Arch2(Escritura) Mientras no eof (Arch) Hacer Copiar_Secuencia(Arch, Arch1, P) Si no eof (Arch) Entonces Copiar_Secuencia(Arch, Arch2, P) Fin si Fin Mientras Cerrar (Arch) Cerrar (Arch1) Cerrar (Arch2) Fin Copiar_Secuencia (Var x, y : Archivo; P: entero) Inicio Cont = 0 Mientras (no eof (x)) y (cont < P ) Hacer Leer (x, Reg) Grabar (y, Reg) Cont = Cont +1 Fin mientras Fin

PARTICIN DE ARCHIVOS POR TRAMOS ORDENADOS


Se toma primeramente un tramo ordenado del archivo C y se copia al archivo A, luego se toma otro tramo ordenado del archivo C para copiarlo al archivo B este proceso se repite hasta que finalice de leer todo el archivo C. Ejemplo: Particionar el archivo C en dos archivos A y B por secuencias ordenadas.

ALGORITMO
Inicio Abrir A (Lectura) Abrir B (Lectura) Abrir C (Escritura) Mientras no eof (C) Hacer Copiar_Tramo (C, A ) Si no eof (C) Entonces Copiar_Tramo (C, B )

37

Fin si Fin Mientras Cerrar (A) Cerrar (B) Cerrar (C) Fin Copiar_Tramo (Var x, y : Archivo) Inicio Repetir Copiar_Dato ( x, y ) Hasta Fin_Tramo Fin Copiar _Dato ( Var x, y :Archivo) Inicio Si eof (x) Entonces Fin_Tramo = TRUE Si no Leer (x, Reg) Grabar (y, Reg) Si eof (x) Entonces Fin_Tramo = TRUE Si no Pos = File Pos (x) Leer (x, Reg1) Seek (x, Pos) Fin_Tramo = Reg > Reg1 Fin si Fin si Fin

4.4 MEZCLAS DE ARCHIVOS


El proceso de unir dos o ms archivos se le denomina mezcla de archivos.

Existen tres tipos al igual que en particiones: 1. Mezcla por Contenido Total. 2. Mezcla por Secuencias " P ". 3. Mezcla por Secuencias Ordenadas.

38

MEZCLA POR CONTENIDO TOTAL


Se procede a la unin de dos archivos A, B en un archivo C, este proceso se los realiza primeramente copiando toda la informacin de A al C y posteriormente B al C. Ejemplo: Mezclar los Archivos A, B en un tercer archivo C.

ALGORITMO
Inicio Abrir A (Lectura) Abrir B (Lectura) Abrir C (Escritura) Mientras no eof (A) Hacer Leer (A, Reg) Grabar (C, Reg) Fin Mientras Mientras no eof (B) Hacer Leer (B, Reg) Grabar (C, Reg) Fin Mientras Cerrar (A) Cerrar (B) Cerrar (C) Fin

MEZCLA POR SECUENCIAS " P "


Se establece un numero entero 'P', que indica las secuencias para realizar la mezcla de dos archivos. El resultado de la mezcla es una secuencia ordenada de datos. Ejemplo: Realizar la Mezcla de A, B en un tercer archivo C, utilizando las secuencias P = 2 para realizar dicha operacin.

39

ALGORITMO
Inicio Leer (P) Abrir A (Lectura) Abrir B (Lectura) Abrir C (Escritura) Mientras no eof (A) y no eof (B) Mezclar_SecP Fin Mientras Mientras no eof (A) Hacer Copiar_SecP (A, C, P) Fin Mientras Mientras no eof (B) Hacer Copiar_SecP (B, C, P) Fin Mientras Cerrar (A) Cerrar (B) Cerrar (C) Fin Mezclar_SecP Inicio SecA =0; SecB=0 Repetir PosA = FilePos(A);Leer(A, RegA);Seek (A, PosA) PosB = FilePos(B);Leer(B, RegB);Seek (B, PosB) Si RegA < RegB Entonces Copiar_SecP (A, C,P) SecA=SecA+1 Si SecA=P Entonces Copiar_SecP (B, C,P-SecB) SecB =P Fin Si Si no Copiar_SecP (B, C,P) SecB=SecB+1 Si SecB=P Entonces Copiar_SecP(A, C,P-SecA) SecA =P Fin si Fin si Hasta SecA=P y SecB=P Fin Copiar_SecP (Var x, y : Archivo; P : Entero) Inicio Cont = 0 Mientras no eof (x) y Cont < P Hacer Leer (x, Reg); Grabar (y, Reg) Cont = Cont +1 Fin Mientras Fin Hacer

40

MEZCLA POR TRAMOS ORDENADAS


Se realiza la mezcla los archivos A y B en el archivo C, tomando tramos ordenados. Es decir se realiza la mezcla del primer tramo ordenado de A con la de B. Ejemplo: Realizar la mezcla A y B en un tercer archivo C, utilizando las secuencias ordenadas.

ALGORITMO
Inicio Abrir A (Lectura) Abrir B (Lectura) Abrir C (Escritura) Mientras no eof (A) y no eof (B) Mezclar_Tramo Fin Mientras Mientras no eof (A) Hacer Copiar_Tramo (A, C) Fin Mientras Mientras no eof (B) Hacer Copiar_Tramo (B, C) Fin Mientras Cerrar (A) Cerrar (B) Cerrar (C) Fin Mezclar_Tramo Inicio Repetir PosA = FilePos (A) Leer (A, RegA) Seek (A, PosA) PosB = FilePos (B) Leer (B, RegB) Seek (B, PosB) Si Reg1 < Reg2 Entonces Copiar_Dato (A, C) Si Fin_Tramo Entonces Copiar_Tramo (B, C) Fin Si Si no Copiar_Dato (B, C) Si Fin_Tramo Entonces

Hacer

41

Copiar_Tramo (A, C) Fin si Fin si Hasta Fin _Tramo Fin Copiar_Tramo ( Var x, y : Archivo) Inicio Repetir Copiar_Dato (x, y) Hasta Fin_Tramo Fin Copiar_Dato (Var x, y: Archivo) Inicio Si eof (x) Entonces Fin_Tramo = TRUE Si no Leer (x, Reg) Grabar (y, Reg) Si eof (x) Entonces Fin_Tramo = TRUE Si no Pos = File Pos (x) Leer (x, Reg1) Seek (x,Pos) Fin_Tramo = Reg > Reg1 Fin si Fin si Fin

4.5 ORDENACIN EXTERNA


Debido a la limitacin en memoria interna y a la enorme informacin que es almacenada en los archivos, no es posible utilizar los mtodos de ordenacin interna. Para lo cual existen distintos mtodos de ordenacin externa exclusivos que son las siguientes:

Ordenacin por Mezcla Directa. Ordenacin Von Newman. Ordenacin por Mezcla Equilibrada. Ordenacin por Dgitos.

Todos estos mtodos hacen el uso de archivos auxiliares, para realizar el proceso de ordenacin de archivos.

ORDENACIN POR MEZCLA DIRECTA


El mtodo solo funciona con archivos donde su longitud sea mltiplo de 2n, hace el uso de los siguientes archivos:

42

C Archivo a ordenar A,B Archivos auxiliares Se deben seguir los siguientes pasos para ordenar: 1. Partir el archivo C en la mitad, copiar la primera mitad del archivo C en el archivo A, y la otra mitad en el archivo B. 2. Mezclar los archivos auxiliares A y B por secuencias de 2n. Donde: n = 0,1,2,3... 3. Repetir los pasos 1 y 2 hasta que la secuencia sea mayor que la mitad del archivo a ordenar (secuencia{2n}> long(C)/2) Ejemplo: Ordenar los siguientes datos.

ALGORITMO
Inicio Sec = 1 Abrir C (Lectura) Repetir Abrir B (Escritura) Abrir A (Escritura) Seek (C, 0) Particionar Seek (A, 0); Seek (B, 0); Seek (C, 0) Mezclar

43

Cerrar A; Cerrar B Sec = Sec * 2 Hasta Sec > (Filesize (C) Div 2) Cerrar C Fin Particionar Inicio Max = Filesize (C) Div 2 Para J = 1 Hasta Max Hacer Leer C, Reg Grabar A, Reg Fin Para Para J = 1 Hasta Max Hacer Leer C, Reg Grabar B, Reg Fin Para Fin Mezclar Inicio Mientras no eof (A) y no eof (B) Hacer Mezclar_Sec Fin Mientras Fin Mezclar_Sec Inicio SecA = 0; SecB = 0 Repetir PosA = FilePos (A); Leer A, RegA; PosB = FilePos (B); Leer B, RegB; Si RegA < RegB Entonces Leer A, Reg Grabar C, Reg SecA =SecA + 1 Si SecA = Sec Entonces Copiar_SecP (B, C, SecB = Sec Fin si Si no Leer B, Reg Grabar C, Reg SecB = SecB + 1 Si SecB = Sec Entonces Copiar_SecP (A, C, SecA = Sec Fin si Fin si Hasta (SecA = Sec) y (SecB = Sec) Fin Copiar_SecP (Var x, y : Archivo; Sec : Entero) Inicio Cont = 0 Mientras no eof (x) y (Cont < Sec) Hacer Leer (x, Reg) Grabar (y, Reg) Cont = Cont +1;

Seek (A, PosA) Seek (B, PosB)

Sec-SecB);

Sec-SecA);

44

Fin Mientras Fin

ORDENACIN POR VON NEWMAN


El mtodo solo funciona con archivos donde su longitud sea mltiplo de 2n, hace el uso de los siguientes archivos: C Archivo a ordenar A,B Archivos auxiliares Se deben seguir los siguientes pasos para ordenar: 1. Partir el archivo C en secuencias de 2n, copiar intercaladamente las secuencias del archivo C, primeramente en el archivo A, y luego en el archivo B. 2. Mezclar los archivos auxiliares A y B por secuencias de 2n. Donde: n = 0,1,2,3... 3. Repetir los pasos 1 y 2 hasta que la secuencia sea mayor que la mitad del archivo a ordenar (secuencia{2n}> long(C)/2) Ejemplo: Ordenar los siguientes datos.

45

ALGORITMO
Inicio Sec = 1 Abrir C (Lectura) Repetir Abrir B (Escritura) Abrir A (Escritura) Seek (C, 0) Particionar Seek (A, 0); Seek (B, 0); Seek (C, 0) Mezclar Cerrar A; Cerrar B Sec = Sec * 2 Hasta Sec > (Filesize (C) Div 2) Cerrar C Fin Particionar Inicio Mientras no eof (C) Hacer Copiar_SecP (C, A, Sec) Si no eof (C) Entonces Copiar_SecP(C,B,Sec) Fin si Fin mientras Fin Copiar_SecP (Var x, y : Archivo; Sec : Entero) Inicio Cont = 0 Mientras no eof (x) y (Cont < Sec) Hacer Leer (x, Reg) Grabar (y, Reg) Cont = Cont +1; Fin Mientras Fin Mezclar Inicio Mientras no eof (A) y no eof (B) Hacer Mezclar_Sec Fin Mientras Fin Mezclar_Sec Inicio SecA = 0; SecB = 0 Repetir PosA = FilePos (A) Leer A, RegA Seek (A, PosA) PosB = FilePos (B) Leer B, RegB Seek (B, PosB)

46

Hasta Fin

Si RegA < RegB Entonces Leer A, Reg Grabar C, Reg SecA =SecA + 1 Si SecA = Sec Entonces Copiar_SecP (B, C, Sec-SecB); SecB = Sec Fin si Si no SecB = SecB + 1 Si SecB = Sec Entonces Copiar_SecP (A, C, Sec-SecA); SecA = Sec Fin si Fin si (SecA = Sec) y (SecB = Sec)

ORDENACIN POR MEZCLA EQUILIBRADA


El mtodo funciona con todo tipo de archivos, hace el uso de los siguientes archivos: C Archivo a ordenar A,B Archivos auxiliares Se deben seguir los siguientes pasos para ordenar: 1. Partir el archivo C en secuencias ordenadas, copiar intercaladamente las secuencias ordenadas del archivo C, primeramente en el archivo A, y luego en el archivo B. 2. Mezclar los archivos auxiliares A y B por secuencias ordenadas. 3. Repetir los pasos 1 y 2 hasta que la mezcla de secuencias sea igual a uno (n_tramos=1). Ejemplo: Ordenar los siguientes datos.

47

ALGORITMO
PRINCIPAL Inicio Abrir C (Lectura) Repetir Abrir A (Escritura);Abrir B (Escritura); Seek (C, 0) Particionar Seek (C, 0); Seek (A, 0); Seek (B, 0) Num_Tramos = 0 Mezclar; Cerrar A; Cerrar B Hasta Num_Tramos =1 Cerrar C Fin Particionar Inicio Mientras no eof (C) Hacer Copiar Tramo (C, A) Si no eof (C) Entonces Copiar_Tramo(C,B) Fin si Fin mientras Fin Copiar_Tramo (x, y : Archivo) Inicio Repetir Copiar_Dato (x, y) Hasta Fin_Tramo Fin Copiar_Dato (var x, y : Archivo) Inicio Si eof (x) Entonces Fin_Tramo = TRUE Si no Leer (x), Reg Grabar (y), Reg Si eof (x) Entonces Fin_Tramo = TRUE Si no Pos = FilePos (x) Leer (x), Reg1) Seek (x, Pos ) Fin_Tramo = Reg > Reg1 Fin si Fin si Fin Mezclar Inicio Mientras no eof (A) y no eof (B) Hacer Mezclar_Tramos Num_Tramos = Num_Tramos + 1 Fin Mientras

48

Mientras no ef (A) Hacer Copiar_Tramo (A, C) Num_Tramos = Num_Tramos + 1 Fin Mientras Mientras no ef (B) Hacer Copiar_Tramo (B, C) Num_Tramos = Num_Tramos + 1 Fin Mientras Fin Mezclar_Tramo Inicio Repetir PosA = File Pos (A); Leer (A, RegA); Seek (A, PosA) PosB = File Pos (B); Leer (B, RegB); Seek (B, PosB) Si RegA < RegB Entonces Copiar_Dato (A, C) Si Fin_Tramo Entonces Copiar_Tramo (B, C) Fin Si Si no Copiar_Dato (B, C) Si Fin_Tramo Entonces Copiar_Tramo (A, C) Fin si Fin si Hasta Fin _Tramo Fin

ORDENACIN POR DIGITOS


El mtodo funciona solo con archivos que almacenan datos numricos con cifras elevadas, hace el uso de los siguientes archivos: C Archivo a ordenar A0, A1..., A9 Archivos auxiliares Se deben seguir los siguientes pasos para ordenar: 1. Partir el archivo C de acuerdo al digito inspeccionado, ejemplo si el digito inspeccionado es 1 este dato debe copiarse al archivo A1. Se debe empezar inspeccionando por la posicion de la unidad, decena, centena...etc. 2. Mezclar los 10 archivos auxiliares A0..A9 en orden, empezando del archivo A0 y finalizando en el archivo A10. 3. Repetir los pasos 1 y 2 hasta que se haya inspeccionado todos los dgitos, es decir unidades, decenas, centenas, etc.

49

Ejemplo:Ordenar los siguientes datos.

ALGORITMO
FUNCION PRINCIPAL Var Arch : [0....9] of Archivo Inicio Abrir C (Lectura) Dig = 0 Repetir Abrir_Archivos Seek (C, 0) Particionar Para I = 0 Hasta 9 Hacer Seek (Arch [ i ], 0) Seek (C, 0) Mezclar Dig = Dig + 1 Cerrar_Archivos Hasta Dig > 4 Cerrar C Fin Particionar Inicio Mientras

no eof (C) Hacer

50

Leer C, Reg Aux = Reg Div (Exp(Dig * Ln (10))) Pos = Aux Mod 10 Grabar Arch [Pos], Reg Fin Mientras Fin Mezclar Inicio Para I = 0 Hasta 9 Hacer Mientras no eof (Arch [I]) Hacer Leer Arch [I], Reg Grabar C, Reg Fin Mientras Fin Para Fin Abrir_Archivos Inicio Para I = 0 Hasta 9 Hacer NOMBRE = 'DATOS'+ CHR(48 + i)+ '.DAT' Abrir Arch [i] (Escritura) Fin Para Fin Cerrar_Archivos Inicio Para I = 0 Hasta 9 Hacer Cerrar Arch [ i ] fin Para Fin

51

TEMA 5

LISTAS ENCADENADAS
OBJETIVOS Emplear estructuras dinmicas de datos en el procesamiento de la informacin. Desarrollar algoritmos para optimizar las operaciones bsicas que se llevan a cabo en proceso de ejecucin en estructuras lineales. CONTENIDO 5.1 Introduccin 5.2 Lista Simplemente Enlazada 5.3 Listas Simplemente Enlazadas Circulares 5.4 Listas Doblemente Enlazadas 5.5 Listas Doblemente Enlazadas Circulares

5.1 LISTAS ENCADENADAS


Las listas enlazadas son estructuras de datos lineales, que constan de una secuencia de nodos que se encuentran enlazados uno con otro, mediante un enlace o puntero.

La adicin / eliminacin en estas estructuras de datos, se realiza en tiempo de ejecucin y en forma dinmica.

La cantidad de nodos que una lista enlazada puede contener esta limitada por la memoria del computador.

TIPOS DE LISTAS.
Existen los siguientes tipos de listas enlazadas: Listas simplemente enlazadas

52

Listas simplemente enlazadas circulares

Listas doblemente enlazadas

Listas doblemente Enlazadas circulares

5.2 LISTAS SIMPLEMENTE ENLAZADAS


Una lista simplemente enlazada se representa tal como se muestra en la siguiente grafica:

Donde: El nodo Raz es un puntero al primer elemento de la lista. Cada elemento (nodo) de la lista simplemente enlazada debe tener dos campos:

Un campo informacin (info) que contiene el valor de ese elemento y puede contener cualquier tipo estndar o definido por el usuario. Un campo enlace (o puntero) que indica la posicin del siguiente elemento de la lista.

NODO
53

Existe una marca para fin de lista, que es la constante NIL, tambin representada por una barra inclinada o el signo elctrico de tierra. Declaracin de un nodo usando el lenguaje Pascal:
Type pnodo = ^nodo nodo = record info : Integer; Sig :pnodo; End;

Declaracin de un nodo usando el lenguaje C:


struct Nodo { int info; struct Nodo *sig; };

OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS


Como cualquier estructura de datos, en las listas simplemente enlazadas se puede realizar las siguientes operaciones bsicas:

Insercin Eliminacin Bsqueda Recorrido

RECORRIDO
Para realizar el recorrido en una lista simple, es necesario el uso de un puntero auxiliar ACT, con la cual se visita toda la lista, empezando por la RAIZ y finalizando cuando el puntero ACT apunta a NIL.

ALGORITMO:
Recorrido(Dato:Integer) Inicio Actual = Raz Mientras(Actual <> Nil) hacer Actual =Actual^.sig

54

Mostar Actual^.inf Fin Mientras Fin.

BUSQUEDA
Para realizar la bsqueda en una lista simple, es necesario el uso de un puntero auxiliar ACT, con la cual se busca empezando por la RAIZ y finalizando cuando el puntero ACT apunta al elemento buscado o a NIL.

ALGORITMO:
Buscar(Dato:Integer) Inicio Actual = Raz Mientras(Actual<>Nil) y (Actual^.inf<>Dato) hacer Actual =Actual^.sig Fin Mientras Si Actual^.inf = Dato entonces Mostar "El Dato Esta en la Lista" Sino Mostrar "No Existe el Dato" Fin si Fin.

INSERCION DE DATOS
Existen distintas formas de adicin de nodos a una lista simple, de acuerdo a los propsitos de uso de estos, entre las cuales se tiene:

Insertar cuando lista esta vaca Insertar al principio Insertar al final Insertar al medio de dos nodo

En todas ellas se realiza una tarea comn:


Crear una nuevo nodo Almacenar el elemento Agregar los enlaces respectivos

INSERTAR CUANDO LISTA ESTA VACIA:

55

Insertar(5)

New(Nuevo) Nuevo^.inf= 5 Raiz = nuevo (1) Nuevo^.sig= nil(2)

INSERTAR AL PRINCIPIO:

Insertar(3)

New(Nuevo) Nuevo^.inf= 3 Nuevo^.sig = Raiz(1) Raiz = Nuevo (2)

INSERTAR AL FINAL:

Insertar(13)

56

New(Nuevo) Nuevo^.inf= 13 ant^.sig =Nuevo(1) Nuevo^.sig =Nil(2)

INSERTAR AL MEDIO DE DOS NODOS:

Insertar(7)

New(Nuevo) Nuevo^.inf= 7 Nuevo^.sig =Act(1) Ant^.sig = Nuevo(2)

ALGORITMO :
Insertar (Dato:Entero) Inicio New(Nuevo) Nuevo^.inf = Dato Si Raiz = Nil Entonces Raiz = Nuevo Nuevo^ sig = Nil Si no Anterior = Raiz Actual = Raiz Mientras (Actual <>Nil) y (Dato> Actual^.Inf) Hacer Anterior = Actual Actual = Actual^.sig Fin Mientras Si Anterior =Actual Entonces Nuevo^.sig = Raiz Raiz = Nuevo Si no Nuevo^.sig = Actual

57

Anterior^.sig = Nuevo Fin si Fin si Fin.

ELIMINAR DATOS
Para eliminar un dato de una lista simple, es necesario buscarlo en la lista primeramente. La bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento. Existen dos casos que se presentan al eliminar un dato: 1. Eliminar el primer elemento 2. Eliminar un elemento distinto del primero

ELIMINAR EL PRIMER ELEMENTO


Dada la siguiente lista:

Eliminar(5)

Raiz= act^.sig(1) Dispose(act)

ELIMINAR UN ELEMENTO DISTINTO DEL PRIMERO


Dada la siguiente lista:

Eliminar(9) 58

ant^.sig = act^.sig Dispose(act)

ALGORITMO:
Eliminar (Dato:Entero) Inicio Si Raiz = nil then Mostrar No existe Datos Si no Anterior = Raiz Actual = Raiz Mientras (Actual <> Nil) y (Actual^.inf <> Dato) Hacer Anterior = Actual Actual =Actual^.sig Fin Mientras Si Actual^.inf = Dato entonces Si Anterior = Actual entonces Raiz = Actual^.sig Sino Anterior^.sig = Actual^.sig Fin si Dispose(Actual) Sino Imprimir "No Existe el Dato" Fin si Fin si Fin.

5.3 LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES.


Una lista circular es aquella en la cual el puntero siguiente del ltimo elemento apunta hacia el primer elemento. Por lo cual en estas listas no existe ni primero ni ltimo elemento, aunque se debe elegir obligatoriamente un puntero para referenciar la lista.

Esta lista presenta la gran ventaja de que cada nodo en una lista circular es accesible desde cualquier nodo. Tiene el inconveniente de que requiere un diseo cuidadoso para evitar caer en un bucle infinito. Existen dos tipos de listas enlazadas simples circulares: 59

Listas simples circulares sin nodo cabecera

Listas simples circulares con nodo cabecera

El manejo de la primera es complejo, de tal modo que solo se usaremos las listas enlazadas con nodo cabecera, debido a su fcil manejo.

OPERACIONES EN LISTAS SIMPLEMENTE ENLAZADAS CIRCULARES


Como cualquier estructura de datos, en las listas simplemente enlazadas circulares se puede realizar las siguientes operaciones bsicas:

Insercin Eliminacin Bsqueda Recorrido

RECORRIDO
Para realizar el recorrido en una lista simple circular, es necesario el uso de un puntero auxiliar ACT, con la cual se visita toda la lista, empezando por la RAIZ y finalizando cuando el puntero ACT apunta a NIL.

ALGORITMO:
Recorrido(Dato:Integer) Inicio Actual = Raz^.sig Mientras(Actual <> Raiz) hacer Actual =Actual^.sig Mostarc Actual^.inf

60

Fin Mientras Fin.

BUSQUEDA
Para realizar la bsqueda en una lista simple, es necesario el uso de un puntero auxiliar ACT, con la cual se busca empezando por la RAIZ y finalizando cuando el puntero ACT apunta al elemento buscado o a NIL.

ALGORITMO :
Buscar(Dato:Integer) Inicio Actual = Raz^.sig Mientras(Actual <> Raiz) y (Actual^.inf <> Dato) hacer Actual =Actual^.sig Fin Mientras Si Actual^.inf = Dato entonces Mostar "El Dato Esta en la Lista" Sino Mostrar "No Existe el Dato" Fin si Fin.

INSERCION DE DATOS
Existen distintas formas de adicin de nodos a una lista simple circular, de acuerdo a los propsitos de uso de estos. Entre las cuales se tiene:

Insertar cuando lista esta vaca Insertar al medio de dos nodos

En todas ellas se realiza una tarea comn, que es el de crear una nuevo nodo para almacenar al elemento que ser agregado a la lista.

INSERTAR CUANDO LISTA ESTA VACIA:

Insertar(5) 61

New(Cab) New(Nuevo) Nuevo^.inf= 5 Raiz = Cab (1) Cab^.sig= nuevo (2) Nuevo^.sig= Raiz (3)

INSERTAR AL MEDIO DE DOS NODOS:

Insertar(7)

New(Nuevo) Nuevo^.inf= 7 Nuevo^.sig = Act (1) Ant^.sig = Nuevo (2)

ALGORITMO :
Insertar (Dato:Entero) Inicio New(Nuevo) Nuevo^.inf = Dato Si Raiz = Nil Entonces New(Cab) Raiz = Cab Cab^.sig =Nuevo Nuevo^.sig = Raiz Si no Anterior = Raiz Actual = Raiz^ sig Mientras (Actual <> Raiz) y (Dato> Actual^.Inf) Hacer

62

Anterior = Actual Actual = Actual^.sig Fin Mientras Nuevo^.sig = Actual Anterior^.sig = Nuevo Fin si Fin.

ELIMINAR DATOS
Para eliminar un dato de una lista simple circular, es necesario buscarlo en la lista primeramente. La bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento. Existen dos casos que se presentan al eliminar un dato:

Eliminar l ultimo elemento de la lista Eliminar un elemento distinto del ultimo

ELIMINAR EL ULTIMO ELEMENTO DE LA LISTA


Dada la siguiente lista:

Eliminar(9)

Para eliminar el ultimo elemento, es necesario liberar la memoria de los nodos que apuntan a ANT y ACT.

Dispose(ant) Dispose(act) Raiz = nil (1)

ELIMINAR UN ELEMENTO DISTINTO DEL ULTIMO


Dada la siguiente lista:

63

Eliminar(5)

ant^.sig = act^.sig Dispose(act)

ALGORITMO:
Eliminar (Dato:Entero) Inicio Si Raiz = nil then Mostrar No existe Datos Si no Anterior = Raiz Actual = Raiz^.sig Mientras (Actual <> Raiz) y (Actual^.inf <> Dato) Hacer Anterior = Actual Actual =Actual^.sig Fin Mientras Si Actual^.inf <>Raiz entonces Si Anterior = Actual^.sig entonces Dispose(Anterior) Raiz = Nil Sino Anterior^.sig = Actual^.sig Fin si Dispose(Actual) Sino Imprimir "No Existe el Dato" Fin si Fin si Fin.

5.4 LISTAS DOBLEMENTE ENLAZADAS.


En muchas aplicaciones se requiere recorrer la lista en dos direcciones. Estos recorridos se pueden conseguir manteniendo dos campos de enlace en cada nodo en lugar de uno.

64

Estos enlaces(punteros) se utilizan para denotar la direccin del predecesor y sucesor de un nodo dado. El predecesor se llama enlace izquierdo y el sucesor enlace derecho.

Donde:

Nodo Inicio es un puntero al primer elemento de la lista. Nodo Fin es un puntero al ultimo elemento de la lista. Una lista cuya Estructura de Nodo,contiene dos campos de enlace se denominar lista lineal doblemente enlazada. NODO

Donde:

campo enlace ant. apunta al anterior nodo de la lista. campo info contiene cualquier tipo estndar de datos. campo enlace sig. apunta al siguiente nodo de la lista.

Existe una marca para fin de lista, que es la constante NIL, tambin representada por una barra inclinada o el signo elctrico de tierra. Declaracin de un nodo usando el lenguaje Pascal:
Type pnodo = ^nodo nodo = record info : Integer; Ant, Sig :pnodo; End;

Declaracin de un nodo usando el lenguaje C:


Struct nodo { int info; struct nodo *Ant, * Sig; };

OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS.


Las operaciones bsicas para manipular listas doblemente enlazadas son: 65

Insercin Eliminacin Recorrido Bsqueda

RECORRIDO
En una lista doble circular es posible realizar dos tipos de recorridos, esto debido a que en estas listas existen enlaces en ambas direcciones.

Recorrido en forma ascendente Recorrido en forma descendente

RECORRIDO EN FORMA ASCENDENTE


Este recorrido se inicia cuando el puntero apunta a INICIO y se recorre de nodo a nodo con el puntero SIG hasta que el nodo apunte a NIL.

ALGORITMO:
Inicio Actual = Inicio Mientras Actual <> NIL hacer Mostrar Actual^.inf Actual = Actual^.sig Fin Mientras Fin.

RECORRIDO EN FORMA DECENDENTE


Este recorrido se inicia cuando el puntero apunta a FIN y se recorre de nodo a nodo con el puntero ANT hasta que el puntero apunte a NIL.

ALGORITMO:
Inicio Actual = Fin} Mientras Actual <> Nil Hacer Mostrar Actual^.inf

66

Actual = Actual^.ant Fin Mientras Fin.

INSERCION DE DATOS
Existen distintas formas de adicin de nodos a una lista doble, de acuerdo a los propsitos de uso de estos. Entre las cuales se tiene:

Insertar cuando lista esta vaca Insertar al principio Insertar al final Insertar al medio de dos nodos

En todas ellas se realiza una tarea comn, que es el de crear una nuevo nodo para almacenar al elemento que ser agregado a la lista.

INSERTAR CUANDO LISTA ESTA VACIA:


Dada la siguiente lista:

Insertar(5)

New(Nuevo) Nuevo^.inf= 5 Inicio = nuevo (1) Fin = nuevo (2) Nuevo^.ant= nil (3) Nuevo^.sig= nil (4)

INSERTAR AL PRINCIPIO
Dada la siguiente lista:

Insertar(3) 67

New(Nuevo) Nuevo^.inf= 3 Inicio = Nuevo(1) Nuevo^.sig = Act(2) Act^.ant = Nuevo(3) Nuevo^.ant = Nil(4)

INSERTAR AL FINAL:
Dada la siguiente lista:

Insertar(13)

New(Nuevo) Nuevo^.inf= 13 ant^.sig = Nuevo(1) Nuevo^.sig = Nil(2) Fin = Nuevo(3) Nuevo^.ant = Ant(4)

INSERTAR AL MEDIO DE DOS NODOS:


Dada la siguiente lista:

68

Insertar(7)

New(Nuevo) Nuevo^.inf= 7 Ant^.sig = Nuevo(1) Nuevo^.sig = Act(2) Act^.ant = Nuevo(3) Nuevo^.ant = Ant (4)

ALGORITMO:
Insertar (Dato:Entero) Inicio New(Nuevo) Si Inicio = Nil Entonces Inicio = Nuevo; Final = Nuevo Nuevo^.ant = Nil; Nuevo^.sig = Nil Si no Anterior = Inicio Actual = Inicio Mientras (Actual <> Nil) y( Actual^.inf < Anterior = Actual Actual =Actual^.sig Fin Mientras Si Actual = Anterior Entonces Nuevo^.sig = Inicio Inicio^.ant = Nuevo Inicio = Nuevo Nuevo^.ant = Nil Si no Si Actual = Nil Entonces Final = Nuevo Si no Actual^.ant = Nuevo Fin si Nuevo^.sig = Actual Anterior^.sig = Nuevo Nuevo^.ant = Anterior Fin si Fin si Fin.

Dato) Hacer

ELIMINAR DATOS
Para eliminar un dato de una lista doble, es necesario buscarlo en la lista primeramente.

69

La bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento. Existen dos casos que se presentan al eliminar un dato:

Eliminar el primer elemento Eliminar un elemento distinto del primero Eliminar l ultimo elemento

ELIMINACIN AL PRINCIPIO:
Dada la siguiente lista:

Eliminar(5)

1. Inicio = Inicio^.sig 2. Inicio^.ant = Nil Dispose(act)

ELIMINACIN AL MEDIO:
Dada la siguiente lista:

Eliminar(8)

70

1. Ant^.sig = Act^.sig 2. Act^.sig^.ant = Ant Dispose(act)

ELIMINACIN AL FINAL:
Dada la siguiente lista:

Eliminar (9)

1. Ant^.sig = Act^.sig = nil 2. Final = Ant Dispose(act) ALGORITMO:


Eliminar (Valor: Entero) Inicio Anterior = Inicio Actual = Inicio Mientras (Actual <> Nil) y (Actual^.inf <> Valor) hacer Anterior = Actual Actual =Actual^.sig Fin Mientras Si Actual^.inf <> Valor Entonces Mostrar "No Existe el Elemento" Si no Si Actual=Anterior Entonces Si Actual^.sig <> Nil Entonces Inicio = Inicio^.sig Inicio^.ant = Nil Si no Final = Nil Inicio = Nil Fin si Si no Si Actual^.sig <> Nil entonces Actual^.sig^.Ant = Anterior Si no Final = Anterior

71

Fin si Anterior^.sig = Actual^.sig Fin Fin si Fin. si

5.5 LISTAS CIRCULARES DOBLEMENTE ENLAZADAS.


Una lista doble circular es aquella en la cual el puntero siguiente del ltimo elemento apunta hacia el primer elemento. En estas listas no existe ni primero ni ltimo elemento, aunque se debe elegir obligatoriamente un puntero para referenciar la lista.

Esta lista presenta la gran ventaja de que cada nodo en una lista doble circular es accesible desde cualquier nodo. Tiene el inconveniente de que requiere un diseo cuidadoso para evitar caer en un bucle infinito. Existen dos tipos de listas enlazadas simples circulares: Listas dobles circulares sin nodo cabecera

Listas dobles circulares con nodo cabecera

El manejo de la primera es complejo, de tal modo que solo se usaremos las listas enlazadas con nodo cabecera, debido a su fcil manejo.

72

OPERACIONES EN LISTAS DOBLEMENTE ENLAZADAS CIRCULARES.


Las operaciones bsicas para manipular listas doblemente enlazadas son:

Insercin Eliminacin Recorrido Bsqueda

RECORRIDO
En una lista doble circular es posible realizar dos tipos de recorridos, esto debido a que en estas listas existen enlaces en ambas direcciones.

Recorrido en forma ascendente Recorrido en forma descendente

RECORRIDO EN FORMA ASCENDENTE


Este recorrido se inicia cuando el puntero apunta a Raiz^.sig y se recorre de nodo a nodo con el puntero SIG hasta llegar al nodo Raiz.

ALGORITMO:
Inicio Actual = Raiz^.sig Mientras Actual <> Raiz hacer Mostrar Actual^.inf Actual = Actual^.sig Fin Mientras Fin.

RECORRIDO EN FORMA DECENDENTE


Este recorrido se inicia cuando el puntero apunta a Raiz^.ant y se recorre de nodo a nodo con el puntero ANT hasta llegar al nodo Raiz.

73

ALGORITMO:
Inicio Actual = Raiz^.ant Mientras Actual <> Raiz Hacer Mostrar Actual^.inf Actual = Actual^.ant Fin Mientras Fin.

INSERCION DE DATOS
Existen dos formas de insercin de datos a una lista doblemente enlazada circular:

Insercin en una lista vaca Insertar al medio de dos nodos

INSERCIN EN UNA LISTA VACIA

Insertar(9)

New(Cab) New(nuevo) nuevo^.inf=9 Raiz = Cab (1) Cab^.sig = Nuevo (2) Nuevo^.sig = Cab (3) Cab^.ant = Nuevo (4) Nuevo^.ant = Cab (5)

74

INSERTAR AL MEDIO DE DOS NODOS:

Insertar(6)

New(Cab) New(nuevo) nuevo^.inf=6 Ant^.sig = Nuevo(1) Nuevo^.sig = Act(2) Act^.ant = Nuevo(3) Nuevo^.ant = Ant(4)

ALGORITMO:
Insertar (dato:entero) Inicio New(Nuevo) Nuevo^.inf = Dato Si Raiz = Nil Entonces New(NodoC) Raiz = NodoC NodoC^.sig = NodoC NodoC^.ant = Nuevo Nuevo^.ant = NodoC Si no Anterior = Raiz Actual = Raiz^.sig Mientras (Actual <> Raiz) y (Actual^.inf < dato) Hacer Anterior = Actual Actual =Actual^.sig Fin Mientras Nuevo^.sig = Actual Actual^.sig = Nuevo Nuevo^.ant = Anterior Actual^.ant = Nuevo Fin si Fin.

75

ELIMINAR DATOS
Para eliminar un dato de una lista doble circular, es necesario buscarlo en la lista primeramente. La bsqueda se realiza con dos punteros auxiliares ANT y ACT, si el dato se encuentra en la lista, el puntero ACT apunta a ella y el puntero ANT apunta al anterior elemento. Existen dos casos que se presentan al eliminar un dato:

Eliminar l ultimo elemento Eliminar un elemento

ELIMINAR L ULTIMO ELEMENTO

Eliminar(9)

Dispose(ant) Dispose(act) Raiz = Nil

ELIMINAR UN ELEMENTO

Eliminar(9)

76

Ant^.sig = Act^.sig(1) Act^.sig ^.ant = Ant(2) Dispose(act)

ALGORITMO:
Eliminar (Valor:Entero) Inicio Anterior = Raiz Actual = Raiz^.sig Mientras (Actual <> Raiz) y (Actual^.inf <> Valor) Hacer Anterior = Actual Actual =Actual^.sig Fin Mientras Si (Actual^.inf <> Valor) Entonces Mostrar "No Existe el Elemento" Si no Si Actual^.sig = Anterior) Entonces Dispose(Anterior) Raiz = Nil Si no Anterior^.sig = Actual^.sig Actual^.sig ^.ant= Anterior Fin si Dispose(Actual) Fin si Fin.

77

TEMA 6

RBOLES
OBJETIVOS Desarrollar aplicaciones con estructuras ramificadas que optimizan las operaciones bsicas. Encontrar nuevas formas de organizacin de datos en forma ramificada de acuerdo a las caractersticas de la aplicacin. CONTENIDO 6.1 Introduccin 6.2 Conceptos Asociados 6.3 rbol Binario de Bsqueda 6.4 rboles Equilibrados o AVL

6.1 DEFINICION.
Un rbol es una lista en la que cada uno de sus elementos apunta a uno, ninguno o varios elementos del mismo tipo. Un rbol es una estructura dinmica y homognea, por tanto est compuesto de elementos del mismo tipo base T, de forma que la estructura puede estar vaca o compuesta por un elemento del tipo base T del que cuelgan un nmero finito de estructuras rbol similar, a las que llamaremos subrboles, y entre s son disjuntos. Dos rboles son iguales cuando tengan igual nmero de nodos, igual contenido en ellos y, adems, estn dispuestos de igual manera

REPRESENTACIN
Un rbol es una estructura de datos no lineal que establece una jerarqua entre sus elementos.

Un rbol puede ser representado, en tres formas diferentes:


Matriz de adyacencia. Lista de adyacencia. 78

Estructura dinmica pura.

MATRIZ DE ADYACENCIA
Es un array [1..n,1..n] OF BOOLEAN donde n es el nmero de nodos que tiene el rbol y cada posicin de la matriz indicar si existe un enlace entre dos nodos. Esto es normal hacerlo en lenguajes en que no pueden crearse componentes dinmicamente, y referenciales por medio de punteros. Ejemplo:

LISTA DE ADYACENCIA
Es una tabla de 1 a n, siendo n el nmero de nodos, donde cada elemento de la tabla representa cada uno de los nodos del rbol y de cada uno de los elementos sale un puntero a una lista que est formada por todos los nodos que estn enlazados con l. Ejemplo:

ESTRUCTURA DINMICA PURA


En ella, todos los componentes o nodos, se representan por punteros explcitos. Vamos a tener un tipo como: PNodo=^Nodo; Nodo=RECORD Info:Tinfo; Enlace1,..., EnlaceN: PNodo; END; 79

6.2 CONCEPTOS ASOCIADOS


A continuacin veremos algunos conceptos asociados a los Arboles.

Nodo: Cada uno de los elementos de un rbol. Rama: Es cada uno de los enlaces que existe entre los nodos de un rbol. Raz: Es aquel nodo que no tiene antecesores, es decir, todos son descendientes directos o indirectos
de el.

Subrbol: Se llama subrbol de raz m al conjunto de nodos que dependen directa o indirectamente
de l, as como al propio m.

Antecesor o padre: Es un nodo del que cuelga algn otro, llamado descendiente o hijo.

Grado de un nodo: Es el nmero de descendientes directos que tiene, el grado de un rbol es igual
al del nodo con mayor grado.

Nivel : Es el nmero de ramas que hay que recorrer para llegar a l desde la raz, tendiendo en cuenta
que la raz tiene nivel uno. 80

Nodo terminal u hoja: Es aquel que tiene grado cero, es decir, que no tiene ningn descendiente. Nodo interno: Es aquel que no es hoja. Longitud de camino interno de un arbol: Es la suma de las longitudes de camino de todos sus
nodos.

LCI = 1+2+2+3+3+3 = 14

Longitud de camino externa: Es la suma de las longitudes de camino de todos los Nodos
Especiales (Es aquel que se hace colgar de aquellos nodos que no tienen completo el cupo de descendientes).

LCE = 3+4+4+4+4+4+4 = 27

Longitud de camino interna media: Es la longitud de camino interna partido del nmero de
nodos

6.3 ARBOL BINARIO


Los rboles de grado 2 tienen una especial importancia. Se les conoce con el nombre de rboles binarios. Se define un rbol binario como un conjunto finito de elementos (nodos) que bien est vaci o est formado por una raz con dos rboles binarios disjuntos, llamados subrbol izquierdo y derecho de la raz.

81

En los apartados que siguen se considerarn nicamente rboles binarios y, por lo tanto, se utilizar la palabra rbol para referirse a rbol binario. Los rboles de grado superior a 2 reciben el nombre de rboles multicamino.

DEFINICION
Los rboles binarios se utilizan frecuentemente para representar conjuntos de datos cuyos elementos se identifican por una clave nica. Si el rbol est organizado de tal manera que la clave de cada nodo es mayor que todas las claves del subrbol izquierdo, y menor que todas las claves del subrbol derecho se dice que este rbol es un rbol binario de bsqueda. Ejemplo:

OPERACIONES BASICAS
Una tarea muy comn a realizar con un rbol es ejecutar una determinada operacin con cada uno de los elementos del rbol. Esta operacin se considera entonces como un parmetro de una tarea ms general que es la visita de todos los nodos o, como se denomina usualmente, del recorrido del rbol. Si se considera la tarea como un proceso secuencial, entonces los nodos individuales se visitan en un orden especfico, y pueden considerarse como organizados segn una estructura lineal. Existen dos formas bsicas de recorrer un rbol:
o o

Recorrido en amplitud. Recorrido en profundidad.

RECORRIDO EN AMPLITUD. En el recorrido por amplitud se visitan los nodos por niveles. Para ello se utiliza una estructura auxiliar tipo "cola" en la que despus de mostrar el contenido del nodo, empezando por el nodo raz, se almacenan los punteros correspondientes a sus hijos izquierdo y derecho. De esta forma si recorremos los nodos de un nivel, mientras mostramos su contenido, almacenamos en la cola los punteros a todos los nodos del nivel siguiente.

82

Resultado: 20, 10, 30, 5, 15, 25

El algoritmo:
Amplitud Inicio Ptr = raiz Cima = 1 Inicio=1 Pila[cima] = Ptr Mientras Inicio<=cima hacer ptr=Pila[Inicio] inicio++ Mostrar ptr^.inf Si ptr^der <> nil entonces Cima=cima+1 Pila[cima] = ptr^.der Fin_si Si ptr^izq <> nil entonces Cima=cima+1 Pila[cima] = ptr^.izq Fin_si Fin_mientras Fin.

RECORRIDO EN PROFUNDIDAD. Para visualizar o consultar los datos en un rbol se necesita recorrer el rbol. Al contrario que las listas enlazadas, los rboles no tienen un primer valor, un segundo valor, etc. Existen mtodos de recorrido de un rbol binario, de acuerdo al orden en que se visitan los nodos, de forma que ser preciso elegir cuidadosamente el tipo de recorrido. Segn sea la estrategia a seguir, los recorridos se conocen como:

Recorrido inorden Recorrido preorden Recorrido postorden

83

Las tres etapas bsicas en el recorrido de un rbol binario recursivamente son: - Visitar el nodo (Raiz) - Recorrer el subrbol izquierdo (izq.) - Recorrer el subrbol derecho (der.) RECORRIDO PREORDEN Si el rbol no esta vaci, el mtodo implica los siguientes pasos: - Visitar el nodo (Raiz) - Recorrer el subrbol izquierdo (izq.) - Recorrer el subrbol derecho (der.)

El algoritmo usando recursividad:


preorden (var p:pnodo) inicio si p <>nil entonces escribir p^.inf preorden (p^.izq) preorden (p^.der) fin si fin

En el rbol, los nodos se han numerado en el orden que son visitados en el recorrido preorden

. Primero se visita el nodo raz A. Despus se visita el subrbol izquierdo. Este consta de los nodos (B, D y E), por lo que siguiendo con el orden (Raiz, izq., der.), se visita primero B, luego D y por ultimo E. Por ultimo se visita el subrbol derecho que consta de los nodos (C, F y G). Siguiendo el orden (Raiz, izq., der.), se visita primero C, luego F y por ultimo G. El recorrido es: A-B-D-E-C-F-G

El algoritmo sin usar recursividad:


84

Preorden Inicio Cima = 1 Pila[cima] = nil Ptr = raiz Mientras ptr <> nil hacer Mostrar ptr^.inf Si ptr^der <> nil entonces Cima=cima+1 Pila[cima] = ptr^.der Fin_si Si ptr^.izq <> nil entonces Ptr = ptr^.izq Sino Ptr = pila[cima] Cima=cima-1 Fin_si Fin_mientras Fin.

RECORRIDO INORDEN Si el rbol no esta vaci, el mtodo implica los siguientes pasos: - Recorrer el subrbol izquierdo (Izq) - Visitar el nodo (Raiz) - Recorrer el subrbol derecho (Der)

El algoritmo usando recursividad:


inorden (var p:pnodo) inicio si p <> nil entonces inorden (p^.izq) escribir p^.inf inorden (p^.der) fin si fin

En el rbol, los nodos se han numerado en el orden que son visitados en el recorrido enorden.

85

El primer recorrido es el subrbol izquierdo del nodo raz. Este consta de los nodos (B, D y E), por lo que siguiendo con el orden (Izq, Raiz, Der), se visita primero D, luego B y por ultimo E. Despus se visita el nodo raz A. Por ultimo se visita el subrbol derecho que consta de los nodos (C, F y G). siguiendo el orden (Izq, Raiz, Der), se visita primero F, luego C y por ultimo G.

El recorrido es: D-B-E-A-F-C-G

El algoritmo sin usar recursividad:


Inorden Inicio Cima = 1 Pila[cima]=nil Ptr = raiz Mientras ptr <> nil hacer Mientras ptr <> nil hacer Cima=cima+1 Pila[cima] = ptr Ptr = ptr^.izq Fin_mientras Ptr = pila[cima] Cima=cima-1 Tieneder =false Mientras Ptr <> nil y no tieneder hacer Mostrar ptr ^.inf Si ptr^.der <> nil entonces Ptr = ptr^.der Tieneder = true Sino Ptr = pila[cima] Cima=cima-1 Fin_si Fin_mientras Fin_mientras Fin.

RECORRIDO POSTORDEN Si el rbol no esta vaci, el mtodo implica los siguientes pasos: - Recorrer el subrbol izquierdo (Izq) - Recorrer el subrbol derecho (Der) - Visitar el nodo (Raiz)

El algoritmo usando recursividad:


postorden (var p:pnodo)

86

inicio si p <> nil entonces postorden (p^.izq) postorden (p^.der) escribir p^.inf fin si fin

En el rbol, los nodos se han numerado en el orden que son visitados en el recorrido preorden.

. Primero se visita el subrbol izquierdo. Este consta de los nodos (B, D y E), por lo que siguiendo con el orden (Izq, Der, Raiz), se visita primero D, luego E y por ultimo B. Por ultimo se visita el subrbol derecho que consta de los nodos (C, F y G). Siguiendo el orden (Izq, Der, Raiz), se visita primero F, luego G y por ultimo C. Por ultimo se visita el nodo raz A.

El recorrido es: D-E-B-F-G-C-A

El algoritmo sin usar recursividad:


Postorden Inicio Cima = 1 Pila[cima]=nil Ptr = raiz Mientras ptr <> nil hacer Mientras ptr <> nil hacer Cima=cima+1 Pila[cima] = ptr Si ptr^.der <> nil entonces Cima = cima+1 Pila[cima]= -ptr^.der Fin_si Ptr = ptr^.izq Fin_mientras Ptr = pila[cima] Cima = cima-1 Salir = false

87

Mientras ptr <> nil y no salir hacer Si prt > 0 entonces Mostrar prt^.inf Ptr = pila[cima] Cima = cima-1 Sino Ptr = -ptr Salir=true Fin_si Fin_mientras Fin_mientras Fin.

INSERCIN DE DATOS
La insercin de datos en un arbol binario de bsqueda, se realiza de acuerdo al valor que se debe insertar, si el dato es menor que la raz es insertada en el subrbol izquierdo, si el dato es mayor que la raz es insertada en el subrbol derecho.
Insertar(Var raiz:pnodo;dato:entero) Inicio Si raiz = nil entonces New(raiz) Raiz^.inf = dato Raiz^.izq = nil Raiz^.der = nil Sino Si dato > raiz^.inf entonces Insertar (raiz^.der,dato) Sino Insertar(raiz^.izq,dato) Fin_si Fin_si Fin.

ELIMINAR UN DATO
Existen varios casos de eliminacin en un arbol binario de bsqueda: Nodo que no tiene hijos:

Solucin : Ptr = nil Nodo que tiene un hijo:

88

Solucin : Ptr = ptr^.der

Solucin : Ptr = ptr^.izq Nodo que tiene dos hijos:

En este caso existen dos posibilidades de reemplazo, donde el nodo a ser eliminado puede ser reemplazado por los siguientes nodos: caso a).- El nodo del subrbol izquierdo que se encuentra mas a la derecha

caso b).- El nodo del subrbol derecho que se encuentra mas a la izquierda

89

ALGORITMO :
Eliminar(dato:integer;Var ptr:pnodo) Inicio Si ptr = nil entonces Mostrar "no existe el elemento" Sino Si dato > ptr^.inf entoces Eliminar (dato,ptr^.der) Sino Si dato < ptr^.inf entonces Eliminar(dato,ptr^.izq) Sino Aux =ptr Si aux^.izq=nil entonces Ptr =aux^.der Sino Si aux^.der = nil entonces Ptr=aux^.izq Sino Reemplazar(aux^.izq) Fin_si Fin_si Free(aux) Fin_si Fin_si Fin_si Fin. Reemplazar(Var Ader:pnodo) Inicio Si Ader^.der <> nil entonces Reeplazar(Ader^.der) Sino Ptr^.inf = Ader^.inf aux = Ader Ader = Ader^.izq Fin_si Fin.

BSQUEDA DE DATOS
La bsqueda de un nodo comienza en el nodo raz y sigue estos pasos: La clave buscada se compara con la clave del nodo raz. Si las claves son iguales, la bsqueda se detiene, o si el subrbol esta vaci. Si la clave buscada es mayor que la clave raz, la bsqueda se reanuda en el subrbol derecho. Si la clave buscada es menor que la clave raz, la bsqueda se reanuda en el subrbol izquierdo.

6.4 RBOLES BINARIOS DE EXPRESIONES


Los rboles binarios se utilizan para almacenar expresiones. Por ejemplo, el arbol de la figura representa la expresin (A+B)*C. Las expresiones 90

matemticas se pueden escribir segn diversos tipos de notaciones. La notacin infija es la empleada habitualmente y requiere el uso de parntesis, pero nicamente cuando es necesario modificar la prioridad entre los distintos operadores.

CONSTRUCCIN A PARTIR DE UNA EXPRESIN EN NOTACIN CONVENCIONAL


Para construir se utilizaran, como estructura de datos auxiliares, una pila de punteros a los nodos de un rbol y otra pila de operadores para retenerlos temporalmente hasta que llegue el momento de incorporarlos al rbol. Los pasos a seguir son lo siguientes. 1. Cuando se lee un OPERANDO se crea un rbol de un nodo y se mete el apuntador a el en correspondiente pila. 2. Cuando se lee un OPERADOR se retiene en la pila de operadores. Los operadores se van poniendo en esta pila hasta encontrar uno con mayor o igual prioridad, en cuyo caso se sacan los que hubiera en la pila de mayor o igual prioridad y se coloca en ella este ultimo operador leido. 3. Cuando se lee un PARNTESIS IZQUIERDO se retiene en la pila de operadores. 4. Cuando se lee un PARNTESIS DERECHO se sacan los OPERADORES que hubiera en la pila de operadores hasta encontrar el parntesis izquierdo. 5. El proceso termina cuando se acaba la entrada y la pila de operadores queda vaca. Nota: Al sacar de la pila de operadores uno de ellos, extraer de la pila de punteros los dos ltimos apuntadores. Con estos tres elementos, se forma un nuevo rbol cuya raz almacena el operador y los punteros anteriores. El apuntador a este nuevo rbol se coloca ahora en la pila de apuntadores. Ejemplo: Sea la expresin : Q= 4+5^(2*3)+8

1.-

2.- El ) saca los operadores de la pila hasta el (

91

3.- El + saca de la pila todos los operadores con mayor prioridad que el y l continuacin se coloca el

4.-

5.-

6.5 RBOLES EQUILIBRADOS O AVL


Es una suavizacin de las restricciones para formar rboles perfectamente equilibrados. Un rbol AVL (llamado as por las iniciales de sus inventores: Adelson-Velskii y Landis) es un rbol binario de 92

bsqueda en el que para cada nodo, las alturas de sus subrboles izquierdo y derecho no difieren en ms de 1. El algoritmo para mantener un rbol AVL equilibrado se basa en reequilibrados locales, de modo que no es necesario explorar todo el rbol despus de cada insercin o borrado.

DEFINICIN
La definicin no slo es simple, sino que adems conduce a un procedimiento de reequilibrado relativamente sencillo, y a una longitud de camino media prcticamente idntica a la del rbol perfectamente equilibrado. En un rbol AVL, se pueden realizar en O(lon n) unidades de tiempo, incluso en el peor de los casos, las siguientes operaciones: Encontrar un nodo con una clave dada. Insertar un nodo con una clave dada. Borrar un nodo con una clave dada. Vamos a aadir un campo nuevo a la declaracin del tipo TArbol, que se llamar factor de equilibrio (equ), este factor de equilibrio (equ) es la diferencia entre las alturas del rbol derecho y el izquierdo: FE = altura subrbol derecho - altura subrbol izquierdo; Por definicin, para un rbol AVL, este valor debe ser -1, 0 1. Condiciones para variar equ:
o o o o

La insercin se hace en las hojas Cuando creamos un nuevo nodo el campo de equilibrio vale 0, ya que la altura del subrbol izquierdo es igual que la del derecho. Cuando insertamos por la derecha incrementamos el valor del campo de equilibrio. Cuando insertamos por la izquierda decrementamos el valor del campo de equilibrio.

INSERCIN EN AVL
La insercin se hace siempre en las hojas, y vamos a tener un campo de equilibrio, adems una variable global llamada crecido de tipo BOOLEAN, que en el momento de insertar lo vamos a poner a TRUE para despus controlar si se ha desequilibrado o no. Se sube restando o sumando 1 hasta llegar a un cero. Si a la hora de sumar o restar un uno se sale del rango hay que reequilibrar.

DESEQUILIBRIOS Y REEQUILIBRIOS
Al insertar un nuevo nodo en un rbol equilibrado se pueden producir desequilibrios, que quedarn representados en los casos mostrados a continuacin.

93

En las figuras, las cajas rectangulares representan subrboles, y la altura aadida por la insercin se indica con cruces. Simples transformaciones restauran el equilibrio deseado.

DESEQUILIBRIO IZQUIERDA - IZQUIERDA SIMPLE.


Dado el siguiente Arbol Balanceado, donde se observa que el nodo B ya se encuentra crecido en 1 nivel en su subarbol izquierdo.

Se aade al subarbol izquierdo del nodo A un nuevo dato "X", lo que causa un desequilibrio en el arbol, ya que el subarbol izquierdo del nodo B se encuentra crecido ahora en 2 niveles.

Se corrige con la rotacin izquierda-izquierda simple, que consiste en subir el nodo A, que tendr al final el campo de equilibrio a 0.

DESEQUILIBRIO DERECHA -DERECHA SIMPLE.


94

Se reequilibra con rotacin derecha-derecha simple. Es el reflejado del anterior.

La figura muestra la situacin antes y despus de la rotacin simple, donde el elemento X fue insertado en E, y b corresponde al nodo N. Antes de la insercin, la altura de N es la altura de C+1. Idealmente, para recuperar la condicin de balance se necesitaria bajar A en un nivel y subir E en un nivel, lo cual se logra cambiando las referencias derecha de b e izquierda de d, quedando este ltimo como nueva raz del rbol, N'. Ntese que ahora el nuevo rbol tiene la misma altura que antes de insertar el elemento, C+1, lo cual implica que no puede haber nodos desbalanceados ms arriba en el rbol, por lo que es necesaria una sola rotacin simple para devolver la condicin de balance al rbol. Ntese tambin que el rbol sigue cumpliendo con la propiedad de ser ABB.

DESEQUILIBRIO IZQUIERDO-DERECHO COMPUESTO


Dado el siguiente Arbol Balanceado, donde se observa que el nodo B ya se encuentra crecido en 1 nivel en su subarbol izquierdo.

Se aade al subarbol derecho del nodo A un nuevo dato "X", lo que causa un desequilibrio en el arbol, ya que el subarbol izquierdo del nodo B se encuentra crecido ahora en 2 niveles.

95

Se corrige con la rotacin izquierda-derecha compuesta. Se sube el nodo C que pasa a tener el campo de equilibrio a 0.

DESEQUILIBRIO DERECHO - IZQUIERDO COMPUESTO


Se reequilibra con rotacin derecha-izquierdo compuesto, es el reflejado del anterior.

96

Para el caso de la figura, la altura de N antes de la insercin era G+1. Para recuperar el balance del rbol es necesario subir C y E y bajar A, lo cual se logra realizando dos rotaciones simples: la primera entre d y f, y la segunda entre d, ya rotado, y b, obtenindose el resultado de la figura. A este proceso de dos rotaciones simples se le conoce como rotacin doble, y como la altura del nuevo rbol N' es la misma que antes de la insercin del elemento, ningn elemento hacia arriba del rbol queda desbalanceado, por lo que solo es necesaria una rotacin doble para recuperar el balance del rbol despus de la insercin. Ntese que el nuevo rbol cumple con la propiedad de ser ABB despus de la rotacin doble. EJEMPLO DE INSERCIONES DE NODOS A continuacin se simulan las inserciones de nodos en un rbol de bsqueda equilibrado, partiendo del rbol vaci. Por comodidad se supone que el campo clave es entero. El factor de equilibrio actual de un nodo y el nuevo al aadir un nodo se representan como superndices de los nodos. Los punteros n, nl y n2 referencia al nodo que viola la condicin de equilibrio y a los descendientes en el camino de bsqueda.

Insertar las claves 68-45-29:

Una vez insertado el nodo con la clave 29, al regresar por el camino de bsqueda cambia los factores de equilibrio, as el del nodo 45 pasa a -1, y en el nodo 68 se pasa a -2. Se ha roto el criterio de equilibrio y debe de reestructurarse. Al ser los factores de equilibrio -l y -2 deben de realizarse una rotacin de los nodos II para rehacer el equilibrio. Los movimientos de los punteros para realizar esta rotacin II n^.izqdo = n1^.drcho n1^.drcho = n n = n1

Realizada la rotacin, los factores de equilibrio sern siempre O en las rotaciones simples. El rbol queda de la forma siguiente:

97

Insercin de las claves 75 y 90

Una vez insertado el nodo con la clave 90, a la derecha del nodo 75, y regresar por el camino de bsqueda para as calcular los nuevos factores de equilibrio, se observa que dicho factor queda incrementado en 1 pues la insercin ha sido por la derecha. En el nodo con clave 68 queda roto el equilibrio. Para reestructurar se realiza una rotacin DL Los movimientos de los punteros para realizar esta rotacin DD:

n^.Drcho = n1^. Izqdo n1^.Izqdo = n n = n1 Una vez realizada la rotacin, los factores de equilibrio de los nodos implicados ser 0, como ocurre en todas las rotaciones simples, el rbol queda como sigue:

Insertamos la clave 70 98

para insertar el nodo con la clave 70 se sigue el camino : Derecha de 45 izquierda de 75 y se inserta por la derecha al nodo 68. al regresar por el camino de bsqueda. Queda, los factores de equilibrio se incrementan en 1 si se fue por la rama derecha, se decrementa en si se fue por la rama izquierda. En el nodo 45 cl balanceo se ha roto. La rotacin de los nados para reestablecer el equilibrio es DI. Los movimientos de los punteros para realizar esta rotacin DI n1^. Izqdo = n2^. Drcho n1^. Drcho = n1 n^. Drcho = n2^. Izqdo n2^. Izqdo = n n = n2

Los factores de equilibrio de los nodos implicados en la rotacin dependen del valor antes de la insercin del nodo referenciado por n2 segn esta tabla: si n^.fe n1^.fe n2^.fe Con esta rotacin el rbol quedara n2 ^.fe= -1 n2^.fe = 0 0 0 1 0 0 0 n2^. fe =1 -1 0 0

Insercin de la clave 34 99

El camino seguido para insertar el nodo con clave 34 ha seguido el camino de izquierda dc 68, izquierda de 45, derecha de 29. Al regresar por el camino de bsqueda, el factor de equilibrio del nodo 29 se incrementa en 1 por seguir el camino de la rama derecha, el del nodo 45 se decrementa en 1 por seguir la rama izquierda y pasa a ser -2, se ha roto el criterio de equilibrio. La rotacin de los nodos para reestablecer el equilibrio es ID. Los movimientos de los punteros para realizar esta rotacin ID n1^. Drcho = n2^.Izqdo n2^. Izgdo = nl n^. Izgdo = n2^.Drcho n2^. Drcho = n n = n2

Los factores de equilibrio de los nodos implicados en la rotacin dependen del valor antes de la insercin del nodo referenciado por n2, segn esta tabla: si n^.fe n1^.fe n2^.fe Con esta rotacin el rbol quedara n2 ^.fe= -1 n2^.fe = 0 1 0 0 0 0 0 n2^. fe =1 0 -1 0

IMPLEMENTACIN DE LA INSERCIN
100

Un algoritmo que inserte y reequilibre depender en forma crtica de la forma en que se almacene la informacin relativa al equilibrio del rbol. Una solucin consiste en mantener la informacin sobre el equilibrio, de forma completamente implcita, en la estructura misma del rbol. En este caso, sin embargo, el factor de equilibrio debe "averiguarse" cada vez que se encuentre afectado por una insercin, con el consiguiente trabajo resultante. Otra forma (la que vamos a usar) consiste en atribuir a, y almacenar con, cada nodo un factor de equilibrio explcito. La definicin de nodo se ampla entonces a:
TYPE Nodo=RECORD Clave:Tclave; Info:Tinfo; Izq,Der:^Nodo; Equi:-1..1 END

El proceso de insercin de un nodo consta fundamentalmente de las tres partes consecutivas siguientes: Seguir el camino de bsqueda hasta que se comprueba que la clave an no est en el rbol. Insertar el nuevo nodo y determinar el factor de equilibrio resultante. Volver siguiendo el camino de bsqueda y comprobar el factor de equilibrio de cada nodo. Aunque este mtodo realiza algunas comprobaciones que son redundantes, una vez que se establece el equilibrio, ste no necesita comprobarse en los antecesores del nodo en cuestin. En cada paso se debe mandar informacin sobre si la altura del subrbol (en el cual se ha realizado la insercin) ha aumentado o no. Por lo tanto se extiende la lista de parmetros del procedimiento con el BOOLEAN Crecido, que debe ser un parmetro de tipo variable, ya que se utiliza para transmitir un resultado.

procedure insertar (dato : word; var p : pnodo; var h : boolean); var p1,p2:puntero; begin if p = nil then begin new (p); h:= true; with p^ do begin inf:= dato; izq:= nil; der:= nil; equi:= 0; contador:= 1; end; end else if dato < P^.Inf Then begin Insertar (dato,p^.Izq,h); if h then {la rama izq. ha crecido}

101

case p^.equi of +1: begin p^.equi:=0; h:= false; end; 0: p^.equi:=-1; -1: begin {reequilibrar} p1 := p^.izq; if pl^.equi = -1 then begin { rotacion II simple } p^.izq := pl^.der; p1^.der:=p; p^.equi=0; p := p1; end else begin { rotacin ID doble} p2 := p1^.der; p1^.der := p2^.izq; p2^.izq := p1; p^.izq := p2^.der; p2^.der := p; if p2^.equi = -1 then p^.equi := +1 else p^.equi :=0; if p2^.equi = +1 then p1^.equi := -1 else p1^.equi :=0; p := p2; end; p^.equi := 0; h := false; end; end end else if dato > p^.inf then begin insertar (dato, p^.der, h); if h then {la rama derecha ha crecido} case p^.equi of -1: begin p^.equi:=0; h:=false; end; 0: p^.equi :=+1; +1: begin {reequilibrar} p1 := p^.der; if p1^.equi = +1 then begin {rotacion DD simple} p^.der := p1^.izq; p1^.izq := p; p^.equi := 0; p := p1; end else begin { rotacin DI doble } p2 := p1^.izq; p1^.izq := p2^.der; p2^.der := p1; p^.der := p2^.izq; p2^.izq := p; if p2^.equi = +1 then p^.equi := -1 else p^.equi := 0;

102

if p2^.equi = -1 then p1^.equi := +1 else p1^.equi := 0; p := p2; end; p^.equi := 0; h := false; end; end end else begin p^.contador := p^.contador +1; h:=false; end; end; end;

BORRADO EN AVL
Vamos a ver solo las distintas posibilidades que se pueden dar al borrar un nodo en el lado derecho. A la izquierda es simtrico. EQUILIBRIOS Y DESEQUILIBRIOS

CASO 1. RAIZ.
Caso 1.1: Si alguno de los subrboles que salen de la raz est vaci, entonces el otro estar vaci o solo tiene un nodo, por ser un rbol equilibrado. Si solo tiene dos nodos se Si solo est el nodo a borrar, el rbol acaba vaci. sube el no-borrado hacia arriba.

Caso 1.2: Si no hay ningn subrbol vaci se sube el nodo de ms a la derecha del subrbol izquierdo, se intercambia los valores de la raz por los de ese nodo, y despus es borra este ltimo.

CASO 2. BORRADO EN EL SUBRBOL DERECHO.


Caso 2.1: Si el campo de equilibrio tiene un cero, los dos subrboles son iguales. Entonces lo borramos y el campo de equilibrio pasa a -1. Caso 2.2: Si tiene un 1, entonces el subrbol derecho tiene una altura ms que el izquierdo. Al borrar equilibramos y pasa a ser 0 ya que restamos 1. Se puede haber desequilibrado por la izquierda porque al borrar se ha disminuido en uno la altura del rbol.

103

Caso 2.3: Si tiene un -1, la altura del subrbol izquierdo es mayor que la del derecho. Al borrar en el derecho se rompe el equilibrio, que pasa a -2.Hay tres casos.

Caso 2.3.1

Caso 2.3.2

Caso 2.3.3

Que visto de otra forma, puede ser:

104

Mediante rotacin izquierda-derecha compuesta queda:

Hay otros dos casos, que el bloque 2'2 sea el ms pequeo, o que lo sea el 2'1.Tienen altura N-2 y por lo dems se tratan igual. EJEMPLO DE BORRADO DE NODOS Una vez eliminado el nodo siguiendo los criterios establecidos anteriormente, se regresa por el camino de bsqueda calculando los nuevos factores de equilibrio (Fe) de los nodos visitados. Si en alguno de los nodos se viola el criterio de equilibrio, debe de restaurarse el equilibrio. En el algoritmo de insercin, una vez que era efectuada una rotacin el proceso terminaba ya que los nodos antecedentes mantenan el mismo factor de equilibrio. En la eliminacin debe de continuar el proceso puesto que se puede producir ms de una rotacin en el retroceso realizado por el camino de bsqueda, pudiendo llegar hasta la raz del rbol. En los procedimientos se utiliza el argumento boolean hh, ser activado cuando la altura del subrbol disminuya debido a que se haya eliminado un nodo, o bien porque al reestructurar haya quedado reducida la altura del subrbol.

105

En el rbol de la figura va a ser eliminado el nodo con la clave 42: al ser un nodo hoja el borrado es simple, se suprime el nodo. Al volver por el camino de bsqueda para determinar los Fe, resulta que el Fe del nodo con clave 39 pasara a ser -2 ya que ha decrementado la altura de la rama derecha, es violado el criterio de equilibrio. Hay que reestructurar el rbol de raz 39

Rotacin ii por que


N^.fe (-1-1) y n1^.fe <=0 El rbol resultante es

Ahora se elimina el nodo con la clave 21. Al tener dos ramas, toma el nodo ms a la derecha de la rama izquierda que es el de clave 11. Al volver por el camino de bsqueda para calcular los Fe, el factor de equilibrio del nodo 11 pasara a ser 2 y por tanto hay reestructurar el rbol de raz II.

106

Rotacin ID por que


N^.fe (1+1) y n1^.fe < 0

El rbol resultado es :

En estos dos ejemplos se observa que despus de realizar la eliminacin de un nodo, y cuando se regresa por el camino de bsqueda, el factor de equilibrio del nodo visitado disminuye en 1 si la eliminacin se hizo por su rama derecha y se incrementa en 1 si la eliminacin se hizo por su rama izquierda. Consideremos ahora este rbol equilibrado:

Se elimina el nodo de clave 25. Como es un nodo hoja se suprime. La supresin se hace por la rama izquierda, por lo que la altura de la rama derecha correspondiente aumenta en 1, y lo mismo ocurre con el factor de equilibrio. 107

Los factores de equilibrio quedan:

Rotacin DD por que


N^.fe = 1+1 N1^.fe >= 1 El rbol resultante es:

Al seguir regresando por el camino de bsqueda, el nodo raz debe de incrementar su Fe con lo que pasara a +2, por consiguiente hay que restaurar el rbol, la rotacin es derecha-izquierda ya que

N^.fe 1+1 y n1^.fe <0

El nuevo rbol queda as es

108

IMPLEMENTACIN DE LA ELIMINACIN
En el algoritmo de supresin se introducen dos procedimientos simtricos de equilibrado: Equilibrar1 se invoca cuando la altura de la rama izquierda ha disminuido y Equilibnar2 se invocar cuando la altura de la rama derecha haya disminuido. En el procedimiento Equilibrar1 al disminuirla altura de la rama izquierda, el factor de equilibrio se incrementa en 1. Por lo que de violarse el factor de equilibrio la rotacin que se produce es del tipo derecha-derecha, o derecha-izquierda.
procedure Rotaciondd (var N: Ptrae; Nl: ptrae); begin N^.Drcho:=N1^.Izqdo; N1^. Izgdo:=n; if N1^. Fe= 1 then begin N^.Fe:=0; N1^.Fe:=0 end else begin N^.Fe:= 1; Nl^.Fe:= -1; end, N :=N1; end; procedure Rotaciondi (var N: Ptrae; Nl: Ptrae); var N2 : Ptrae; begin N2:=Nl^.lzqdo; N^.Drcho:=N2^.Izqdo; N2^.Izqdo:=N; Nl^.lzqdo:=N2^.Drcho; N2^.Drcho:=Nl; if (N2^.Fe=l ) then N^.Fe=-l else N^. Fe: =0 if (N2^.Fe=-l) then N1^.Fe:=1 else Nl^.Fe:=0; N2^.Fe:=0; N :=N2; end;

109

procedure Rotacionii(var N: Ftrae; N1: Ptrae); begin N^.Izqdo:= N1^.Drcho; N1^.Drcho:=N; if N1^.Fe= -1 then begin N^.Fe :=0; N1^.Fe := 0; end else begin N^.Fe :=-1; N1^.Fe := 1 end; N := N1; end; procedure Rotacionid(Vat N:Ptrae; N1:Ptrae) var n2:ptrae; begin N2= N1^.drcho; N^.Izqdo:= N2^.Drcho; N2^.Drcho:= N; N1^.Drcho:= N2^Izqdo; N2^.Izqdo:= Nl; if (N2^.f2=1) then N1^.Fe:=-1 else N1^.Fe:=O; if (N2^.Fe=-l) then N^.Fe:=l else N^..Fe:=O; N2^.Fe:=0; N:= N2; end; procedure Equilibrarl(var N:Ptrae: var hh; bolean) {hh: activado cuando ha disminuido en altura la rama izquierda del nodo N} var Nl :Ptrae: begin case N^.Fe of -1: N^.Fe:= O; O: begin N^.Fe:= 1; hh:= false end; 1: begin {Hay que restaurar el equilibrio} Nl:= N^.drcho; {Es determinado el tipo de rotacin} if N1^. Fe >= 0 then begin if N1^. Fe = 0 then hh;= false; {No disminuye de nuevo la altura} Rotaciondd(N, N1) end else Rotaciondi(N, N1) end; end; end;

110

En el procedimiento Equilibnar2 al disminuir la altura de la rama derecha, el factor de equilibrio queda decrementado en 1. De producirse una violacin del criterio de equilibrio, la rotacin ser del tipo izquierda-izquierda, o izquierda-derecha.
procedure Equilibrar2(var N:Ptrae: var hh; bolean) {hh: activado cuando ha disminuido en altura la rama izquierda del nodo N} var Nl :Ptrae: begin case N^.Fe of 1: N^.Fe := 0; 0: begin N^.Fe := -1; hh:= false end; -1: begin {Hay que restaurar el equilibrio} Nl:= N^.Izqdo; {Es determinado el tipo de rotacin} if N1^.Fe <= 0 then begin if N1^.Fe = 0 then hh;= false; {No disminuye de nuevo la altura} Rotacion_ii(N, N1) end else Rotacion_id(N, Nl) end; end; end;

A continuacin son escritos los procedimientos de borrar_balanceado y el procedimiento anidado bor. El algoritmo que sigue es el mismo que el de borrado en los rboles de bsqueda sin criterio de equilibrio. La principal diferencia est en que en el momento que una rama disminuye en altura es llamado el procedimiento respectivo de equilibrar.
procedure borrar_balanceado(var R:Ptrae;var hh:boolean;X: Tipoinfo) var q: Ptrae; procedure bor(var d: ptrae; var hh: boolean); begin if d^.Drcho<>nil then begin bor(d^.Drcho, hh); if hh then {Ha disminuido rama derecha} Equilibrar2 (d,hh) end else begin q^.info:=d^.info; q: =d; d:=d^.Izqdo; hh:= true end; end; begin

111

if not ArbolVacio( R ) then if x < R^.info then begin borrar_balanceado(R^.lzqdo,hh , x): if hh then Equilibrarl.(R, hh) end else if x>R^.info then begin borrar_balanceado(R^.Drcho.,hh ,x) if hh then Equilibrar2(R, Hh) end else begin {ha sido encontrado el nodo} q:= R; if q^.Drcho= nil then begin R:= q^.Izqdo; hh:= true{Disminuye la altura} end else if q ^.Izqdo=nil then begin R:=q^.drcho; hh:= true end else begin bor(q^.Izqdo,hh); if hh then Equilibrar1(R, hh) end; dispose(q); end; end;

112

RBOLES BINARIOS DE EXPRESIONES


Los rboles binarios se utilizan para almacenar expresiones. Por ejemplo, el arbol de la figura representa la expresin (A+B)*C. Las expresiones matemticas se pueden escribir segn diversos tipos de notaciones. La notacin infija es la empleada habitualmente y requiere el uso de parntesis, pero nicamente cuando es necesario modificar la prioridad entre los distintos operadores. CONSTRUCCIN A PARTIR DE UNA EXPRESIN EN NOTACIN CONVENCIONAL Para construir se utilizaran, como estructura de datos auxiliares, una pila de punteros a los nodos de un rbol y otra pila de operadores para retenerlos temporalmente hasta que llegue el momento de incorporarlos al rbol. Los pasos a seguir son lo siguientes. 6. Cuando se lee un OPERANDO se crea un rbol de un nodo y se mete el apuntador a el en correspondiente pila. 7. Cuando se lee un OPERADOR se retiene en la pila de operadores. Los operadores se van poniendo en esta pila hasta encontrar uno con mayor o igual prioridad, en cuyo caso se sacan los que hubiera en la pila de mayor o igual prioridad y se coloca en ella este ultimo operador leido. 8. Cuando se lee un PARNTESIS IZQUIERDO se retiene en la pila de operadores. 9. Cuando se lee un PARNTESIS DERECHO se sacan los OPERADORES que hubiera en la pila de operadores hasta encontrar el parntesis izquierdo. 10. El proceso termina cuando se acaba la entrada y la pila de operadores queda vaca. Nota: Al sacar de la pila de operadores uno de ellos, extraer de la pila de punteros los dos ltimos apuntadores. Con estos tres elementos, se forma un nuevo rbol cuya raz almacena el operador y los punteros anteriores. El apuntador a este nuevo rbol se coloca ahora en la pila de apuntadores. Ejemplo: Sea la expresin : Q= 4+5^(2*3)+8

1.-

113

2.- El ) saca los operadores de la pila hasta el (

3.- El + saca de la pila todos los operadores con mayor prioridad que el y l continuacin se coloca el

4.-

5.-

114

TEMA 7

GRAFOS
OBJETIVOS
Analizar e implementar estructuras tipo malla para la representacin de sistemas. Desarrollar algoritmos de procesamiento de una manera ptima.

CONTENIDO
7.1 Definiciones 7.2 Almacenamiento de un Grafo en Memoria 7.3 Aplicaciones Los grafos son estructuras de datos, utilizadas comnmente en el manejo de redes, en la construccin de circuitos elctricos, en las estrategias de ventas, en el rea de economa, cartografa y otras muchas reas del conocimiento.

7.1 DEFINICIONES.
7.1.1 Grafo Un grafo es una estructura de datos compuesta por vrtices y arcos. grficamente un grafo se puede ver as:

Figura 7.1 Grafo El conjunto de vrtices es: v = {A, B, C, D, E, F, G, H, I, J, K, L} Un arco une dos vrtices adyacentes. Por ejemplo el arco JK o el arco EG o GE. No se puede hablar del arco AC pero si del AB y del BC. 7.1.2 Grafo Dirigido 115

Un grafo dirigido o dgrafo, es aquel en el que sus arcos tienen una orientacin, por ejemplo:

Figura 7.2 Grafo con arcos dirigidos

El arco SERVIDOR-CONTROLADOR, es completamente vlido. En este dgrafo no existe el arco CONTROLADOR-SERVIDOR. El conjunto de vrtices del dgrafo anterior es: V = { SERVIDOR, ESTACION UNO, ESTACION DOS, CONTROLADOR, DISPOSITIVO DE SALIDA, TERMINAL BRUTA } 7.1.3 Adyacencia Se dice que existe adyacencia entre dos vrtices si estn unidos por un arco. Tambin se dice que estos vrtices son adjuntos. Por ejemplo para el siguiente grafo:

Figura 7.3 Adyacencia los vrtices A y B son adyacentes. En el caso de dgrafos, la adyacencia se expresa desde o hacia. Como en el siguiente ejemplo:

116

Figura 7.4 Adyacencia en un dgrafo Para este caso, se dice que A es adyacente hacia B, y D es adyacente hacia E, A es adyacente desde C y a su vez D desde B. Para simplificar se emplea la siguiente notacin:

AB: A es adyacente hacia B y B es adyacente desde A. CA: C es adyacente hacia A y A es adyacente desde C.

7.1.4 Incidencia Los arcos inciden en los vrtices. Un arco es incidente en un vrtice, si una de sus puntas llega a ese vrtice. Por ejemplo:

Figura 7.5 Incidencia en un grafo

El arco a, es incidente en A y B. Para el caso de los dgrafos:

Figura 7.6 Incidencia en un dgrafo. El arco a es incidente en B. Este arco no es incidente en A ya que ese arco sale de A, y nunca llega a A. 7.1.5 Grafos y Digrafos Fuertemente Conectados Un grafo est fuertemente conectado si desde cualquier vrtice se puede llegar a todos los dems; o si desde cualquier vrtice, se pueden visitar todos los dems. Por ejemplo:

117

Figura 7.8 Grafo fuertemente conectado De la misma manera, un dgrafo est fuertemente si desde cualquier vrtice se pueden visitar todos los dems. Por ejemplo:

Figura 7.9 Dgrafo fuertemente conectado. Desde los vrtices A,B, C, D y E se puede llegar a todos los otros vrtices. Por ello este dgrafo est fuertemente conectado. 7.1.6 Grafos y Digrafos dbilmente conectados Un grafo o dgrafo es dbilmente conectado, si por lo menos desde un vrtice no podemos llegar a los dems. Esta propiedad la cumple el siguiente dgrafo:

Figura 7.10 Dgrafo dbilmente conectado. En este caso desde B no se puede llegar a ningn otro nodo, por ello es un dgrafo dbilmente conectado. 7.1.7 Camino Simple

118

Se presenta cuando a partir de cualquier vrtice, se puede recorrer la estructura, sin repetir ningn vrtice ni ningn arco. Por ejemplo:

Figura 7.11 Camino simple Partiendo del vrtice C, se puede recorrer todo el grafo, sin repetir vrtices ni arcos. 7.1.8 Grafo de Euler Es un camino cerrado que recorre todos los arcos del grafo. Es decir se pueden visitar los vrtices o nodos cuantas veces sea necesario, pero los arcos solo se pueden recorrer una vez. Ejemplo:

Figura 7.12 Grafo de Euler El recorrido desde el vrtice A puede ser : ACDEFGBEHDAHBA. Como se puede observar los nodos D, E, B y H son visitados dos veces, el nodo A es visitado 3 veces pero todos los arcos son recorridos una sola vez. 7.1.9 Circuito Hamiltoniano Si partiendo de cualquier vrtice , se pueden recorrer todos los vrtices sin repetir ninguno, y finalmente se llega al vrtice origen. En el grafo anterior se encuentra el siguiente circuito Hamiltoniano : A C D E F G B H A. Un grafo Hamiltoniano que recorre n vrtices, consiste exactamente de n arcos. 7.1.10 Grado de un vertice Es el nmero de arcos que inciden en un vrtice. Para los dgrafos pueden existir para cada vrtice dos tipos de grado:

GRADO DE ENTRADA 119

GRADO DE SALIDA

Los grados de entrada de un vrtice en un dgrafo, se determinan por el nmero de arcos que inciden en el vrtice y los grados de salida se determinan por el nmero de arcos que parten del vrtice.

Figura 7.13 Grados de entrada y de salida.

Para la figura anterior, los grados de entrada y salida para cada vrtice son: VERTICE A B C D E GRADOENTRADA 2 2 1 0 2 GRADOSALIDA 0 0 3 3 1

7.1.11 Grafos Regulares Un grafo se dice que es regular , si todos los vrtices tienen el mismo grado. Por ejemplo:

Figura 7.14 Grafo Regular 120

7.1.12 Arco Cclico Un arco es cclico si parte de un vrtice y llega al mismo vrtice. Ejemplo:

Figura 7.15 Grafo con arcos cclicos (AA y BB)

En la anterior figura se tienen dos arcos cclicos, uno en A y el otro en B.

7.1.13 Grafos Simples Un grafo es simple, si no tiene arcos cclicos y existe un solo arco entre dos vrtices. 7.1.14 Grafos Completos Un grafo es completo si cada vrtice tiene un grado igual a n-1, donde n es el nmero de vrtices que componen el grafo. Por ejemplo los siguientes grafos son completos:

Figura 7.17 Grafos completos de 2, 3, 4, 5 y 6 vrtices.

121

7.2 ALMACENAMIENTO DE UN GRAFO EN MEMORIA.


Existen varias formas de almacenar estas estructuras en memoria.

COMO LISTA DE ADYACENCIA COMO MATRIZ DE ADYACENCIA COMO MATRIZ DE INCIDENCIA

Figura 7.18 Grafo a almacenar en memoria. 7.2.1 Lista De Adyacencia Para almacenar un grafo en una lista de adyacencia, debemos trabajar con un arreglo de listas. Cada una de estas listas almacena los adjuntos a un vrtice dado, comenzando por los vrtices de ms arriba y los de ms a la izquierda como orden de prioridad. Por ejemplo una lista tendr almacenados todos los adjuntos al vrtice E; otra lista tendr almacenados todos los adjuntos al vrtice I, etc. Esta es la lista de adyacencia para el grafo anterior (figura 7.19):

Figura 7.19 Lista de adyacencia del grafo de la figura 7.18

122

7.2.1.1 Almacenamiento en memoria. Grafo es un arreglo de estructuras de tipo nodo. Aqu la estructura nodo est conformada por dos campos. El primero es el campo indice que es el identificador de un nodo. El segundo es el campo siguiente que es un apuntador a otra estructura de tipo nodo. La rutina Iniciar_grafo se encarga de colocar un cero en el campo de indice de cada elemento de la estructura grafo, como tambin colocar el valor NULO para el campo siguiente, donde nv es el nmero de vrtices del grafo. INICIAR_GRAFO ( nv)
Inicio i=1 Mientras ( i <= nv) Ind[i]= 0 Sig[i]=A i=i + 1 Fin-Mientras Fin

El algoritmo Leer_grafo se encarga de leer el ndice de cada vrtice y sus correspondientes adjuntos (que forman una lista) para as formar el grafo. LEER_GRAFO(nv)
Inicio INICIAR_GRAFO(nv) i =1 Mientras ( i <= nv) Ejecute nad =NumAdjuntos[i] j =1 Mientras( j <= nad) Ejecute ad =Lea(adjunto) ins _ grafo (grafo, i, ad ) j=j + 1 Fin-Mientras i =i + 1 Fin-Mientras Fin

El algoritmo ins_grafo se encarga de crear el nodo en memoria que conformar la lista de adyacencia para el vrtice i, dentro del arreglo grafo. INS_GRAFO (grafo, i, ad)
Inicio ASIGNA_NODO (nuevo, ad) sig [i] =nuevo q =A p =*grafo [i].sig Mientras (p=A) Haga

123

q =p p = *p.sig Fin-Mientras Si (q = A) *grafo [i].sig = nuevo Sino *q.sig = nuevo Fin-Si Fin

El algoritmo Recorrer_grafo ejecuta la operacin de Visita a cada nodo adjunto de todos los vrtices de un grafo. Recorrer_grafo (grafo, nv)
Inicio i =1 Mientras (i<= nv) p =grafo [i] Visite_Vertice (p) q =*grafo [i].sig Mientras (q =A) Visite_Vertice (q) q =*q.sig Fin-Mientras i=i +1 Fin-Mientras Fin

7.2.2 Matriz De Adyacencia En este caso a cada elemento M[ i , j ], se le asigna un 0 si el vrtice i no es adjunto al vrtice j.; y un 1 en caso contrario. Para el mismo grafo (figura 7.18), la matriz de adyacencia es:

124

Figura 7.20 Matriz de adyacencia para el grafo de la figura 7.18

Como se puede observar la matriz de adyacencia es simtrica. 7.2.2.1 Almacenamiento en memoria. Se tiene una matriz bidimensional denominada grafo. El orden de la matriz es nv * nv, donde nv es el nmero de vrtices en el grafo. Cada elemento matriz[i,j] tiene un valor de 0 si el nodo ( vrtice ) j es adjunto al nodo i. Leer_grafo (grafo)
Inicio nv =Leer_Numero_de_Vertices(grafo) lniciar_grafo(grafo,nv) i =1 Mientras (i <= nv) j =Leer_adjunto(grafo[i]) Mientras (j ) matriz [i, j] =1 j =Leer_adjunto(grafo[j]) Fin-Mientras i =i + 1 Fin-Mientras Fin

7.2.3 Matriz De Incidencia Esta estructura es aplicable para los dgrafos. En la matriz de incidencia cada fila representa a cada uno de los nodos del grafo, y las columnas los posibles arcos de dicho grafo; en la casilla M [i ,j ], aparecer un 1 cuando el nodo de la fila i es inicial, y un -1, cuando el nodo i es final. En la siguiente figura aparece un dgrafo y su correspondiente matriz de incidencia:

Figura 7.21 Matriz de incidencia

125

7.2.3.1 Almacenamiento en memoria. Para este caso tambin se maneja una matriz bidimensional denominada grafo, pero ahora el elemento grafo[i, j] ser igual a 1 si el nodo i es inicial, y ser igual a 1 si es el nodo final. Tendr un valor de cero si los dos nodos, el nodo i y el nodo j no estn conectados directamente. Leer_grafo (grafo)
Inicio nv =Lea numero de vrtices(grafo) Iniciar_grafo(grafo,nv) i =1 Mientras (i <= nv) Haga j =Leer_nodo_de_salida(grafo[i]) Mientras (j ) Haga grafo [i, j] = 1 j =Leer_nodo_de_salida(grafo[j]) Fin-Mientras j =Leer nodo de entrada(grafo[i]) Mientras ( j <= nv ) Haga grafo[i, j] = -1 j =Leer_nodo_de_entrada(grafo[j]) Fin-Mientras i =i + 1 Fin-Mientras Fin

7.3 APLICACIONES.
Dentro de las aplicaciones clsicas y fundamentales se encuentra el estudio de redes. En este campo se han desarrollado tcnicas como son Clculo del Flujo Mximo y Clculo del Costo Mnimo; en ambos casos se trata de optimizacin en redes. Para el Flujo mximo existen 3 algoritmos conocidos:

METODO DE CORTES METODO DE GRAFICO AUXILIAR METODO DE FORD - FULKERSON

Para el Costo Mnimo existen 2 algoritmos conocidos:


METODO DE GRAFICOS DIRIGIDOS METODO DE DIJKSTRA

126

7.3.1 Algoritmo De Dijkstra Este algoritmo usado para determinar el costo mnimo, es el ms implementado en ciertos dispositivos de Hardware. Se encarga de determinar las rutas con el menor costo, desde un nodo origen hacia todos los otros nodos de un grafo. El algoritmo va pasando por diferentes estados. En el estado K, las rutas ms cortas a los K nodos ms cercanos han sido determinadas y estos nodos estn dentro de un grupo denominado M. En el estado K + 1, un nodo que no est en M y que tiene la ruta ms corta desde el nodo origen es incluido en M. Al final todos los nodos estaran en M, y sus rutas desde el origen habran sido determinadas. El algoritmo puede ser formalmente descrito como sigue: N = nmero de nodos en el grafo( red ). s = nodo fuente M = grupo de nodos que han sido incorporados por el algoritmo. dij= Costo del enlace desde el nodo i al nodo j; dii = 0 y dij = si los dos nodos no estn directamente conectados; dij>= 0 si los dos nodos estn directamente conectados. Dn= costo de la ruta con el menor costo, desde el nodo s al nodo n. El algoritmo tiene tres pasos; los pasos 2 y 3 son repetidos hasta que M = N. Es decir tales pasos son repetidos hasta que las rutas finales han sido asignadas a todos los nodos de la red: 1. Inicializar: M = {s} // Al grupo de nodos M solo se incorpora el nodo origen. Dn = dsn para n >s // Los costos de las rutas iniciales hacia los nodos vecinos son simplemente los costos del enlace. 2. Encontrar el nodo vecino que no est en M y que tiene el enlace con menor costo desde el nodo s. El nodo encontrado se incorpora a M. Encontrar w M tal que Dw = min { Dj } para j M Insertar w a M. 3. Actualizar las rutas con el costo mnimo: Dn = min[Dn, Dw + dwm] para todo j M S el ltimo trmino es el mnimo, la ruta de s a n es ahora la uta desde s a w concatenada con el enlace que va de w a n. Cada iteracin de los pasos 2 y 3 coloca un nuevo nodo en M y define la ruta con costo mnimo desde s hasta ese nodo. Esa ruta solo pasa a travs de nodos que estn en M.

127

Figura 7.22 Dgrafo La siguiente tabla muestra el resultado de aplicar el algoritmo sobre el grafo de la figura 7.22, usando s =1 como nodo de origen.

La siguiente figura muestra el resultado de cada iteracin:

128

Figura 7.23 Algoritmo de Dijkstra

129

También podría gustarte