Está en la página 1de 122

Introduccin........... 2 Capitulo I Anlisis y Diseo de Algoritmos Algoritmo..4 Caractersticas de los Algoritmos.6 Anlisis De Algoritmos...7 Recursos De Computadores Y Complejidad.

7 Recursos consumidos...8 Contenido de los datos de entrada.8 Diseo del Algoritmo....9 Tcnica de diseo de Algoritmos...9 Mtodo de fuerza bruta...11 Divide y vencers.13 Mtodo voraz....13 Algoritmos voraces..15 Desglose en monedas16 Multiplicacin de Matrices...19 Algoritmos De Vuelta Atrs....20 Ramificacin (Bifurcacion) Y Acotacin...21 Algoritmos Heuristicos....21 Algoritmos De Aproximacin.23 Algoritmos de bsqueda y ordenacin....24 Algoritmos De Bsqueda...25 Algoritmo de Quick Sort.26 Estructura de Datos UCENM

Semntica...27 Semntica operacional.....28 Semntica denotacional..28 Recursividad..29 Semntica axiomtica..29 Diseo De Algoritmos Recursivos.....30 Recursividad no lineal..30 Recursividad mutua.....30 Recursividad estructural..30 Recursin bien fundada...31 Diseo De Algoritmos Iterativos.....31 Programacin Dinmica..33 Capitulo II Tipos de Datos Abstractos Abstraccin de datos35 Separacin de la interfaz e implementacin....37 Tipos de Abstraccin que Podemos Encontrar en un Programa..40 Capitulo III rboles Definicin no recursiva....45 Definicin recursiva.45 Nomenclatura sobre rboles..46 Uso de los rboles..49 Estructura de Datos UCENM

Estructura de Datos

UCENM

rboles ordenados...50 rboles degenerados...53 rboles binarios....53 Recorridos sobre rboles binarios.53 Construccin de un rbol binario...56 rboles binarios de bsqueda57 rboles binarios perfectamente equilibrados...62 rboles rojinegros64 rboles B..67 Capitulo IV Teora de Grafos Lazos o bucles...73 Tipos de grafos..73 Grafo no dirigido73 Grafo dirigido..74 Pseudografo...75 Estructura de lista..77 Vrtice.77 Subgrafo.78 Ciclos y caminos hamiltonianos..79 Grafo nulo o vaco.80 Grafos simples...80 Grafo trivial.80 Estructura de Datos UCENM

Estructura de Datos

UCENM

Grafos conexos80 Grafos completos.81 Grafos bipartitos...82 Grafos ponderados..83 Grafos planos...83 Teorema de los cuatro colores..85 Coloracin de grafos...86 Capitulo V Mtodos de Clasificacin (Ordenamiento) Clasificacin de Mtodos..98 Comparacin de los Mtodos de Ordenamiento99 Algoritmos de ordenamiento.100 Algoritmos de insercin.101 Algoritmos de intercambio.101 Algoritmos de seleccin.101 Algoritmos de enumeracin...101 Mtodo de Insercin102 Procedimiento Insertion Sort.102 Mtodo de seleccin..103 Mtodo burbuja104 Mtodo de shell105 Archivos107 Bases de Datos...112

Estructura de Datos

UCENM

Introduccin
En programacin, una estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulacin. Un dato elemental es la mnima informacin que se tiene en un sistema. Las estructuras de datos son una coleccin de datos cuya organizacin se caracteriza por las funciones de acceso que se usan para almacenar y acceder a elementos individuales de datos. Una estructura de datos se caracteriza por lo siguiente: Pueden descomponerse en los elementos que la forman. La manera en que se colocan los elementos dentro de la estructura afectar la forma en que se realicen los accesos a cada elemento. La colocacin de los elementos y la manera en que se accede a ellos puede ser encapsulada.

Una estructura de datos define la organizacin e interrelacin de stos y un conjunto de operaciones que se pueden realizar sobre ellos. Las operaciones bsicas son: Alta, adicionar un nuevo valor a la estructura. Baja, borrar un valor de la estructura. Bsqueda, encontrar un determinado valor en la estructura para realizar una operacin con este valor, en forma SECUENCIAL o BINARIO (siempre y cuando los datos estn ordenados)... Otras operaciones que se pueden realizar son: Ordenamiento, de los elementos pertenecientes a la estructura. Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas. Cada estructura ofrece ventajas y desventajas en relacin a la simplicidad y eficiencia para la realizacin de cada operacin. De esta forma, la eleccin de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operacin sobre los datos. Cuando hablamos de tipos de datos bsicos nos referimos a un conjunto de valores ms sus operaciones asociadas, por ejemplo, dentro del computador un nmero entero se representa con un par de bytes (16 bits), con ello, slo puede almacenar valores en un rango de [-2 16/2, +216/2] y disponer de los operadores aritmticos: +, -, *, / y mod. Extendiendo el concepto, si agrupamos un conjunto de valores de igual o distinto tipo de dato bsico y enseguida definimos la manera de cmo operar sobre ellos, es decir, sus mtodos de acceso, estaramos en presencia de una ESTRUCTURA DE DATOS.

Estructura de Datos

UCENM

La definicin de una Estructura de Datos posee: Primer nivel: De abstraccin en donde simplemente se identifica la coleccin de elementos a agrupar y sus operaciones de acceso. En un segundo nivel: El de implementacin, ya pensamos en un lenguaje de programacin especfico y es ah donde surgen preguntas como cul es la estructura ptima? o qu funciones y/o procedimientos.definir? Como ya sabemos, las computadoras fueron diseadas o ideadas como una herramienta mediante la cual podemos realizar operaciones de clculo complicadas en un lapso de mnimo tiempo. Pero la mayora de las aplicaciones de este fantstico invento del hombre, son las de almacenamiento y acceso de grandes cantidades de informacin. La informacin que se procesa en la computadora es un conjunto de datos, que pueden ser simples o estructurados. Los datos simples son aquellos que ocupan slo una localidad de memoria, mientras que los estructurados son un conjunto de casillas de memoria a las cuales hacemos referencia mediante un identificador nico. Debido a que por lo general tenemos que tratar con conjuntos de datos y no con datos simples (enteros, reales, booleanos, etc.) que por s solos no nos dicen nada, ni nos sirven de mucho, es necesario tratar con estructuras de datos adecuadas a cada necesidad.

Estructura de Datos

UCENM

Capitulo I

Anlisis y Diseo de Algoritmos


Algoritmo
Un algoritmo es un conjunto de operaciones y procedimientos que deben seguirse para resolver un problema. Es un mtodo para resolver un problema mediante una serie de datos precisos, definidos y finitos.

Marco Histrico
La palabra algoritmo se deriva del nombre latinizado del gran Matemtico rabe Mohamed Ibn Al Kow Rizmi, el cual escribi sobre los aos 800 y 825 su obra Quitad Al Mugabala, donde se recoga el sistema de numeracin hind y el concepto del cero. Fue Fibinacci, el que tradujo la obra al latn y el inicio con la palabra: Algoritmi Dicit. El lenguaje algortmico es aquel por medio al cual se realiza un anlisis previo del problema a resolver y encontrar un mtodo que permita resolverlo. El conjunto de todas las operaciones a realizar y el orden en que se deben efectuarse, se le denomina algoritmo. Es un mtodo para resolver un problema mediante una serie de datos precisos, definidos y finitos.

Generalidades
El programador de computadoras es ante que nada una persona que resuelve problemas, por lo que para llegar a ser un programador eficaz se necesita aprender a resolver problemas de un modo riguroso y sistemtico. A la metodologa necesaria para resolver problemas mediante programas se denomina Metodologa de la Programacin. El eje central de esta metodologa es el concepto, algoritmo. Un algoritmo es un mtodo para resolver un problema. Aunque la popularizacin del trmino ha llegado con el advenimiento de la era informtica, algoritmo proviene de Mohammed alKhowarizmi, matemtico persa que vivi durante el siglo IX y alcanzo gran reputacin por el enunciado de las reglas para sumar, restar, multiplicar y dividir nmeros decimales; la traduccin al latn del apellido de la palabra algorismus derivo posteriormente en algoritmo. Euclides, el gran matemtico griego (del siglo IV antes de Cristo) que invento un mtodo para encontrar el mximo comn divisor de dos nmeros, se considera con Al-Khowarizmi el otro gran padre de la algoritmia (ciencia que trata de los algoritmos).

Estructura de Datos

UCENM

El profesor Niklaus Wirth, inventor de Pascal, Modula-2 y Oberon, titulo uno de sus mas famosos libros, Algoritmos + Estructuras de Datos = Programas, significndonos que solo se puede llegar a realizar un buen programa con el diseo de un algoritmo y una correcta estructura de datos. Esta ecuacin ser de una de las hiptesis fundamentales consideradas en esta obra. La resolucin de un problema exige el diseo de un algoritmo que resuelva el problema propuesto.

Problema

Diseo del algoritmo

Programa de computadora

Los pasos para la resolucin de un problema son: Diseo de algoritmo, que describe la secuencia ordenada de pasos que conducen a la solucin de un problema dado. (Anlisis del problema y desarrollo del algoritmo). Expresar el algoritmo como un programa de lenguaje de programacin adecuado. (Fase de codificacin.) Ejecucin y validacin del programa por la computadora. Para llegar a la realizacin de un programa es necesario el diseo previo de algoritmo, de modo que sin algoritmo no puede existir un programa. Los algoritmos son independientes tanto del lenguaje de programacin en que se expresan como de la computadora que lo ejecuta. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programacin y ejecutarse en una computadora distinta; sin embargo, el algoritmo ser siempre el mismo. As, por ejemplo, en una analoga con la vida diaria, una receta de un plato de cocina se puede expresar en espaol, ingles o francs, pero cualquiera que sea el lenguaje, los pasos para la elaboracin del plato se realizaran sin importar el idioma del cocinero. En la ciencia de la computacin y en la programacin, los algoritmos son ms importantes que los lenguajes de programacin o las computadoras. Un lenguaje de programacin es tan solo un medio para expresar un algoritmo y una computadora es solo un procesador para ejecutarlo. Tanto el lenguaje de programacin como la computadora son los medios para obtener un fin: conseguir que el algoritmo se ejecute y se efecte el proceso correspondiente. Estructura de Datos 8 UCENM

Dada la importancia del algoritmo en la ciencia de la computacin, un aspecto muy importante ser el diseo de algoritmos. El diseo de la mayora de los algoritmos requiere creatividad y conocimientos profundos de la tcnica de la programacin. En esencia, la solucin de un problema se puede expresar mediante un algoritmo.

Caractersticas de los Algoritmos


Las caractersticas fundamentales que debe cumplir todo algoritmo son: Un algoritmo debe ser preciso e indicar el orden de realizacin de cada paso. Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. Un algoritmo debe ser finito. Si se sigue un algoritmo se debe terminar en algn momento; o sea, debe tener un numero finito de pasos. La definicin de un algoritmo debe definir tres partes: Entrada, Proceso y Salida. En el algoritmo de receta de cocina citado anteriormente se tendr: Entrada: ingrediente y utensilios empleados. Proceso: elaboracin de la receta en la cocina. Salida: terminacin del plato (por ejemplo, cordero). Ejemplo de Algoritmo: Un cliente ejecuta un pedido a una fbrica. Esta examina en su banco de datos la ficha del cliente; si el cliente es solvente entonces la empresa acepta el pedido; en caso contrario rechazara el pedido. Redactar el algoritmo correspondiente. Los pasos del algoritmo son: 1. inicio 2. leer el pedido 3. examinar la ficha del cliente 4. si el cliente es solvente aceptar pedido; en caso contrario, rechazar pedido 5. fin

Estructura de Datos

UCENM

Anlisis De Algoritmos
El anlisis de algoritmos es una parte importante de la Teora de complejidad computacional ms amplia, que provee estimaciones tericas para los recursos que necesita cualquier algoritmo que resuelva un problema computacional dado. Estas estimaciones resultan ser bastante tiles en la bsqueda de algoritmos eficientes. A la hora de realizar un anlisis terico de algoritmos es corriente calcular su complejidad en un sentido asinttico, es decir, para un tamao de entrada suficientemente grande. La medida exacta (no asinttica) de la eficiencia a veces puede ser computada pero para ello suele hacer falta aceptar supuestos acerca de la implementacin concreta del algoritmo, llamada modelo de computacin. Un modelo de computacin puede definirse en trminos de una ordenador abstracto, como la Mquina de Turing, y/o postulando que ciertas operaciones se ejecutan en una unidad de tiempo. Las estimaciones de tiempo dependen de cmo definamos un paso. Para que el anlisis tenga sentido, debemos garantizar que el tiempo requerido para realizar un paso est acotado superiormente por una constante.

Recursos De Computadores Y Complejidad


Algoritmo: Conjunto de reglas para resolver un problema. Su ejecucin requiere unos recursos.

0 ms entradas

Memoria

E/S

Comunicacin

ALGORITMO

1 ms salidas

Un algoritmo es mejor cuantos menos recursos consuma, su facilidad de programarlo, corto, fcil de entender, robusto, etc.

Criterio empresarial: Maximizar la eficiencia.

Estructura de Datos

10

UCENM

Eficiencia: Relacin entre los recursos consumidos y los productos conseguidos. Recursos consumidos: Tiempo de ejecucin. Memoria principal: Entradas/salidas a disco. Comunicaciones, procesadores, etc. Lo que se consigue: Resolver un problema de forma exacta, forma aproximada o algunos casos.

Recursos consumidos
Ejemplo. Cuntos recursos de tiempo y memoria consume el siguiente algoritmo sencillo? i: = 0 a [n+1]:= x repetir i: = i + 1 hasta a[i] = x Respuesta: Depende. De qu depende? De lo que valga n y x, de lo que haya en a, de los tipos de datos, de la mquina... En general los recursos dependen de:Factores externos. El ordenador donde lo ejecutemos. El lenguaje de programacin y el compilador usado. La implementacin que haga el programador del algoritmo. En particular, de las estructuras de datos utilizadas. Tamao de los datos de entrada. Ejemplo. Calcular la media de una matriz de NxM.

Contenido de los datos de entrada.


Mejor caso. El contenido favorece una rpida ejecucin. Peor caso. La ejecucin ms lenta posible. Caso promedio. Media de todos los posibles contenidos. Los factores externos no aportan informacin sobre el algoritmo. Normalmente usaremos la notacin T(N)=..., pero qu significa T(N)? Tiempo de ejecucin en segundos. T(N) = bN + c. Suponiendo que b y c son constantes, con los segundos que tardan las operaciones bsicas correspondientes. Estructura de Datos 11 UCENM

Diseo del Algoritmo


En la etapa de anlisis del proceso de programacin se determina que hace el programa. En la etapa de diseo se determina como hace el programa la tarea solicitada. Los mtodos mas eficaces para el proceso de diseo se basan en el conocido por Divide y Vencers, es decir, la resolucin de un problema complejo se realiza dividiendo el problema en sub problemas y a continuacin dividir estos sub problemas en otros de nivel mas bajo, hasta que pueda ser implementada una solucin en la computadora. Este mtodo se conoce tcnicamente como diseo descendente (Top Down) o modular. El proceso de romper el problema en cada etapa y expresar cada paso en forma ms detallada se denomina refinamiento sucesivo. Cada sub programa es resuelto mediante un modulo (sub programa) que tiene un solo punto de entrada y un solo punto de salida. Cualquier programa bien diseado consta de un programa principal (el modulo de nivel mas alto) que llama a sub programas (mdulos de nivel mas bajo) que a su vez pueden llamar a otros sub programas. Los programas estructurados de esta forma se dice que tienen un diseo modular y el mtodo de romper el programa en mdulos ms pequeo se llama Programacin Modular. Los mdulos pueden ser planeados, codificados, comprobados y depurados independientemente (incluso por diferentes programadores) y a continuacin combinarlos entre si. El proceso implica la ejecucin de los siguientes pasos hasta que el programa se termina: programar modulo. Comprobar el modulo. Si es necesario, depurar el modulo. Combinar el modulo con los mdulos anteriores. El proceso que convierte los resultados del anlisis del problema en un diseo modular con refinamiento sucesivo que permitan una posterior traduccin al lenguaje se denomina diseo de algoritmo. El diseo del algoritmo es independiente del lenguaje de programacin en el que se vaya a codificar posteriormente.

Tcnica de diseo de Algoritmos


Hasta ahora se han realizado algunos comentarios respecto a la necesidad de disear algoritmos correctos y eficientes utilizando los elementos de un lenguaje de programacin .Es necesario en este momento mencionar algo sobre como hacerlo. El acto de disear un algoritmo puede considerarse como una tarea que difcilmente podr ser del todo automatizada.

Estructura de Datos

12

UCENM

Todo problema algortmico es un reto para su diseador, algunos resultan inmediatos de resolver, otros son bastante complejos. La investigacin en esta rea ha permitido descubrir un conjunto de mtodos o esquemas de diseo hacia los cuales puede orientarse la realizacin de muchos algoritmos. No obstante, y a pesar de que resulta mas adecuado en bastantes casos utilizar alguno de estos esquemas que realizar un diseo desde cero, idear un algoritmo continua siendo una labor bastante creativa donde los conocimientos y la experiencia del propio diseador tiene un papel fundamental. El diseo de un algoritmo que resuelva un problema es, en general, una tarea difcil. Una forma de facilitar esta labor consiste en recurrir a tcnicas conocidas de diseo de algoritmos, se decir, a esquemas muy generales que pueden adaptarse a un problema particular al detallar las partes generales del esquema. Muchos problemas pueden resolverse buscando una solucin fcil y directa pero, a la vez bastante ineficiente. Este mtodo, llamado de fuerza bruta, puede ser muy directo, pero con un poco de anlisis puede encontrarse algoritmos ms eficientes. El esquema mas sencillo quizs sea el llamado divide y vencers, basado en la descomposicin de un problema en sub problemas. Otros esquemas requieren un anlisis minucioso del problema de forma que la solucin se vaya construyendo en etapas. Si puede preverse que decisin conviene en cada etapa para producir cierto tipo de mejor resultado, tenemos una solucin voraz, si la decisin en una etapa, solo puede tomarse tras considerar varias soluciones de otras etapas mas simples, la solucin es dinmica. Aun as, hay problemas cuya solucin no puede hallarse sino mediante un proceso de bsqueda, a pesar de lo complejas que son las operaciones de bsqueda, su uso adecuado mediante el esquema de bsqueda con retroceso (o backtracking) permite ganar gran eficiencia respecto a soluciones de fuerza bruta. Por ultimo, conviene conocer otros mtodos de diseo de algoritmos que tambin resultan de utilidad prctica. Nos estamos refiriendo a mtodos basados en la mejora de la eficiencia (por ejemplo, el uso de parmetros de acumulacin al resolver problemas utilizando divide y vencers, y el empleo de tablas como estructura auxiliar para la resolucin eficiente de problemas donde se aplica programacin dinmica), y a mtodos basados en transformaciones del dominio para encontrar una solucin mas fcilmente a un problema en un dominio transformado, siendo dicha solucin finalmente adaptada al dominio original.

Consideraciones generales
Si el hbil programador dispone de un recetario de algoritmos de donde poder seleccionar el ms adecuado para cada problema, su tarea se simplifica. Supongamos que disponemos de una especificacin precisa, completa y consistente del problema a resolver y queremos obtener un algoritmo en el que, dados uno datos de entrada valido, se produzca cierto resultado. Si no nos importa la eficiencia del algoritmo, podramos Estructura de Datos 13 UCENM

utilizar un algoritmo general llamado algoritmo del museo britnico. Se programa un computador de manera que parta de un conjunto de axioma matemticos y los que use para reducir aleatoriamente teoremas validos. Aprender los principios bsicos del diseo de algoritmos podemos preguntarnos por un mtodo aceptable. El mas entendido, y quizs el mejor, es organizar el diseo sobre un esquema de algoritmo o una tcnica de diseo que haya demostrado su utilidad para otros problemas. Este mtodo de trabajo es practicable, puesto que existe un nmero reducido de esquema y tcnicas de diseo. El conocimiento de tcnicas de diseo es solo un primer paso para el diseador, que debe completarse con otros conocimientos y, sobre todo, con la experiencia.

Mtodo de fuerza bruta


Comenzamos el estudio de esquemas algortmicos con un mtodo sencillo, pero que debe evitarse siempre que se pueda, dad su ineficacia; la fuerza bruta. En realidad, no es un esquema algortmico, si no mas bien calificativo. Para una forma de disear algoritmos: tomar una solucin directa, poco reflexionada. En principio, esto no es malo, pero dado que no se ha analizado apenas el problema, es muy probable que no se hayan aprovechado propiedades deducibles del problema y que la solucin sea terriblemente ineficiente. Una solucin por fuerza bruta tambin puede resultar adecuada como primera aproximacin a la solucin final, porque su desarrollo puede permitir profundizar ms sobre el problema y conocer propiedades que sean utilizadas para obtener otra versin ms eficiente. Por ejemplo: Algunos algoritmos de bsqueda de un elemento en un vector. Uno de ellos realizaba una bsqueda secuencial con complejidad lineal sobre el tamao del vector y poda usarse con cualquier vector. Otro algoritmo realizaba un bsqueda dicotomica o binaria, con complejidad logartmica, y solo se poda usar cuando el vector estuviese ordenado. El algoritmo primero responde a un razonamiento ms sencillo, por lo que uno puede sentirse tentado a usar siempre. Esta es la solucin de fuerza bruta: una solucin directa, pero poco reflexionada. Lo ms razonable es comprobar si el vector esta ordenado y, en caso positivo, aprovechar esta circunstancia para usar el algoritmo ms eficiente: el de bsqueda binaria.

Tcnicas de los Parmetros Acumuladores y de Tabulacion


La recurcion es un mecanismo que permite obtener, en combinacin con otras construcciones, una solucin funcional a muchos problemas. Muchos algoritmos recursivos

Estructura de Datos

14

UCENM

resultan eficientes, pero no todos: hay algunos fcilmente formulables, pero muy ineficientes. En estos casos, dichos algoritmos pueden servir como una primera aproximacin al algoritmo definitivo, pero debe mejorar su rendimiento para que sea prctico. Veremos dos parmetros para la mejora de eficiencia de algoritmos recursivos: el uso de parmetros acumuladores y el uso de tablas. Cada una se ilustra con un ejemplo distinto.

Parmetros Acumuladores
Veamos primero una solucin ineficiente que intentaremos mejorar. Ejemplo: Nmeros de Fibonacci Los nmeros de fibonacci suele especificarse como: Fib(0)=1 Fib(1)1 Fib(n+2)=fib(n)+fib(n+1) Esta especificacin de los nmeros de fibonacci tiene una formulacin recursiva inmediata en estilo funcional. Un modo de evitar problema lo proporciona la tcnica de los parmetros acumuladores, cuya idea bsica se expone a continuacin. La funcin principal usa una funcin auxiliar que tiene los parmetros de aquellas ms algunos adicionales. La funcin principal simplemente realiza una llamada a esta funcin auxiliar en los que los parmetros de aquellas se modifican y los parmetros nuevos toman un valor inicial adecuado. Los parmetros adicionales tienen como misin ir acumulando resultados principales durante el proceso recursivo.

Tabulacion
No todos los algoritmos recursivos ineficientes pueden optimizarse con la tcnica de los parmetros acumuladores. Otra tcnica til es el uso de tablas. La intencin es que la primera vez que se realiza un clculo, se almacena en una tabla, donde puede consultarse otras veces que se necesite. Esta tcnica tambin se suele emplear con la programacin dinmica. Ejemplo:

Estructura de Datos

15

UCENM

Sea el problema de la competicin. Hay dos participantes (deportistas o equipos, no importa que), A,B, que juegan una competicin que es ganada por el primero que venza en n partidos, siendo ( n ) mayor que( 0 ). Por sencillez , se supone que ambos participantes tienen cualidades y preparacin similar . De forma que cada uno tiene un 50% de posibilidades de ganar cada partido. De todas formas, la modificacin para incorporar probabilidades diferentes es evidente y no complica el problema.

Divide y vencers
Consiste en descomponer un problema en un subproblema, resolver independientemente los subproblemas para luego combinar sus soluciones y obtener la solucin del problema original. Esta tcnica se puede aplicar con xito a problemas como la multiplicacin de matrices, la ordenacin de vectores, la bsqueda en estructuras ordenadas, etc. Ejemplo. Bsqueda de una palabra en un diccionario Como ejemplo sencillo de aplicacin de esta estrategia puede considerarse la bsqueda de una palabra en un diccionario de acuerdo con el siguiente criterio. Se abre el diccionario por la pagina centrar (quedando dividido en dos mitades) y se comprueba si la palabra aparece all o si es lxico grficamente anterior o posterior. Si no ha encontrado y es anterior se procede a buscarla en la primera mitad., si es posterior, se buscara en la segunda mitad. El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece.

Mtodo voraz
Este mtodo trata de producir tipo de mejor resultado a partir de conjunto de opciones candidatas .Para ello, se va procedimiento paso a paso realizndose la mejor eleccin (usando una funcin objetivo que respeta un conjunto de restricciones ) de entre las posibles. Puede emplearse en problemas de optimizacin, como el conocido de la mochila, en la bsqueda de caminos mnimos sobre grafos, la planificacin en el orden de la ejecucin de unos programas en un computador, etc. Ejemplo. Dar un cambio utilizando el menor nmero de monedas Considrese ahora el problema de la devolucin del cambio al realizar una compra (por ejemplo, en una maquina expendedora de tabaco). Suponiendo que se disponga de cantidad

Estructura de Datos

16

UCENM

suficiente de ciertos tipos diferentes de monedas de curso legal, se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. La estrategia voraz aplicada comienza devolviendo, cuando se pueda, la moneda de mayor valor ( es decir, mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar), continua aplicndose el mismo criterio para la segunda moneda mas valiosa, y as sucesivamente. El proceso finaliza cuando se ha devuelto todo el cambio. Consideraciones y Criterios para Disear Algoritmos Algunas consideraciones estilsticas pueden contribuir a mejor la calidad de los algoritmos (y programas ) mediante la reduccin del numero de errores que aparecen al desarrollar los. Tambin influyen haciendo que nuestro algoritmo resulte ms fcil de leer y entender para otras personas. Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificacin. Ello asegura que tanto algoritmos como programa resulten legibles y puedan modificarse fcilmente en caso de necesidad. Generalmente, estas normas de estilo se dirigen hacia aspectos como la forma de construir los nombres de variables o tipo de datos que aparezcan., la tipografa seguida ala hora de escribir nombres de variables, subprogramas, palabras claves, etc. El modo de encolumnar las distintas partes de un algoritmo para facilitar su lectura y comprensin, y la normas sobre como y donde deben de introducirse los comentarios. Estilo y calidad de los programas van fuertemente unidos. Ante la pregunta Cules son las caracterstica de un buen algoritmo?, las siguientes respuestas reflejan, cierta medida, los factores que identifican la calidad en ellos . Correccin, el algoritmo debe funcionar. Nunca se debe olvidar que la caracterstica ms simple e importante de un algoritmo es que funcione. Pude aparecer obvio, pero resulta difcil de asegurar en algoritmos complejos. Eficiencia, el algoritmo no debe desaprovechar recursos. La eficiencia de un algoritmo se mide por los recursos que este consume. En particular, se habla de la memoria y del tiempo de ejecucin. A pesar de que con la reduccin de los costes del hardware es posible disear computadores ms rpidos y con ms memoria, no hay que desperdiciar estos recursos y tratar de desarrollar algoritmos ms eficientes. Claridad, el algoritmo debe estar bien documentacin. La documentacin ayuda a comprender el funcionamiento de los algoritmos. Ciertos detalles o algunas partes especiales de los mismos pueden olvidarse fcilmente o quedar oscura si no estn adecuadamente comentadas. En realidad, y de acuerdo con los puntos de vista anteriores, la calidad de un algoritmo tiene muchas facetas y todas ellas importantes. Resumiendo, lo ideal es que nuestro algoritmo resulte correcto, eficiente, claro, fiable y fcil de mantener.

Estructura de Datos

17

UCENM

Algoritmos voraces
Esquema voraz: Hay muchos problemas en los que se pretende obtener un subconjunto de n elementos que satisfaga ciertas restricciones y que optimice alguna medida. Se supone que un problema de esta clase tiene al menos una solucin. Puede haber varias soluciones optimas, en cuyo caso no importa cual se elija. Por ejemplo, sea el problema de encontrar un subconjunto de los arcos de un grafo. Otro ejemplo se da cuando, dados unos ficheros almacenados en una cinta de que el tiempo de recuperacin de un fichero cualquiera sea el mnimo en promedio. A menudo, el problema incluye restricciones adicionales que limitan el nmero posible de soluciones. Normalmente, estos problemas no se intentan resolver de golpe , encontrando de una sola vez la solucin completa y ptima. Es ms frecuente que el subconjunto de la solucin se vaya formando paso a paso, analizando durante cada etapa que elemento conviene aadir a la solucin parcial ya existente. La dificultad principal para resolver esta clase de problemas estriba en el anlisis necesario para poder formular un algoritmo que halle la solucin en varios pasos. Un algoritmo voraz sigue el esquema anterior, pero con la fortuna de que cada vez que aade un elemento a la solucin se tiene la certeza de haber realizado la mejor eleccin posible. Esta caracterstica hace que aunque el anlisis del problema sea arduo, la solucin voraz siempre resulte sencilla. La nica complicacin es comprobar que se siguen satisfaciendo las restricciones del problema. Por lo que se ha descrito del esquema voraz, ste es un proceso repetitivo sencillo que trata sucesivamente los diferentes elementos del problema. Para facilitar la descripcin de este proceso, puede llamarse candidato al elemento tratado en cada paso. Inicialmente, el conjunto de candidatos que forman la solucin est vaco. En cada paso se intenta aadir el mejor de los candidatos restantes a dicha solucin parcial. Si este conjunto ampliado sigue siendo vlido, es decir, si satisface las restricciones del problema y, por tanto, permite formar una solucin del problema, el candidato se incorpora definitivamente. Al contrario, si dicho conjunto no es vlido, se desecha el candidato. Si el algoritmo voraz se ha diseado correctamente, la primera solucin encontrada es ptima. Por tanto, la dificultad principal al disear un algoritmo voraz reside en encontrar un criterio en encontrar un criterio de seleccin que garantice la optimalidad de la solucin.

Segn esta descripcin, el problema parte de: Una funcin objetivo que da el valor de una solucin. Obviamente, sta es la funcin por optimizar. Un conjunto de restricciones sobre el valor de los datos de entrada y sobre la solucin final del problema. A su vez, la solucin consta de:

Estructura de Datos

18

UCENM

Un conjunto de candidatos Una funcin de seleccin que en cada momento determine que candidato de los an no usados parece ser el mejor. Una funcin que determine si cierto conjunto de candidatos es vlido; es decir, si permite formar alguna solucin del problema. Obsrvese que las funciones de validez y completitud no se preocupan de la optimalidad del la solucin, pero si la funcin de seleccin es la adecuada, cada solucin vlida y completa es optima. Podemos representar el esquema voraz de la siguiente forma funcional: FUNCTION Voraz ( candidatos: ( 1..n ) : ( 1..n) -> FUNCTION VorazAcumulador ( candidatos : (1..n), Solucin : (1..n) : (1..n) -> Cadidatos = ( ) v EsSolucin ( solucin)-> Value siguiente -> seleccionar ( candidatos ) IN EsVlida (solucin v ( siguiente)) => VorazAcumulador (candidatos (solucin), solucin v (siguiente)) VorazAcumulador (candidatos (siguiente), solucin) VorazAcumulador (candidatos, ( ) ) Puede verse por qu estos algoritmos se llaman voraces : en cada paso toman el mejor trozo de la solucin; es decir, el mejor candidato. Adems, nunca cambian de opinin: una vez que un candidato es aceptado o rechazado en la solucin, la decisin, es definitiva. La funcin objetivo no suele aparecer en el algoritmo final, sino que se utiliza durante el anlisis del problema y es determinante en la eleccin de la funcin de seleccin. De todas formas, debe recordarse que puede haber varios criterios alternativos de seleccin y que de su correcta eleccin depende que la solucin calculada por el algoritmo sea optima. Como ejercicio, se puede intentar encontrar una solucin voraz del problema del calendario. Es fcil encontrar una solucin si en cada etapa se genera el subcalendario correspondiente a un equipo; es decir, la tabla de competicin se va completando por filas. Como fila primera se toma la secuencia de los ndices de los participantes en cualquier orden. Cada fila resultante puede tener una complejidad de o (n2). Adems, este algoritmo tiene la ventaja de valer para las situaciones en que el nmero de participantes no es una potencia de dos.

Desglose en monedas
Como primer ejemplo introductorio sencillo al que puede aplicarse la tcnica voraz, se considera el problema de un cambio o desglose en monedas. Hay que desglosar una cantidad en un conjunto de monedas tratando de cumplir alguna condicin; en este caso, utilizar el menor nmero de monedas. Para ello, se parte de un conjunto de tipos de monedas vlidas, de las que se supone que hay cantidad suficiente para realizar el desglose,

Estructura de Datos

19

UCENM

y de un importe. Se trata de indicar la cantidad (menor) de monedas de los tipos considerados, tales que sumados sus valores equivalgan al importe. Para simplificar, suponemos que manejamos dinero espaol y, en particular, podemos utilizar slo monedas de 500, 100, 50, 25, 5 y 1 pesetas para el desglose. Estos valores se definen por medio de un tipo enumerado MONEDAS. Asimismo, se declaran los tipos VALORES y CANTIDADES para representar el valor asignado a cada unidad monetaria y la cantidad de cada tipo de moneda que se devolver en el desglose. Su declaracin es la siguiente: TYPE Monedas -> M500 I M100 I M50 I M25 I M5 I M1, Valores -> Integer M500M1 Cantidades -> Integer M500.M1 Se supone inicialmente asignados los valores a cada uno de los tipos de monedas. Los elementos de la tcnica voraz estn presentes en este problema de la siguiente forma: El conjunto de candidatos est constituido por cada una de las monedas de los diferentes tipos que se pueden usar para realizar el desglose del importe dado. Una solucin viene dad por un conjunto de monedas devuelto tras el desglose, y cuyo valor total es igual al importe a desglosar. La condicin de factibilidad de la solucin siendo construida establece en el desglose debe ser menor o igual que el importe a desglosar. La funcin de seleccin establece que hay que elegir, mientras sea posible, la moneda de mayor valor de entre las candidatas. La funcin objetivo cosiste en minimizar la cantidad total de monedas utilizadas en el desglose. Con esta informacin se puede comprobar que en este problema estn presentes los distintos elementos de la tcnica voraz. Adems, cuando un candidato (moneda) se incorpora al conjunto solucin, ste no ser nunca excluido de l. .

Ordenacin de un Vector por Mezcla


La ordenacin de un vector es un problema que se presta fcilmente a la aplicacin de la tcnica de divide y vencers. El caso bsico corresponde a un subvector de un solo elemento, que obviamente ya esta ordenado. Para el caso general, sea v i..s un vector de ndice inferior i e ndice superior s. La particin puede hacerse por la mitad si se toma un ndice m=[(i+s)/2] y dos subvectores vi..m y vm+1..s . La combinacin de los dos subvectores ya ordenados es fcil. basta con mezclar los dos subvectores, mediante comparaciones de sus elementos sucesivos, para obtener un nico vector ordenado. Este proceso de mezcla es realizado por un procedimiento auxiliar. El algoritmo resultante es: PROCEDURE Ordenar (INOUT v : INTEGER1..N) -> (* ordenacin por mezcla *) PROCEDURE OrdenarAux (INOUT Vector : INTEGER1..N,1..N, IN inf, sup : 1..N) ->

Estructura de Datos

20

UCENM

VAR Medio : 1..N IF inf < sup THEN medio: = (inf+sup) Div 2; OrdenarAux (vector, inf, medio); OrdenarAux (vector, medio+1, sup); Mezclar (vector, inf, medio, sup) OrdenarAux (v, 1, N) El procedimiento para realizar la mezcla de los subvectores ordenados es: PROCEDURE Mezclar (IN inf: INTEGER, IN medio: INTEGER, IN sup: INTEGER, INOUT vector: INTEGER1.N) -> VAR vectorAux : INTEGER1..N, i1, i2, j : INTEGER, ndice : INTEGER i1 := inf; i2 := medio + 1; j := inf; WHILE (i1<=medio) ^ (i2<=sup) DO IF vectori1 << vectori2 THEN vectorAuxj :=vectori1; i1 :=i1 + 1 ELSE vectorAuxj ;= vectori2; i2 := i2 + 1 j := j + 1 FOR ndice IN i1..medio DO vectorAuxj := vectorindice; J := j + 1 FOR ndice IN i2..sup DO vectorAuxj := vectorindice ; J := j + 1 FOR ndice In inf..sup DO vectorindice := vectorAuxindice El algoritmo resultante es sencillo conceptualmente. Es fcil analizar la complejidad del algoritmo para un vector de longitud n. La operacin de mezcla es proporcional a n, de forma que las ecuaciones de recurrencia de la funcin de tiempo son:

Estructura de Datos

21

UCENM

T(n) = a, 2T(n/2) + bn,

n=1, a=cte n>1, b=cte

Si n es una potencia de 2; es decir, n =2 k para algn k, las ecuaciones anteriores se resuelven por sustituciones sucesivas, resultando: T(n) = 2T(n/2) + bn==2K T(n/2K) + kbn = an + bn log2 n El algoritmo de ordenacin por mezcla es ptimo en tiempo de ejecucin. Los nicos inconvenientes que presenta es que el procedimiento de mezcla necesita gran capacidad de almacenamiento (para dos copias del vector) y que, adems de mezclar, necesita copiar el vector auxiliar completo en el principal. Puede disearse un algoritmo de mezcla ms complejo que mejore ambos aspectos, pero mantenga la complejidad asinttica calculada.

Multiplicacin de Matrices
Sean dos matrices, A y B, de dimensin nxn. La matriz producto C=AxB tambin es una matriz de nxn cuyo elemento (i,j)-esimo se forma multiplicando cada elemento de la final iesima de A por el elemento correspondiente de la columna j-esima de B y sumando los productos parciales. El clculo de cada elemento Cij requiere n multiplicaciones. La matriz C tiene n2 elementos, as que el tiempo total del algoritmo de multiplicacin es de orden O(n 3). El algoritmo anterior, que podemos llamar algoritmo convencional de multiplicacin de matrices, proviene directamente de la definicin matemtica del producto de matrices. Sin embargo, la tcnica de divide y vencers sugiere un algoritmo distinto. Supongamos, por sencillez, que n es una potencia de dos; es decir, que existe un entero no negativo k tal que n=2k. (Si n no es un potencia de dos, pueden aadirse las filas y columnas de ceros necesarias para formar una dimensin que sea potencia de dos.) las submatrices A y B pueden partirse en cuatro submatrices de dimensin (n/2)x(n/2). Si el producto AxB tiene la forma: A11 A12 A21 A22 Entonces: C11 = A11*B11 + A12*B21 C12 = A11*B12 + A12*B22 C21 = A21*B11 + A22*B21 C22 = A21*B12 + A22*B22 Para n=2, los elementos Cij se calculan mediante algunas multiplicaciones y sumas de nmeros, pero para n>2 las submatrices Cij se calculan mediante multiplicaciones (recursivas) y sumas de submatrices de dimensin (n/2)x(n/2). Dos submatrices de (n/2)x(n/2) pueden sumarse en un tiempo bn2, siendo b alguna constante. B11 B12 B21 B22 C11 C12 C21 C22

Estructura de Datos

22

UCENM

La resolucin de este sistema de ecuaciones nos dice que O(T(n))=OT(n3), de forma que no se ha conseguido ningn ahorro sustancial de tiempo. Sin embargo, interesa encontrar algoritmos mas eficientes, porque la multiplicacin esta relacionada con otras operaciones sobre matrices mas usuales, como inversin de una matriz o hallar su determinante. La existencia de un algoritmo eficiente para la multiplicacin (en realidad, para cualquier operacin de las anteriores) significara la existencia de un algoritmo similar para las dems. Podra conseguirse mas eficiencia si logrramos realizar menos multiplicaciones de matrices, aunque fuera a costa de un mayor numero de sumas de matrices, dado que la complejidad respectiva de estas operaciones es O(n3)n y o(n2). El algoritmo de Strassen calcula las cuatro submatrices Cij empleando 7 multiplicaciones y 18 sumas o restas de matrices.

Algoritmos De Vuelta Atrs


Existen un alto nmero de problemas que pueden formularse como la bsqueda de la mejor solucin o del conjunto de todas las soluciones que satisfacen ciertas condiciones. Adems, cada solucin es el resultado de una secuencia de decisiones. Por supuesto, debe existir una funcin de criterios que debe ser satisfecha por cada secuencia solucin u optimizada por dichas secuencias solucin si solo queremos la mejor. En algunos problemas de optimizacin se conoce un criterio ptimo de seleccin que puede usarse de forma voraz. Otros problemas satisfacen el principio de optimalidad, pudindose aplicar la tcnica de programacin dinmica. Sin embargo, todava hay otros problemas peores que no queda mas remedio que realizar una bsqueda de la solucin.

Esquema de Algoritmos de Vuelta Atrs


Sea (x1,...,xi) el camino desde la raz hasta un nodo de un rbol del espacio de estado. Sea G(x1...xi) el conjunto de todos los valores posibles de xi+1 tales que (x1,...,xi+1) es un camino hasta el estado del problema. Supongamos que existe algn predicado acotador A tal que A(x1,...,xi+1) es falso si el camino (xi,...,xi+1) no puede extenderse para alcanzar un nodo de respuesta. Por lo tanto, los candidatos para la posicin i+1 del vector desolucion x1..n son aquellos valores generados por G que satisfacen A. Supongamos que tambin existe algn predicado R que determina si un camino (x1,...,xi+1) termina en un nodo de respuesta. El Algoritmo de Vuelta Atrs se especifica de la forma siguiente: PROCEDURE Retroceso (IN k : INTEGER, INOUT solucin : elemento1...n) -> VAR nodo: elemento FOR noso IN G(solucion, 1, k-1) DO Solucion k := nodo; IF R(solucion, 1, k) THEN Estructura de Datos 23 UCENM

IF R(solucion, 1,k) THEN << guardar solucion >>; Retroceso (k+1, solucion) La llamada inicial del algoritmo es Retroceso(1, solucion). El procedimiento no hace ninguna llamada recursiva cuando k = N+1 o cuando ningn nodo generado por G satisface el elemento posible que satisfacen A se aade una solucin particular, se comprueba si se ha encontrado una solucion. Despus simplemente se llama recursivamente al algoritmo para generar los estados descendientes. Se sale del bucle FOR cuando no quedan mas valores para solucin terminando la llamada actual al algoritmo.

Ramificacin (Bifurcacion) Y Acotacin


Los mtodos de Ramificacin y Acotacin constituyen un a variante de las tcnicas de retroceso para problemas donde se trata de encontrar el valor mximo o mnimo de cierta funcin objeto (esto suele suceder en los problemas de programacin lineal entera). La tcnica de ramificacin y acotacotacion aplica de la siguiente manera: Supngase que al recorrer un rbol y alcanza una hoja se tiene una solucion con k colores, y que al seguir avanzando en el rbol (mediante la aplicacin de varios pasos de retrocesos) se alcanza un nodo que requiere k+1 colores. En este punto podemos retroceder (y no seguir avanzando por mas ramas), pues tenemos ya una solucion mayor. As, k sirve de cota inferior al retroceso. Este mismo proceso se repite en el resto de nodos del rbol, evitando as la exploracin de gran parte de al estructura.

Algoritmos Heuristicos
Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solucin de forma eficiente: problemas NP-completos. La solucin exacta puede requerir un orden factorial o exponencial: el problema de la explosin combinatoria. Se hace necesario utilizar algoritmos heursticos: Un algoritmo heurstico (o simplemente heurstica) puede producir una buena solucin (puede que la ptima) pero tambin puede que no produzca ninguna solucin o dar una solucin no muy buena. Normalmente, se basa en un conocimiento intuitivo del programador sobre un determinado problema. La estructura de algoritmo voraz se puede utilizar para construir procedimientos heursticos: hablamos de heursticas voraces. Objetivo: obtener buenas soluciones en un tiempo de ejecucin corto. Estructura de Datos 24 UCENM

El problema del viajante


Problema: Dado un grafo no dirigido, completo y ponderado G = (V, A), encontrar un ciclo simple de costo mnimo que pase por todos los nodos.

2 45 1 35 50 40

10 3 25 55 30 5 15 20 4

Es un problema NP, pero necesitamos una solucin eficiente. Problema de optimizacin, donde la solucin est formada por un grupo de elementos en cierto orden: podemos aplicar el esquema voraz. Posibilidades: Los nodos son los candidatos. Empezar en un nodo cualquiera. En cada paso moverse al nodo no visitado ms prximo al ltimo nodo seleccionado. Las aristas son los candidatos. Hacer igual que en el algoritmo de Kruskal, pero garantizando que se forme un ciclo.

Heurstica voraz 1 Una solucin ser un cierto orden en el conjunto de nodos (c 1, c2, ..., cn), el orden de visita de los nodos. Inicializacin: seleccionar un nodo cualquiera. Funcin de seleccin: de los nodos candidatos seleccionar el ms prximo al ltimo (o al primero) de la secuencia actual (c1, c2, ..., ca). Acabamos cuando tengamos n nodos. Ejemplo. Empezando en el nodo 1. Estructura de Datos 25 UCENM

Solucin: (1, 4, 5, 3, 2) Coste: 30+15+25+10+45=125 Empezando en el nodo 3. Solucin: (5, 4, 3, 2, 1) Coste: 15+20+10+45+50=140 Heurstica voraz 2 Una solucin ser un conjunto de aristas (a1, a2, ..., an-1) que formen un ciclo hamiltoniano, sin importar el orden. Empezar con un grafo sin aristas. Seleccin: seleccionar la arista candidata de menor coste. Factible: una arista se puede aadir a la solucin actual si no se forma un ciclo (excepto para la ltima arista aadida) y si los nodos unidos no tienen grado mayor que 2. Ejemplo. Solucin: ((2, 3), (4, 5), (3, 4), (1, 2), (1, 5)) Coste = 10+15+20+45+50 = 140 Conclusin Ninguno de los dos algoritmos garantiza una solucin ptima. Sin embargo, normalmente ambos dan soluciones buenas, prximas a la ptima. Posibles mejoras: buscar heursticas mejores; repetir la heurstica 1 con varios orgenes; bien, a partir de la solucin del algoritmo intentar hacer modificaciones locales para mejorar esa solucin.

Algoritmos De Aproximacin
Dado un problema NP completo, es probable que no sepamos resolverlo de manera precisa y completa utilizando un algoritmo polinomico en tiempo. Para este tipo de problemas, los algoritmos que no conducen a una solucin ptima se llaman algoritmos de aproximacin. Sin embargo, resulta parcialmente interesante que estos garanticen una cota en el margen de imprecisin. A continuacin se ilustra este tipo de tratamiento de problemas al problema de recubrimiento de un grafico: Dado un grafo G=(V,A), se trata de encontrar un conjunto con el menor numero de vrtices tal que toda arista sea incidente por lo menos de un vrtice de V. Este problema se puede resolver a travs de otro aproximado, como es calcular el ajuste maximizal del grafo G. Se trata de calcular un subconjunto A de aristas tal que dos aristas

Estructura de Datos

26

UCENM

cualquiera de A no tengan ningn vrtice comn y toda arista de A -A comparta algn vrtice comn con una arista de A. Este nuevo problema garantiza conseguir un recubrimiento que contiene no ms de dos vrtices del recubrimiento mnimo. El procedimiento para construir un ajuste maximizal de un grafo G consistira en ir tomando aristas de G, de una en una y en cualquier orden e ir eliminando las incidentes al conjunto que se esta construyendo hasta recubrir todo en grafo. Para poder aplicar el nuevo problema aproximado, seria necesario demostrar que el conjunto de todos los vrtices inciden a las aristas de un ajuste mximas M para un grafo G es un recubrimiento con no mas de dos veces el numero de veces el recubrimiento de tamao mnimo. Esto es evidente, ya que por la definicin de ajuste mximas, los vrtices incidentes a las aristas de M son un recubrimiento de G. tambin por la propia definicin, ningn vrtice perteneciente a M puede recubrir a mas de una arista en M. En consecuencia, por lo menos la mitad de los vrtices de M deben pertenecer a un recubrimiento.

Algoritmos de bsqueda y ordenacin


En muchas situaciones de programacin es necesario repetir ciertos procedimientos hasta alcanzar un punto en que no se puede o no se desea continuar. Esta repeticin de tareas puede llevarse a cabo bsicamente de dos maneras diferentes: la iteracin y la recursin. Como se supone que en cada repeticin se procesa un estado diferente de cosas -sin lo cual el proceso tendera al infinito-, ambos mtodos presentan tambin alguna forma de control de fin de tarea. La idea bsica en un algoritmo iterativo es que la repeticin de la tarea se controla desde afuera. Se ejecuta un conjunto de acciones en forma completa, se verifica la condicin de salida y si es necesario se vuelve a ejecutar el conjunto de acciones en forma completa. El orden en que se ejecuta y evala determina que el algoritmo sea de evaluacin previa (primero se evala la condicin de salida y luego se ejecutan las acciones) o de evaluacin posterior (primero se ejecutan las acciones y luego se evala el resultado). En ambos casos, sin embargo, el control de las repeticiones es exterior al grupo principal de acciones. En un algoritmo recursivo, en cambio, la tarea se controla desde adentro. Se comienza a ejecutar un conjunto de acciones, pero antes de finalizar se evala si se ha llegado a la condicin de salida; si no es as, se contina ordenando una nueva ejecucin del mismo conjunto de acciones. Finalmente se concluye con la tarea iniciada. Dicho en otros trminos, el procedimiento se llama repetidas veces a s mismo, y el control de esas llamadas forma parte del grupo principal de acciones. Por otra parte, si bien hay problemas que se resuelven ms directamente en forma iterativa y otros que son ms naturalmente recursivos, ambas tcnicas son compatibles e intercambiables, por lo que todo algoritmo recursivo puede transformarse en iterativo y viceversa.

Estructura de Datos

27

UCENM

Algoritmos De Bsqueda
Cuando se trata de buscar un valor en un arreglo ordenado de datos, el algoritmo de bsqueda binaria es el ms frecuentemente utilizado. La idea central de este algoritmo es comparar el elemento ubicado en el lugar central del arreglo con el valor buscado. Si el elemento central es igual al valor buscado la bsqueda finaliza con xito. Si no es as, puede ocurrir o bien que el elemento central sea mayor que el buscado en cuyo caso el elemento coincidente debe estar en la mitad inferior del arreglo- o bien que sea menor y el elemento coincidente se encuentra en la mitad superior. En ambos casos se prosigue la bsqueda en la mitad que corresponde, si es que quedan elementos en esa direccin, o bien se finaliza la bsqueda sin xito, en caso contrario. Existe naturalmente una solucin recursiva, ya que si el valor buscado no es hallado en la posicin del centro se repite el mismo procedimiento con una de las mitades del arreglo, y as hasta que se encuentre el valor o no queden ms "mitades". Comprese esto con el problema de las bolillas dentro de las cajas, en el cual la "bolilla blanca" sera el valor buscado y la "caja interior" sera la mitad que se debe seguir examinando. En ocasiones es necesario determinar no slo si el valor buscado se halla en el arreglo, sino adems saber en qu posicin est (o debera estar, si es que no existe). Por ejemplo, si se desea insertar un nuevo valor en un arreglo ordenado, una solucin eficaz es "buscar" el valor en el arreglo (aunque se sepa de antemano que no se encuentra) para determinar la posicin correcta en la que debe ser insertado. En esos casos se debe informar por algn medio (generalmente un puntero pasado como parmetro o una variable global) cul es la posicin lgica del elemento buscado dentro del arreglo. Ejemplo de un Algoritmo de Bsqueda A modo de ejemplo se presenta una versin de la funcin int busbin (int *vec, unsigned tam, int val, unsigned *ord); sta realiza una bsqueda binaria del elemento val en el vector de enteros apuntado por vec de tam elementos y deja en la memoria apuntada por ord la posicin lgica que tiene (o debera tener) el elemento buscado. Retorna 1 si el elemento es hallado o 0 en caso contrario. Para calcular el elemento mitad del vector se desplaza tam un bit a la derecha, lo que equivale a dividirlo en dos, pero resulta mucho ms rpido para el procesador que la operacin de divisin. int busbin (int *vec, unsigned tam, int val, unsigned *ord) {if (!(vec && tam && ord)) return 0; unsigned mitad = tam >> 1; // Divide tam en 2 desplazando un bit a la// derecha. Es ms rpido que tam / 2. if (vec [mitad] == valor) { *ord += mitad; return 1; } if (vec [mitad] < valor) { mitad++; *ord += mitad; vec += mitad; tam -= mitad; } else tam = mitad; Estructura de Datos 28 UCENM

return tam? busbin (vec, tam, va, ord): 0;}

Algoritmo de Quick Sort


La idea central de este algoritmo es la siguiente: si se toma un conjunto de elementos desordenados y se ubica uno cualquiera de ellos -llamado pivote- en una posicin tal que todos los que estn antes sean menores o iguales y todos los que estn despus sean mayores, entonces esa posicin particular sera la correcta para ese elemento si el conjunto estuviera ordenado. Asimismo se verifica que el conjunto ha quedado dividido en dos partes: en la primera estn todos los elementos menores o iguales al pivote y en la segunda todos los mayores. Esto permite aplicar recursivamente el mismo procedimiento en ambas partes del conjunto hasta que ste quede completamente ordenado. La tarea de dividir el conjunto de datos en dos grupos en torno al pivote es accesoria y puede ser realizada por una funcin auxiliar. Esta funcin auxiliar se puede implementar de varias maneras, pero todas ellas deben informar de algn modo en qu posicin ha quedado ubicado el pivote. Al igual que busbin (), la funcin qsort () es recursiva, y cada llamada provocar que la funcin se llame "internamente" a s misma varias veces. Los valores de los parmetros vec y tam seguramente variarn entre una llamada y otra, ya que son los que definen la parte del arreglo que se ordenar cada vez. Sin embargo, tanto los controles de que los parmetros sean legales como el retorno de la funcin con la direccin original del vector deben hacerse slo una vez. Para evitar tener que hacer estos controles redundantes en cada llamada recursiva, la tarea se divide entre dos funciones.

La primera est declarada pblicamente como int *qsort (int *vec, unsigned tam); No es recursiva y slo realiza las tareas que deben ser ejecutadas una sola vez: verifica que vec y tam sean legales y llama a la segunda funcin, que es la que completa la tarea. Si vec o tam son ilegales la funcin retorna vec sin hacer nada ms.

La segunda funcin, definida como void _qsort (int *vec, unsigned tam);

Es esttica (por lo tanto inaccesible desde fuera del mdulo), y es la que realmente lleva a cabo la tarea recursiva de ordenamiento. Recibe los parmetros vec y tam, que varan entre una llamada y otra, pero que tienen siempre valores legales.

Estructura de Datos

29

UCENM

A continuacin se presentan dos pequeos mdulos de librera con una versin optimizada de la funcin: El mdulo qsort.h contiene simplemente la declaracin, El mdulo qsort.cpp incluye la implementacin de la funcin principal int *qsort (int *vec, unsigned tam); y una implementacin de las dos funciones auxiliares int dividir (int *vec, unsigned tam); void _qsort (int *vec, unsigned tam); La funcin qsort () verifica la validez de los parmetros vec y tam y llama a _qsort () antes de retornar vec. La funcin _qsort () ordena por el algoritmo de quick sort el vector de enteros apuntado por vec de tamao tam, llamando a su vez a la funcin dividir (). sta divide los tam elementos del vector apuntado por vec en dos grupos alrededor de un pivote y retorna la cantidad de elementos del primer grupo -que incluye al pivote. Ambas funciones auxiliares son estticas -esto es, de uso "privado" dentro del mdulo donde estn insertas- ya que la tarea que realizan es subsidiaria y dependiente de la funcin qsort ().

Verificacin y derivacin de programas


Conceptos Bsicos La definicin del significado de un elemento del lenguaje se puede realizar de distintas formas, cada una de las cuales define una semntica diferente del lenguaje. En esta leccin se van a introducir los conceptos ms importantes de algunas de estas formas semnticas, y se van a tratar ms extensamente los conceptos de correccin, verificacin y prueba, ya mencionados en la leccin.

Semntica
Dependiendo del objetivo prioritario que se presenta cubrir al dar el significado de un lenguaje podemos encontrar diversas aproximaciones. Entre todas ellas, las ms frecuentemente utilizadas son la semantica operacional, la semantica declarativa y la semtica axiomtica. Veamos a continuacin una peque son la semntica operacional, la

Estructura de Datos

30

UCENM

semtica declarativa y la semtica axiomtica. Veamos a continuacin una pequea introduccin a cada una de estas aproximaciones.

Semntica operacional
La semntica operacional define el significado de un lenguaje de programacin en trminos de los cambios de estado que producen las instrucciones primitivas del lenguaje. Estos cambios no se reflejan directamente en la maquina real, sino en una maquina (virtual) abstracta asociada que sirve como instrumento de conexin con aquella. Expresado de otra forma, podemos decir que la semntica operacional define el significado de un programa en trminos del efecto producido por la ejecucin paso a paso del mismo, de tal modo que la especificacin de las instrucciones del lenguaje mediante instrucciones primitivas de la maquina abstracta es, precisamente, la definicin semntica del mismo. A pesar de la aparente simplicidad de este formalismo, este tipo de semntica no describe con igual claridad todo tipo de lenguaje de programacin. El motivo es que el mecanismo que emplean los distintos lenguajes de programacin para realizar un cmputo no siempre puede expresarse de una manera clara, comprensible y concisa.

Semntica denotacional
La semntica denotacional define unas aplicaciones (funciones) de valoracin semntica que asignan a cada construccin denotada tal objeto matemtico que modela su significado. Se dice que la construccin denota tal objeto o que este objeto es la denotacin de dicha construccin. En otras palabras, la semntica denotacional indica que funcin matemtica se obtiene a la salida ante unas entradas del programa, sin preocuparse de la ejecucin paso a paso del programa. Existe una variante de esta semntica que es la semntica algebraica, en la que se utiliza conceptos algebraicos a la hora de modelar el significado de las construcciones. El primer paso a realizar en la definicin de la semntica denotacional de un determinado lenguaje es el establecimiento de un dominio semantico al que pertenecern los resultados obtenidos de la evaluacin de las construcciones del lenguaje. Esta evaluacin es proporcionada por un conjunto de funciones de significado cuyo dominio esta constituido por el conjunto de construcciones del lenguaje y cuyo rango (o imagen) viene dado por el dominio semantico. Este tipo de semntica dotan de significado a los elementos del lenguaje de una manera mas formal y abstracta, pero sin embargo tambin necesitan un mayor conocimiento de conceptos matemticos, que no tienen por que ser bsicos ni elementales.

Estructura de Datos

31

UCENM

Recursividad
Una funcin recursiva es una funcin que se define en trminos de si misma., es decir, en su cuerpo aparece alguna aplicacin suya. La recursividad es un mecanismo que se usa cuando hay que repetir cierto tratamiento o clculo pero el nmero de repeticiones es variable. De hecho ya se han visto definiciones recursivas, el tipo suma permite definir tipos de datos recursivos, como el tipo de lista. La definicin del tipo lista permite repetir la adicin de elementos a una lista. el nmero de adicciones es variable y determina el nmero final de elementos de lista.

Semntica axiomtica
La semntica axiomtica asociada a cada construccin del lenguaje un axioma lgico que relaciona el estado del computo (valores que tienen las variables utilizadas) antes y despus de ejecutar esta construccin. Existen distintas semnticas, axiomtica, de la que la mas conocida es la introducida por el sistema formal de hoare y que es utilizada para definir el significado de lenguaje imperativos (por ejemplo, pascal). El mtodo axiomtico expresa la semntica de un lenguaje de programacin asociado al lenguaje una teora matemtica o sistema formal que permita demostrar propiedades de los programas escritos en ese lenguaje. Esta aproximacin formal contrasta con el mtodo denotacional mostrando anteriormente, que asocia a cada construccin del lenguaje una denotacin (significado) en un intento de encontrar un modelo matemtico (coleccin abstracta de objetos matemticos) del lenguaje. Un sistema formal puede entenderse como un metalenguaje que pose su propia sintaxis y semntica. Desde el punto de vista sintctico, es necesario definir una gramtica en la que se reflejen las construcciones validas del sistema formal, normalmente se suele emplear la sintaxis sde la lgica de predicado de primer orden ampliada com. expresiones aritmticas y de teora de conjuntos. Una vez fijada la sintaxis a emplear, un sistema formal se define mediante un conjunto de axiomas (propiedades ciertas escritas en forma de sentencias lgicas) que expresen las propiedades de las construcciones bsicas y un conjuntos de reglas de inferencias (forma de deducir una propiedades de otras) que permitan deducir las propiedades de construcciones mas complejas. Las definiciones de sistemas formales para lenguajes funcionales suele hacerse fundamentalmente para demostrar propiedades que tiene que ver con el tipo de una expresin y de las subexpresiones que la componen.

Estructura de Datos

32

UCENM

Diseo De Algoritmos Recursivos


Las definiciones recursivas pueden resultar sorprendentes a primera vista.Incluso puede dar lugar a funciones que nunca terminen (intiles como algoritmos), Sin embargo, usadas juiciosamente son un instrumento potentsimo de diseo de algoritmos. En primer lugar, hay que identificar el proceso repetitivo por realizar. En segundo lugar, hay que considerar que una funcin recursiva solo es til si su evaluacin termina.

Clasificacin
Segn el nmero de llamadas recursivas realizadas, se distinguen tres clases: Recursividad lineal: El cuerpo de la funcin contiene una llamada recursiva. Son las funciones recursivas. Son las funciones recursivas ms sencillas. Todas las funciones especificadas en este capitulo son recursivas lineales. Un caso importante de recursividad lineal aparece cuando la expresin ms externa del caso recursivo de la funcin es la misma llamada recursiva. Esta clase de recursividad se llama recursividad de cola.

Recursividad no lineal
El cuerpo de la funcin contiene varias llamadas recursivas. Lo mas frecuente que contenga dos llamadas recursivas, en cuyo caso se habla de recursividad binaria.

Recursividad mutua
Es un caso curioso de recurcion, una funcin no contiene ninguna llamada recursiva, pero durante la evaluacin de su aplicacin surgen llamadas recursivas. Auque a primera vista parezca imposible obtenrsete comportamiento, la recursividad puede conseguirse indirectamente si hay dos funciones que se llaman entre si. Otra clasificacin basada en el formato de los parmetros de las llamadas recursivas.

Recursividad estructural
Las sucesivas llamadas recursivas sobre un dato se hacen siguiendo la estructura recursiva del mismo. En el caso de los elementos enteros, una recurcion estructurar significa que el valor se vaya decrementando en uno.

Estructura de Datos

33

UCENM

Recursin bien fundada


Aunque hablando con propiedad, cualquier recursividad esta bien fundada, suele utilizarse este trmino para aquellas recursividades que no son estructurales. Un ejemplo de funcin recursiva bien es invertir Entero, donde el parmetro entero se divide entre diez. La primera clasificacin dada es til para decidir si es conveniente usar una definicin recursiva o iterativa en los algoritmos imperactivo. La segunda clasificacin es til para decidir el principio de induccin necesaria para necesaria para verificar el algoritmo.

Diseo De Algoritmos Iterativos


Cada clase de bucle resulta til en situaciones diferentes. El bucle FOR se utiliza cuando se conoce el nmero de iteraciones que se quiere realizar. El bucle WHILE es usado en las otras situaciones en que no se conoce el nmero de iteraciones. El bucle LOOP es til cuando puede haber varias condiciones de salida del bucle, situadas en diferentes partes del cuerpo, o cuando la condicin de salida no esta al comienzo del bucle. Sin embargo, conocer la instruccin iterativa que mas conviene para un algoritmo es solo el comienzo de la construccin de la instruccin. Es conveniente tener algunas guas para el diseo de algoritmos iterativos. El diseo de un algoritmo iterativo se hace sobre una base distinta de la de uno recursivo. En los algoritmos imperativos se tiene disponible toda la informacin del problema en las variables. Por esta razn, es til partir los datos del problema en dos: La parte que representa el problema aun no resuelto. La parte que representa el problema ya resuelto; es decir, el resultado ya calculado. Una vez que se han distinguido estas dos partes, el bucle se construye a partir de tres decisiones hechas sobre dicha particin: Fijar la situacin inicial. El problema a resolver se encuentra en los parmetros de entrada o de entrada/salida; si estos datos quieren modificarse durante el algoritmo, deben copiarse en variables auxiliares. tambin hay que dar un valor inicial a las variables que representan la solucin vaca. Formar el cuerpo del bucle. Para ello puede usarse un razonamiento parecido al recursivo. Se supone, por generalidad, que la iteracin se encuentra en un estado intermedio. Debe entonces determinarse que hacer en una iteracin para avanzar en la resolucin del problema. Determinar la condicin de terminacin. Corresponde a la situacin en que se ha hallado la solucin completa. Esta parte esta totalmente relacionada con la eleccin de la instruccin iterativa. Segn la forma de la iteracin, se elige un bucle FOR, WHILE o LOOP, como se describi antes.

Estructura de Datos

34

UCENM

Normalmente, la terminacin del bucle puede especificarse de forma sencilla, incluso en casos relativamente complicados. Por ejemplo, cuando se tiene un bucle WHILE con una condicin compuesta es posible que pueda usarse la tcnica del centinela para obtener una especificacin ms sencilla. Algo con lo que hay que tener especial cuidado es la terminacin de los bucles. Esta es fcil de determinar en un algoritmo recursivo porque basta con tomar una medida de los parmetros y comprobar que disminuye en cada llamada recursiva, de forma que se acerca al tamao de los casos bsicos. En una solucin iterativa se razona igual, pero la tarea es algo mas complicada porque el control del proceso repetitivo no tiene parmetros, sino que se hace a partir de la informacin contenida en las variables.

Estructura de Datos

35

UCENM

Programacin Dinmica
Principios de programacin dinmica
Se ha visto que la tcnica voraz se aplica a problemas cuya solucin puede formularse como el resultado de una secuencia de decisiones. El mtodo es eficiente porque una vez que se toma una decisin en un paso, no se reconsidera en el futuro, conduciendo de forma directa a la solucin. Sin embargo, no todos los problemas pueden resolverse de esta manera, asegurando que la secuencia de decisiones es la mejor de las posibles. La programacin dinmica (tambin llamada planificacin dinmica) es una tcnica de programacin que tambin permite resolver problemas mediante una secuencia de decisiones, pero de una manera menos directa que en el caso voraz. Esta vez se necesita producir varias secuencias de decisiones. Solamente al final se sabe cul es la mejor de todas. No es fcil establecer una definicin de la programacin dinmica; una caracterstica es que el programa aprende dinmicamente de las decisiones que toma. Adems, todo problema resoluble con esta tcnica debe de satisfacer el principio de optimalidad. Este principio establece que una secuencia ptima de decisiones que resuelve un problema debe cumplir la propiedad de que cualquier subsecuencia de decisiones tambin debe ser ptima respecto al subproblema que resuelva . Usando una tcnica de fuerza bruta, el nmero de secuencias de decisin es exponencial sobre el nmero de decisiones, porque si hay d opciones para cada una de las n decisiones, resultar un total de d secuencias posibles de decisin. En la programacin dinmica todos los subproblemas se resuelven de acuerdo con criterio de tamao creciente y los resultados de subproblemas ms pequeos se almacenan en algn tipo de estructura de datos (normalmente tablas) para facilitar la solucin de los problemas ms grandes. De esta forma se reduce al nmero total de subsecuencias generadas, evitndose una explosin combinatoria en la produccin de las secuencias y consiguindose soluciones ms eficientes en cuanto a tiempo de ejecucin. Podemos formalizar algo ms la idea bsica. Supongamos que tenemos un problema que satisface el principio de optimalidad, tal que Eo es el estado inicial del problema y deben tomarse n decisiones d, 1<i<n. sea D = { v1..vn} el conjunto de valores de decisin posibles para la decisin d1. sea, asimismo, Eli el estado del problema tras la eleccin del valor vli 1<i<n1 y Sli una secuencia ptima de decisiones respecto al estao Eli. Entonces, una secuencia ptima de decisiones respecto a E0 es la mejor secuencias de decisin { Vli Sli }, 1<i<N1. El razonamiento anterior se refiere a la primera decisin d1 tomada desde el estado inicial E0 sin embargo, puede generalizarse la formulacin del problema a cualquier subsecuencia de decisiones dk..,dl, 1<k<n, partiendo como estado inicial de Ek -1. si este subproblema de simboliza como problema (k,l), entonces el problema completo es problema ( l,n ). Tiene sentido centrarse en un subproblema del problema inicial porque ste satisface el principio

Estructura de Datos

36

UCENM

de optimalidad pero, adems, tiene la ventaja ( quizs paradjica al tratar de un problema ms pequeo ) de que proporciona una visin ms general del problema en cuestin. ( Obsrvese que vamos a usar la tcnica de resolucin de problemas por generalizacin para despus poder realizar una particularizacin de la solucin obtenida.) Una solucin dinmica para problema ( k,1 ) debe expresarse en trminos de los valores decisin existente para decisiones d1 y el subproblema problema ( k+1,1 ) resultante aplicar cada valor de decisin. La expresin inicial de la ecuacin de recurrencia, hay caso en que la decisin d1 no va seguida por ninguna secuencia de decisiones, que problema ( n,n ). de de un es

En resumen, la aplicacin de la tcnica de programacin dinmica a un problema significa comprobar primero el principio de optimalidad y desarrollar despus unas ecuaciones recurrentes del estilo de (1) y (2). La ecuacin general relaciona la secuencia ptima en una etapa i con la decisin tomada en la etapa i y la subsecuencia ptima en la etapa posterior i+1. la ecuacin de base establece el valor para la etapa n+1 en que no queda ninguna decisin Xi, 1<i<n, a tomar. La ecuacin de recurrencia puede formularse de dos formas: delantera o trasera. Sea X1..Xn la secuencia de decisiones necesaria para resolver el problema. La formulacin delantera expresa la decisin de Xl , 1<i<n, a partir de la secuencia de decisiones Xi+1Xn ( es la clase de formulacin adoptada hasta ahora ). La formulacin trasera expresa la decisin de Xi, 1<i<n , a partir de la recurrentes con formulacin trasera es igual que e la formulacin delantera, slo que en orden contrario. La eleccin de una formulacin delantera o trasera depende del problema considerado o, sencillamente, del gusto del programador.

Estructura de Datos

37

UCENM

Capitulo II Tipos de Datos Abstractos


En el mundo de la programacin existen diversos lenguajes que se han ido creando con el paso del tiempo y que se han perfeccionado debido a las necesidades de los programadores de la poca a la que pertenecen. Los primeros lenguajes de programacin eran de tipo lineales, ya que un programa se recorra desde un punto marcado como Inicio hasta llegar a un punto Fin. Con el tiempo se fueron creando nuevos lenguajes y en nuestros das los ms utilizados son los llamados Orientados a Objetos. Los Lenguajes Orientados a Objetos (LOO) tienen la caracterstica de que no son lenguajes lineales, sino que se forman de diversas funciones, las cuales son llamadas en el orden en que el programa mismo las pide o el usuario determina. Para entender mejor cmo funcionan los Lenguajes Orientados a Objetos, vamos a introducir un concepto fundamental en las Estructuras de Datos denominado Abstraccin de Datos y que es parte importante de estos Lenguajes y de la manera en que funciona la mayora del software comercial de nuestros das.

Historia
El concepto de tipo de dato abstracto (TDA, Abstract Data Types ), fue propuesto por primera vez hacia 1974 por John Guttag y otros, pero no fue hasta 1975 que por primera vez Liskov lo propuso para el lenguaje CLU. El lenguaje Turbo Pascal fue determinante para la comn aceptacin de los TDAs con la introduccin de las Units. Si bien estas no cumplen con las caractersticas bsicas de un Tipo de dato Abstracto, como por ejemplo: la encapsulacin de los datos. El lenguaje ADA pudo implementar exitosamente los TDAs con sus Packages. Vale recordar que estos dos ltimos lenguajes soportan formalmente la Programacin modular.

Abstraccin de datos
Un sistema de gestin de bases de datos es una coleccin de archivos interrelacionados y un conjunto de programas que permiten a los usuarios acceder y modificar esos archivos. Un objetivo importante de un SDBDD es proporcionar a los usuarios una visin abstracta de los datos. Es decir, el sistema esconde ciertos detalles de cmo se almacenan y mantienen los datos.

Estructura de Datos

38

UCENM

Existen tres niveles de abstraccin: Nivel fsico. El nivel ms bajo de abstraccin describe cmo se almacena realmente los datos. En el nivel fsico, se describen en detalle las estructuras de datos complejas del nivel bajo. Nivel conceptual. El siguiente nivel ms alto de abstraccin describe qu datos son realmente almacenados en la base de datos y las relaciones que existen entre los datos. Aqu se describen la base de datos completa en trminos de un nmero pequeo de estructuras relativamente. Aunque la implementacin de las estructuras sencillas del nivel conceptual puede implicar estructuras complejas del nivel fsico, el usuario no necesita darse cuenta de esto. Este nivel es usado por los administradores de bases de datos, quienes deben decidir qu informacin se va a guardar en la base de datos. Nivel de visin. El nivel ms alto de abstraccin describe slo parte de la base de datos completa. A pesar del uso de estructuras ms sencillas en el nivel conceptual, permanece algo de complejidad debido al gran tamao de la base de datos. Muchos usuarios del sistema de bases de datos no se interesarn por toda la informacin. En cambio, dichos usuarios slo necesitan una parte de la base de datos. Para simplificar su interaccin con el sistema, se define el nivel de abstraccin de visin. El sistema puede proporcionar muchas visiones de la misma base de datos.

Qu implica el concepto abstraccin?


El concepto abstraccin implica concentrarse en las cualidades esenciales de un objeto. En la abstraccin se suprimen los detalles irrelevantes y se asla la esencia del objeto que se maneja. En la vida diaria, a menudo usamos este concepto aunque no nos demos cuenta de ello. Cada vez que usamos un automvil, lo hacemos sin preocuparnos de la organizacin interna del vehculo ni de cmo trabajan los controles del mismo (gua, pedales, etc.). Sabemos lo que hacen y cmo utilizarlos pero probablemente desconocemos cmo estos controles realizan su tarea asignada. Otro ejemplo: an cuando la mayora de nosotros no sabemos de que est hecho un televisor ni sabemos al detalle como se genera la imagen en la pantalla, esto no evita que lo utilicemos todos los das confiados de que trabajar como es debido. Este concepto es fundamental en el estudio de las Ciencias de Computadoras ya que es la base para entender el diseo contemporneo del software, en especial el diseo orientado a objetos (object-oriented design).

Como ya se mencion, los Lenguajes de Programacin Orientados a Objetos son lenguajes formados por diferentes mtodos o funciones y que son llamados en el orden en que el programa lo requiere, o el usuario lo desea. La abstraccin de datos consiste en ocultar las caractersticas de un objeto y obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro programa. Esto es similar a una situacin de la vida cotidiana.otro ejemplo es cuando se dice la palabra perro, usted no necesita que se le diga lo que hace el perro. Estructura de Datos 39 UCENM

Usted ya sabe la forma que tiene un perro y tambin sabe que los perros ladran. De manera que se abstraen todas las caractersticas de todos los perros en un solo trmino, al cual llamo perro. A esto se le llama Abstraccin y es un concepto muy til en la programacin, ya que un usuario no necesita mencionar todas las caractersticas y funciones de un objeto cada vez que ste se utiliza, sino que son declaradas por separado en el programa y simplemente se utiliza el trmino abstracto (perro) para mencionarlo. En el ejemplo anterior, perro es un Tipo de Dato Abstra cto y todo el proceso de definirlo, implementarlo y mencionarlo es a lo que llamamos Abstraccin de Datos. Vamos a poner un ejemplo real de la programacin. Supongamos que en algn Lenguaje de Programacin Orientado a Objetos un pequeo programa saca el rea de un rectngulo de las dimensiones que un usuario decida. Pensemos tambin que el usuario probablemente quiera saber el rea de varios rectngulos. Sera muy tedioso para el programador definir la multiplicacin de base por altura varias veces en e l programa, adems que limitara al usuario a sacar un nmero determinado de reas. Por ello, el programador puede crear una funcin denominada rea, la cual va a ser llamada el nmero de veces que sean necesitadas por el usuario y as el programador se evita mucho trabajo, el programa resulta ms rpido, ms eficiente y de menor longitud. Para lograr esto, se crea el mtodo rea de una manera separada de la interfaz grfica presentada al usuario y se estipula ah la operacin a realizar, devolviendo el valor de la multiplicacin. En el mtodo principal solamente se llama a la funcin rea y el programa hace el resto. Al hecho de guardar todas las caractersticas y habilidades de un objeto por separado se le llama Encapsulamiento y es tambin un concepto importante para entender la estructuracin de datos. Es frecuente que el Encapsulamiento sea usado como un sinnimo del Ocultamiento de Informacin, aunque algunos creen que no es as

Separacin de la interfaz e implementacin


Cuando se usa en un programa de computacin, un TDA es representado por su interfaz, la cual sirve como cubierta a la correspondiente implementacin. Los usuarios de un TDA tienen que preocuparse por la interfaz, pero no con la implementacin, ya que esta puede cambiar en el tiempo y afectar a los programas que usan el TDA. Esto se basa en el concepto de Ocultamiento de Informacin, una proteccin para el programa de decisiones de diseo que son objeto de cambio. La solidez de un TDA reposa en la idea de que la implementacin est escondida al usuario. Solo la interfaz es pblica. Esto significa que el TDA puede ser implementado de diferentes formas, pero mientras se mantenga consistente con la interfaz, los programas que lo usan no se ven afectados. Hay una diferencia, aunque a veces sutil, entre el Tipo de Dato Abstracto y la [[Estructura de Dato] usada en su implementacin. Por ejemplo, un TDA de una lista puede ser

Estructura de Datos

40

UCENM

implementado mediante un Arreglo o una Lista Enlazada o hasta un rbol binario de bsqueda. Una lista es un Tipo de Dato Abstracto con operaciones bien definidas (agregar elemento, agregar al final, agregar al principio, recuperar, eliminar, etc) mientras una Lista Enlazada es una estructura de datos basada en punteros o referencias (dependiendo del lenguaje) que puede ser usada para crear una representacin de una Lista. La Lista Enlazada es comnmente usada para representar una TDA Lista, y a veces, hasta confundida. Un ejemplo es la clase Linked List de Java, la cual ofrece una gran cantidad de mtodos que no corresponden a una Lista Enlazada "pura", sino a un fuerte TDA. De forma similar, un TDA rbol binario de bsqueda puede ser representado de muchas maneras: rbol binario, rbol AVL, rbol rojo-negro, Arreglo, etc. A pesar de la implementacin un rbol binario siempre tiene las mismas operaciones (insertar, eliminar, encontrar, etc.) Separar la interfaz de la implementacin no siempre significa que el usuario ignora totalmente la implementacin de la rutina, pero lo suficiente para no depender de ningn aspecto de la implementacin. Por ejemplo, un TDA puede ser creado usando un Lenguaje Script o cualquiera que pueda ser descompilado (como C). En la terminologa de Lenguaje Orientado a Objeto, un TDA es una clase; un instancia de un TDA o clase, es un objeto.

Caracterizacin
Un TDA est caracterizado por un conjunto de operaciones (funciones) al cual le denominaron usualmente como su interfaz pblica y representan el comportamiento del TDA; mientras que la implementacin como la parte privada del TDA est oculta al programa cliente que lo usa. Todos los lenguajes de alto nivel tienen predefinidos TDA; que son los tipos denominados simples y las estructuras predefinidas, y estos tienen sus interfaces pblicas que incluyen las operaciones como la +, -, *, etc. En un TDA no se necesita conocer como actan tales operadores sobre la representacin interna de los tipos definidos, que adems, suele ser una implementacin bastante dependiente de la mquina sobre la que trabaje el compilador. Lo interesante es que los lenguajes actuales nos van a permitir ampliar los TDA predefinidos con otros que sern definidos por el propio programador para adecuar as los tipos de datos a las necesidades de los programas. Los TDA que nos van a interesar de ahora en adelante son aquellos que reflejen cierto comportamiento organizando cierta variedad de datos estructuradamente. A esta forma estructurada de almacenar los datos ser a la que nos refiramos para caracterizar cada TDA. Los TDA que tienen informaciones simples pero dependientes de un comportamiento estructural sern llamados polilticos y aquellos TDA simples, como son los tipos predefinidos

Estructura de Datos

41

UCENM

donde la informacin no es relacionada mediante ninguna estructura y no admiten ms que un valor en cada momento sern denominados TDA monolticos. Ntese que cuando hablemos de un TDA no haremos ninguna alusin al tipo de los elementos sino tan slo a la forma en que estn dispuestos estos elementos. Slo nos interesa la estructura que soporta la informacin y sus operaciones. Para determinar el comportamiento estructural basta con observar la conducta que seguirn los datos. Caractericemos entonces los TDA. Un TDA tendr una parte que ser invisible al usuario la cual hay que proteger y que se puede decir que es irrelevante para el uso del usuario y est constituida tanto por la maquinaria algortmica que implemente la semntica de las operaciones como por los datos que sirvan de enlace entre los elementos del TDA, es decir, informacin interna necesaria para la implementacin que se est haciendo para ese comportamiento del TDA. Resumiendo podemos decir, que tanto la implementacin de las operaciones como los elementos internos del TDA sern privados al acceso externo y ocultos a cualquier otro nivel.

Un TDA representa una abstraccin: Se destacan los detalles (normalmente pocos) de la especificacin (el qu). Se ocultan los detalles (casi siempre numerosos) de la implementacin (el cmo). Entonces la abstraccin, es una de las herramientas que ms nos ayuda a la hora de solucionar un problema, es un mecanismo fundamental para la comprensin de problemas y fenmenos que poseen una gran cantidad de detalles, su idea principal consiste en manejar un problema, fenmeno, objeto, tema o idea como un concepto general, sin considerar la gran cantidad de detalles que estos puedan tener. El proceso de abstraccin presenta dos aspectos complementarios. 1. Destacar los aspectos relevantes del objeto. 2. Ignorar los aspectos irrelevantes del mismo (la irrelevancia depende del nivel de abstraccin, ya que si se pasa a niveles ms concretos, es posible que ciertos aspectos pasen a ser relevantes). De modo general podemos decir que la abstraccin permite establecer un nivel jerrquico en el estudio de los fenmenos, el cual se establece por niveles sucesivos de detalles. Generalmente, se sigue un sentido descendente de detalles, desde los niveles ms generales a los niveles ms concretos. Por ejemplo: los lenguajes de programacin de alto nivel permiten al programador abstraerse del sin fin de detalles de los lenguajes ensambladores. Otro ejemplo, la memoria de la computadora es una estructura unidimensional formada por celdas y sin embargo trabajamos como si fuera nica. La abstraccin nos brinda la posibilidad de ir definiendo una serie de refinamientos sucesivos a nuestro TDA y entindase bien que cuando decimos refinamientos sucesivos nos estamos refiriendo a la estrategia que se utiliza para descomponer un Estructura de Datos 42 UCENM

problema en subproblemas. Conforme evoluciona el diseo de software a cada nivel de mdulos se representa un refinamiento en el nivel de abstraccin. Esto es, incluir detalles que fueron obviados en un nivel superior, en un nivel ms bajo de la jerarqua.

Tipos de Abstraccin que Podemos Encontrar en un Programa


Abstraccin funcional:
Crear procedimientos y funciones e invocarlos mediante un nombre donde se destaca qu hace la funcin y se ignora cmo lo hace. El usuario slo necesita conocer la especificacin de la abstraccin (el qu) y puede ignorar el resto de los detalles (el cmo).

Abstraccin de datos:
Tipo de datos: proporcionado por los leguajes de alto nivel. La representacin usada es invisible al programador, al cual solo se le permite ver las operaciones predefinidas para cada tipo. Tipos definidos: por el programador que posibilitan la definicin de valores de datos ms cercanos al problema que se pretende resolver. TDA: para la definicin y representacin de tipos de datos (valores + operaciones), junto con sus propiedades. Objetos: Son TDA a los que se aade propiedades de reutilizacin y de comparticin de cdigo. Si profundizamos ms al mundo de la programacin y sus conceptos, existen dos de estos conceptos que no se deben confundir, ellos son: tipo de datos y estructura de datos. Un tipo de dato, en un lenguaje de programacin, define un conjunto de valores que una determinada variable puede tomar, as como las operaciones bsicas sobre dicho conjunto. Ahora veamos como se van relacionando estos conceptos. Los tipos de datos constituyen un primer nivel de abstraccin, ya que no se tiene en cuenta cmo se implementan o se representan realmente la informacin sobre la memoria de la mquina. Para el usuario, el proceso de implementacin o representacin es invisible. Veamos entonces que son las estructuras de datos. Las estructuras de datos son colecciones de variables, no necesariamente del mismo tipo, relacionadas entre s de alguna forma. Las estructuras de datos estn caracterizadas por el tipo de dato de los elementos guardados en la estructura y por la relacin definida sobre estos elementos.

Estructura de Datos

43

UCENM

Al nivel de las estructuras de datos son totalmente irrelevantes las operaciones sobre un elemento en particular, solamente tienen carcter relevante las operaciones que envuelvan la estructura de forma global. Cuando un sistema se disea modularmente, ste es dividido en subsistemas llamados mdulos. Cada uno de esos mdulos comienza como una "caja negra". A medida que se progresa en el diseo, cada una de esas "cajas negras" se refina hasta que se puede codificar usando un lenguaje de programacin. El propsito de una "caja negra" es especificar qu hace el mdulo pero no cmo lo hace. El propsito del mdulo se mantiene separado del algoritmo que lo realiza. A este concepto se le conoce como abstraccin de procesos. Esto permite que un programador pueda usar una rutina creada por otro programador conociendo solamente la tarea que realiza el mdulo y la descripcin de sus insumos y productos (sus parmetros), an cuando desconozca los detalles del algoritmo implementado en el mdulo. Un ejemplo de este concepto lo vemos en los algoritmos de ordenamiento (sorting) y en los de bsqueda (searching). En un algoritmo de ordenamiento, los datos de una lista de artculos son ordenados ascendente o descendentemente de acuerdo a algn atributo. La lista original es recibida por el mdulo, ste la ordena y la devuelve ordenada. Existen muchos tipos de algoritmos de ordenamiento pero todos realizan la misma funcin. Es posible sustituir en un programa una rutina que implemente un algoritmo particular, digamos el de la burbuja (bubble sort), por un algoritmo ms eficiente (por ejemplo, el quick sort). An cuando el programador no entienda el algoritmo especfico de ordenamiento, esto no evita que pueda invocar la rutina ya que sabe que sta trabajar como es debido. En un algoritmo de bsqueda, un objeto es buscado en una lista de acuerdo a algn atributo. En caso de encontrar el objeto, el algoritmo devuelve un indicador de la posicin en la que lo encontr. Aqu ocurre una situacin semejante a la de los algoritmos de ordenamiento. Es posible sustituir en un programa una rutina que implemente el algoritmo de bsqueda secuencial (linear o sequential search) por el algoritmo de bsqueda binaria (binary search) con un mnimo de esfuerzo ya que ambos realizan la misma funcin y tienen los mismos parmetros. Otro concepto importante es la abstraccin de datos. Esto significa que la representacin interna de un artculo es secundaria al concepto que representa. El programador debe poder usar estos artculos an cuando no conozca su organizacin interna. Por ejemplo, un programador de C++ puede utilizar nmeros enteros en su programa an cuando desconozca cul es la representacin interna de ese entero (ya sea signo/magnitud, complemento a uno, complemento a dos, etc.). Lo importante es que reconozca qu artculo representa un nmero entero (en este caso, el artculo sera un nmero en base diez que no contenga punto decimal) y qu operaciones puede hacer con artculos de tipo entero (en este caso, las operaciones definidas para artculos de tipo entero son las operaciones aritmticas (+, -, *, /, %) y las operaciones de comparacin o relacionales (<, >, <=, >=, = =, !=).

Los conceptos de abstraccin de datos y abstraccin de procesos son necesarios para entender lo que es un tipo de datos abstracto. Un tipo de datos abstracto (abstract data type Estructura de Datos 44 UCENM

o ADT, por sus siglas en ingls) se define como una coleccin de artculos que estn definidos a base de sus atributos y aquellas operaciones que trabajan con esos atributos. Los atributos slo deben ser accesibles mediante las operaciones definidas para ese tipo de datos abstracto. Los atributos en un ADT se implementan utilizando una estructura de datos. Las operaciones definidas para manipular los atributos se implementan utilizando rutinas de programacin. El programador debe poder utilizar artculos que pertenezcan al ADT, pero slo deber poder manipular estos artculos utilizando las operaciones definidas para ese ADT. Un ejemplo de este concepto es el tipo de datos abstracto que describe una lista. El ADT Lista reconoce las siguientes operaciones: crear la lista, revisar si la lista est vaca o no, revisar si la lista est llena o no, aadir un elemento, eliminar un elemento, buscar un elemento y recorrer la lista. El programador que desee utilizar una lista debe ser capaz de poder declarar variables del tipo Lista y poder manipular los elementos de la lista mediante las operaciones definidas para el ADT Lista. Es ms: este programador no debera preocuparse de saber cmo es la estructura interna de la lista, ni cmo estn implementadas las operaciones. En otras palabras, la estructura de datos que representa la lista y los algoritmos que implementan las operaciones no son imprescindibles para poder utilizar la lista. Solamente el programador que desee implementar una lista es el que debe preocuparse de la representacin interna de la lista (la estructura de datos) y de los algoritmos especficos para manejar esa lista.

Cuando se describe un tipo de datos abstracto es necesario especificar tanto la estructura interna del ADT como sus operaciones asociadas. Es muy comn que las operaciones en un ADT sean descritas utilizando precondiciones y postcondiciones. Una precondicin es un enunciado que debe ser cierto para que la operacin se pueda llevar a cabo. Una postcondicin es un enunciado que debe ser cierto despus de que la operacin se lleve a cabo. Por ejemplo, la operacin para revisar si la lista est vaca o no tiene como precondicin que la lista exista. La postcondicin de esta operacin es que se devolvi el valor cierto si la lista est vaca o se devolvi el valor falso si la lista no est vaca (tiene por lo menos un elemento).

Cmo se implementa un ADT en un lenguaje de programacin real? Existen dos enfoques principales: 1. El programador no se preocupa del concepto del ADT y simplemente hace su programa asumiendo que la estructura de datos seleccionada y los algoritmos correspondientes no cambiarn. Por ejemplo, el programador puede asumir que la lista est implementada como un arreglo y desarrolla las rutinas de su programa asumiendo que siempre trabajar con un arreglo. Qu ocurre si se desea cambiar la estructura de datos de la lista para que en lugar de ser un arreglo sea otra cosa, por ejemplo una estructura dinmica que usa apuntadores? Este programador tendra que probablemente cambiar muchas de las rutinas de su programa.

Estructura de Datos

45

UCENM

2. En el segundo enfoque, el programador separa la implementacin del ADT del programa que usa el ADT. Para esto, el programador utiliza una clase para implementar el ADT. Una clase es un mecanismo que permite encapsular la estructura de datos de un objeto junto con las operaciones usadas para crear, acceder o para transformar los datos del objeto. La definicin de una clase se compone de dos porciones: la porcin pblica y la porcin privada, y se mantiene normalmente en un archivo aparte del cdigo fuente de la aplicacin que use la clase. La porcin pblica puede ser accesada por el programador de una aplicacin que desee solicitar los servicios de la clase. Esta incluye los prototipos de las operaciones especificadas para el ADT. La porcin privada slo la puede acceder los programadores que implementan la clase. Esta incluye la estructura de datos del ADT y las instrucciones que implementan las operaciones. Un programador de aplicaciones que utiliza los servicios de una clase no puede acceder a la estructura de datos que define la clase si no es por medio de llamadas a las operaciones definidas en la porcin pblica ya que el compilador no se lo permitir. Este es un enfoque que permite un manejo ms eficiente y mejor controlado de la complejidad de los programas ya que fomenta tanto la abstraccin de procesos como la abstraccin de datos.

Una clase permite definir un nuevo tipo de datos y cualquier variable que se declare usando esta definicin es conocida como un objeto. Esta es la esencia de la programacin orientada a objetos: un programa se compone de objetos que interactan entre s mediante el uso de las operaciones pblicas (los mtodos) de esos objetos. El proceso de disear clases promueve la abstraccin de procesos y la abstraccin de datos. Inclusive, se pueden disear clases que sean subtipos de clases ms fundamentales. Los objetos de estas clases derivadas heredarn los atributos y las operaciones definidas en la clase base, adems de que podrn contener atributos y operaciones propias. Es importante recalcar que los lenguajes de programacin ms populares hoy en da (C++, Java, Visual Basic, Delphi, C#, etc.) son todos lenguajes que permiten la programacin orientada a objetos. Por lo tanto, es un concepto del cual conviene estar familiarizado.

Algunos ejemplos de utilizacin de TDAs en programacin son: Conjuntos: Implementacin de conjuntos con sus operaciones bsicas (unin, interseccin y diferencia), operaciones de insercin, borrado, bsqueda... rboles Binarios de Bsqueda: Implementacin de rboles de elementos, utilizados para la representacin interna de datos complejos. Pilas y Colas: Implementacin de los algoritmos FIFO y LIFO. Grafos: Implementacin de grafos; una serie de vrtices unidos mediante una serie de arcos o aristas.

Estructura de Datos

46

UCENM

Capitulo III

rboles
Un rbol es una estructura de datos ampliamente usada que emula la forma de un rbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el rbol y puede tener cero o ms nodos hijos conectados a l. Se dice que un nodo a es padre de un nodo b si existe un enlace desde a hasta b (en ese caso, tambin decimos que b es hijo de a). Slo puede haber un nico nodo sin padres, que llamaremos raz. Un nodo que no tiene hijos se conoce como hoja. Los dems nodos (tienen padre y uno o varios hijos) se les conoce como rama.

Tambin podemos definirlo como: Estructura no lineal y dinmica de datos. Dinmica: puede cambiar durante la ejecucin de un programa. No lineal: a cada elemento del rbol pueden seguirle varios elementos. Estn formados por un conjunto de nodos y un conjunto de aristas que conectan pares de nodos.

Estructura de Datos

47

UCENM

Definicin no recursiva
Conjunto de nodos y conjunto de aristas que conectan pares de nodos con las siguientes caractersticas: Se distingue un nodo raz (no tiene padre). A cada nodo c (excepto la raz) le llega una arista desde exactamente un nodo p diferente a c, al cual se le llama padre de c. Hay un nico camino desde la raz hasta cada nodo. La longitud del camino es su nmero de aristas.

Definicin recursiva
Un rbol es o bien vaco o consiste en una raz y cero o ms subrboles no vacos T1, T2,, Tn, cada una de cuyas races est conectada por medio de una arista con la raz. Definiciones Los nodos que no tienen hijos se denominan hojas. Un rbol con N nodos debe tener (N-1) aristas. La profundidad de la raz es 0 y la de cualquier nodo es la de su padre ms 1. La altura de un nodo es 1 ms que la mayor altura de un hijo suyo. La altura de un rbol es la altura de la raz. Los nodos que tienen el mismo padre son hermanos. Si hay un camino del nodo u al nodo v, u es ascendiente de v y v es descendiente de u. Si u v son propios. El tamao de un nodo es el nmero de descendientes (incluido l mismo). El tamao de un rbol es el tamao de su raz. Formas de representacin Mediante un grafo:

Estructura de Datos

48

UCENM

Figura 1

Ejemplo de rbol (binario).

Mediante un diagrama encolumnado: a b d c e f

En la computacin se utiliza mucho una estructura de datos, que son los rboles binarios. Estos rboles tienen 0, 1 2 descendientes como mximo.

Nomenclatura sobre rboles


Raz: es aquel elemento que no tiene antecesor. Rama: arista entre dos nodos. Antecesor: un nodo X es antecesor de un nodo Y si por alguna de las ramas de X se puede llegar a Y. Sucesor: un nodo X es sucesor de un nodo Y si por alguna de las ramas de Y se puede llegar a X. Grado de un nodo: el nmero de descendientes directos que tiene. Ejemplo: c tiene grado 2, d tiene grado 0, a tiene grado 2. Hoja: nodo que no tiene descendientes: grado 0. Ejemplo: d Nodo interno: aquel que tiene al menos un descendiente. Nivel: nmero de ramas que hay que recorrer para llegar de la raz a un nodo. Estructura de Datos 49 UCENM

Altura: el nivel ms alto del rbol. Anchura: es el mayor valor del nmero de nodos que hay en un nivel. Grado de rbol: Cantidad mxima de hijos posibles de asociar a un nodo del rbol

Clasificacin

Segn Nmero de Hijos

Estructura de Datos

50

UCENM

Segn Estructura de Niveles


rbol completo: Es un rbol binario en el cual cada nodo es una hoja o posee exactamente 2 hijos. rbol lleno: Es un rbol binario con hojas en a lo ms dos niveles adyacentes l-1 y l, en las cuales los nodos terminales se encuentran ubicados en las posiciones de ms a la izquierda del rbol.

Si un rbol binario es completo, necesariamente es lleno Formalmente, podemos definir un rbol de la siguiente forma: Caso base: un rbol con slo un nodo (es a la vez raz del rbol y hoja). Un nuevo rbol a partir de un nodo nr y k rboles de races

con elementos cada uno, puede construirse estableciendo una relacin padre-hijo entre nr y cada una de las races de los k rboles. El rbol resultante de nodos tiene como raz el nodo nr, los nodos son los hijos de nr y el conjunto de nodos hoja est formado por la unin de los k conjuntos hojas iniciales. A cada uno de los rboles Ai se les denota ahora subrboles de la raz.

Tipos de rboles
rboles Binarios rbol de bsqueda binario auto-balanceable rboles B rboles Multicamino

Estructura de Datos

51

UCENM

Operaciones de rboles. Representacin


Las operaciones comunes en rboles son: Enumerar todos los elementos. Buscar un elemento. Dado un nodo, listar los hijos (si los hay). Borrar un elemento. Eliminar un subrbol (algunas veces llamada podar). Aadir un subrbol (algunas veces llamada injertar). Encontrar la raz de cualquier nodo. Por su parte, la representacin puede realizarse de diferentes formas. Las ms utilizadas son: Representar cada nodo como una variable en el heap, con punteros a sus hijos y a su padre. Representar el rbol con un array donde cada elemento es un nodo y las relaciones padre-hijo vienen dadas por la posicin del nodo en el array.

Uso de los rboles


Usos comunes de los rboles son: Representacin de datos jerrquicos. Como ayuda para realizar bsquedas en conjuntos de datos Particin binaria del espacio Implementacin primer hijo - siguiente hermano Consiste en mantener los hijos de cada nodo en una lista enlazada. Cada nodo tiene dos referencias: una a su hijo ms a la izquierda y otra a su hermano de la derecha.

Eliminar nodos en un rbol:


El proceso general es muy sencillo en este caso, pero con una importante limitacin, slo podemos borrar nodos hoja: El proceso sera el siguiente:

Estructura de Datos

52

UCENM

1. 2. 3. 4.

Buscar el nodo padre del que queremos eliminar. Buscar el puntero del nodo padre que apunta al nodo que queremos borrar. Liberar el nodo. padre->nodo[i] = NULL;.

Cuando el nodo a borrar no sea un nodo hoja, diremos que hacemos una "poda", y en ese caso eliminaremos el rbol cuya raz es el nodo a borrar. Se trata de un procedimiento recursivo, aplicamos el recorrido PostOrden, y el proceso ser borrar el nodo. El procedimiento es similar al de borrado de un nodo: 1. 2. 3. 4. Buscar el nodo padre del que queremos eliminar. Buscar el puntero del nodo padre que apunta al nodo que queremos borrar. Podar el rbol cuyo padre es nodo. padre->nodo[i] = NULL;.

En el rbol del ejemplo, para podar la rama 'B', recorreremos el subrbol 'B' en postorden, eliminando cada nodo cuando se procese, de este modo no perdemos los punteros a las ramas apuntadas por cada nodo, ya que esas ramas se borrarn antes de eliminar el nodo. De modo que el orden en que se borrarn los nodos ser: KEFyB

rboles ordenados:
A partir del siguiente captulo slo hablaremos de rboles ordenados, ya que son los que tienen ms inters desde el punto de vista de TAD, y los que tienen ms aplicaciones genricas. Un rbol ordenado, en general, es aquel a partir del cual se puede obtener una secuencia ordenada siguiendo uno de los recorridos posibles del rbol: inorden, preorden o postorden. En estos rboles es importante que la secuencia se mantenga ordenada aunque se aadan o se eliminen nodos. Existen varios tipos de rboles ordenados: rboles binarios de bsqueda (ABB): son rboles de orden 2 que mantienen una secuencia ordenada si se recorren en inorden. rboles AVL:

Estructura de Datos

53

UCENM

son rboles binarios de bsqueda equilibrados, es decir, los niveles de cada rama para cualquier nodo no difieren en ms de 1. rboles perfectamente equilibrados: son rboles binarios de bsqueda en los que el nmero de nodos de cada rama para cualquier nodo no difieren en ms de 1. Son por lo tanto rboles AVL tambin. rboles 2-3: son rboles de orden 3, que contienen dos claves en cada nodo y que estn tambin equilibrados. Tambin generan secuencias ordenadas al recorrerlos en inorden. rboles-B: caso general de rboles 2-3, que para un orden M, contienen M-1 claves.

Movimientos a travs del rbol


No hay mucho que contar. Nuestra estructura se referenciar siempre mediante un puntero al nodo Raiz, este puntero no debe perderse nunca. Para movernos a travs del rbol usaremos punteros auxiliares, de modo que desde cualquier puntero los movimientos posibles sern: moverse al nodo raz de la rama izquierda, moverse al nodo raz de la rama derecha o moverse al nodo Raiz del rbol. Informacin Hay varios parmetros que podemos calcular o medir dentro de un rbol. Algunos de ellos nos darn idea de lo eficientemente que est organizado o el modo en que funciona. Comprobar si un rbol est vaco. Un rbol est vaco si su raz es NULL.

Calcular el nmero de nodos.


Tenemos dos opciones para hacer esto, una es llevar siempre la cuenta de nodos en el rbol al mismo tiempo que se aaden o eliminan elementos. La otra es, sencillamente, contarlos. Para contar los nodos podemos recurrir a cualquiera de los tres modos de recorrer el rbol: inorden, preorden o postorden, como accin sencillamente incrementamos el contador.

Estructura de Datos

54

UCENM

Comprobar si el nodo es hoja.


Esto es muy sencillo, basta con comprobar si tanto el rbol izquierdo como el derecho estn vacos. Si ambos lo estn, se trata de un nodo hoja.

Calcular la altura de un nodo.


No hay un modo directo de hacer esto, ya que no nos es posible recorrer el rbol en la direccin de la raz. De modo que tendremos que recurrir a otra tcnica para calcular la altura. Lo que haremos es buscar el elemento del nodo de que queremos averiguar la altura. Cada vez que avancemos un nodo incrementamos la variable que contendr la altura del nodo. Empezamos con el nodo raz apuntando a Raiz, y la 'Altura' igual a cero. Si el valor del nodo raz es igual que el del elemento que buscamos, terminamos la bsqueda y el valor de la altura es 'Altura'. Incrementamos 'Altura'. Si el valor del nodo raz es mayor que el elemento que buscamos, continuaremos la bsqueda en el rbol izquierdo. Si el valor del nodo raz es menor que el elemento que buscamos, continuaremos la bsqueda en el rbol derecho.

Calcular la altura de un rbol.


La altura del rbol es la altura del nodo de mayor altura. Para buscar este valor tendremos que recorrer todo el rbol, de nuevo es indiferente el tipo de recorrido que hagamos, cada vez que cambiemos de nivel incrementamos la variable que contiene la altura del nodo actual, cuando lleguemos a un nodo hoja compararemos su altura con la variable que contiene la altura del rbol si es mayor, actualizamos la altura del rbol. Iniciamos un recorrido del rbol en postorden, con la variable de altura igual a cero. Cada vez que empecemos a recorrer una nueva rama, incrementamos la altura para ese nodo. Despus de procesar las dos ramas, verificamos si la altura del nodo es mayor que la variable que almacena la altura actual del rbol, si es as, actualizamos esa variable.

Estructura de Datos

55

UCENM

rboles degenerados
Los rboles binarios de bsqueda tienen un gran inconveniente. Por ejemplo, supongamos que creamos un ABB a partir de una lista de valores ordenada: 2, 4, 5, 8, 9, 12 Difcilmente podremos llamar a la estructura resultante un rbol:

Esto es lo que llamamos un rbol binario de bsqueda degenerado, y en el siguiente captulo veremos una nueva estructura, el rbol AVL, que resuelve este problema, generando rboles de bsqueda equilibrados.

rboles binarios
Un rbol binario es o bien vaco o consta de una raz, un hijo rbol binario izquierdo y otro derecho. Los rboles binarios de bsqueda permiten inserciones y acceso a los elementos en tiempo logartmico. Los rboles binarios llamados colas con prioridad soportan acceso y eliminacin del mnimo de una coleccin de elementos.

Recorridos sobre rboles binarios


Se consideran dos tipos de recorrido: recorrido en profundidad y recorrido en anchura o a nivel. Puesto que los rboles no son secuenciales como las listas, hay que buscar estrategias alternativas para visitar todos los nodos. Estructura de Datos 56 UCENM

Recorridos en profundidad:
Recorrido en preorden: consiste en visitar el nodo actual (visitar puede ser simplemente mostrar la clave del nodo por pantalla), y despus visitar el subrbol izquierdo y una vez visitado, visitar el subrbol derecho. Es un proceso recursivo por naturaleza. Si se hace el recorrido en preorden del rbol de la figura 1 las visitas seran en el orden siguiente: a,b,d,c,e,f. void preorden(tarbol *a) { if (a != NULL) { visitar(a); preorden(a->izq); preorden(a->der); } }

Recorrido en in-orden u orden central:


se visita el subrbol izquierdo, el nodo actual, y despus se visita el subrbol derecho. En el ejemplo de la figura 1 las visitas seran en este orden: b,d,a,e,c,f. void inorden(tarbol *a) { if (a != NULL) { inorden(a->izq); visitar(a); inorden(a->der); } }

Recorrido en post-orden:
se visitan primero el subrbol izquierdo, despus el subrbol derecho, y por ltimo el nodo actual. En el ejemplo de la figura 1 el recorrido quedara as: d,b,e,f,c,a. void postorden(arbol *a) { if (a != NULL) { postorden(a->izq); postorden(a->der); visitar(a); } }

Estructura de Datos

57

UCENM

La ventaja del recorrido en postorden es que permite borrar el rbol de forma consistente. Es decir, si visitar se traduce por borrar el nodo actual, al ejecutar este recorrido se borrar el rbol o subrbol que se pasa como parmetro. La razn para hacer esto es que no se debe borrar un nodo y despus sus subrboles, porque al borrarlo se pueden perder los enlaces, y aunque no se perdieran se rompe con la regla de manipular una estructura de datos inexistente. Una alternativa es utilizar una variable auxiliar, pero es innecesario aplicando este recorrido.

Recorrido en amplitud:
Consiste en ir visitando el rbol por niveles. Primero se visitan los nodos de nivel 1 (como mucho hay uno, la raz), despus los nodos de nivel 2, as hasta que ya no queden ms. Si se hace el recorrido en amplitud del rbol de la figura una visitara los nodos en este orden:.a,b,c,d,e,f En este caso el recorrido no se realizar de forma recursiva sino iterativa, utilizando una cola como estructura de datos auxiliar. El procedimiento consiste en encolar (si no estn vacos) los subrboles izquierdo y derecho del nodo extrado de la cola, y seguir desencolando y encolando.hasta.que.la.cola.est.vaca. En la codificacin que viene a continuacin no se implementan las operaciones sobre colas. void amplitud(tarbol *a) { tCola cola; /* las claves de la cola sern de tipo rbol binario */ arbol *aux; if (a != NULL) { CrearCola(cola); encolar(cola, a); while (!colavacia(cola)) { desencolar(cola, aux); visitar(aux); if (aux->izq != NULL) encolar(cola, aux->izq); if (aux->der != NULL) encolar(cola, aux->der); } } }

Por ltimo, considrese la sustitucin de la cola por una pila en el recorrido en amplitud. Qu tipo de recorrido se obtiene?

Finalmente, puede decirse que esta estructura es una representacin del concepto de rbol en teora de grafos. Un rbol es un grafo conexo y acclico

Estructura de Datos

58

UCENM

Construccin de un rbol binario


Partiendo de los recorridos preorden e inorden del rbol de la figura 1 puede determinarse que la raz es el primer elemento del recorrido en preorden. Ese elemento se busca en el array inorden. Los elementos en el array inorden entre izq y la raz forman el subrbol izquierdo. Asimismo los elementos entre der y la raz forman el subrbol derecho. Por tanto se tiene este rbol:

A continuacin comienza un proceso recursivo. Se procede a crear el subrbol izquierdo, cuyo tamao est limitado por los ndices izq y der. La siguiente posicin en el recorrido en preorden es la raz de este subrbol. Queda esto:

El subrbol b tiene un subrbol derecho, que no tiene ningn descendiente, tal y como indican los ndices izq y der. Se ha obtenido el subrbol izquierdo completo de la raz a, puesto que b no tiene subrbol izquierdo:

Estructura de Datos

59

UCENM

Despus seguir construyndose el subrbol derecho a partir de la raz a. La implementacin de la construccin de un rbol partiendo de los recorridos en preorden y en inorden puede consultarse aqu (en C).

Declaracin de rbol binario


Se definir el rbol con una clave de tipo entero (puede ser cualquier otra tipo de datos) y dos hijos: izquierdo (izq) y derecho (der). Para representar los enlaces con los hijos se utilizan punteros. El rbol vaco se representar con un puntero nulo. Un rbol binario puede declararse de la siguiente manera: typedef struct tarbol { int clave; struct tarbol *izq,*der; } tarbol;

rboles binarios de bsqueda


Un rbol binario de bsqueda es aquel que es: Una estructura vaca o Estructura de Datos 60 UCENM

Un elemento o clave de informacin (nodo) ms un nmero finito -a lo sumo dos- de estructuras tipo rbol, disjuntos, llamados subrboles y adems cumplen lo siguiente: o Todas las claves del subrbol izquierdo al nodo son menores que la clave del nodo. o Todas las claves del subrbol derecho al nodo son mayores que la clave del nodo. o Ambos subrboles son rboles binarios de bsqueda. Un ejemplo de rbol binario de bsqueda:

Figura 2 Al definir el tipo de datos que representa la clave de un nodo dentro de un rbol binario de bsqueda es necesario que en dicho tipo se pueda establecer una relacin de orden. Por ejemplo, suponer que el tipo de datos de la clave es un puntero (da igual a lo que apunte). Si se codifica el rbol en Pascal no se puede establecer una relacin de orden para las claves, puesto que Pascal no admite determinar si un puntero es mayor o menor que otro. En el ejemplo de la Figura 2 las claves son nmeros enteros. Dada la raz 4, las claves del subrbol izquierdo son menores que 4, y las claves del subrbol derecho son mayores que 4. Esto se cumple tambin para todos los subrboles. Si se hace el recorrido de este rbol en orden central se obtiene una lista de los nmeros ordenada de menor a mayor.

Una ventaja fundamental de los rboles de bsqueda es que son en general mucho ms rpidos para localizar un elemento que una lista enlazada. Por tanto, son ms rpidos para insertar y borrar elementos. Si el rbol est perfectamente equilibrado (esto es, la diferencia entre el nmero de nodos del subrbol izquierdo y el nmero de nodos del subrbol derecho es a lo sumo 1, para todos los nodos) entonces el nmero de comparaciones necesarias para localizar una clave es aproximadamente de logN en el peor caso. Adems, el algoritmo de insercin en un rbol binario de bsqueda tiene la ventaja sobre los arrays ordenados, donde se empleara bsqueda dicotmica para localizar un elemento- de que no necesita hacer una reubicacin de los elementos de la estructura para que esta siga ordenada Estructura de Datos 61 UCENM

despus de la insercin. Dicho algoritmo funciona avanzando por el rbol escogiendo la rama izquierda o derecha en funcin de la clave que se inserta y la clave del nodo actual, hasta encontrar su ubicacin; por ejemplo, insertar la clave 7 en el rbol de la Figura 2 requiere avanzar por el rbol hasta llegar a la clave 8, e introducir la nueva clave en el subrbol izquierdo.a.8.

El algoritmo de borrado en rboles es algo ms complejo, pero ms eficiente que el de borrado en un array ordenado.

Operaciones bsicas sobre rboles binarios de bsqueda


Bsqueda
Si el rbol no es de bsqueda, es necesario emplear uno de los recorridos anteriores sobre el rbol para localizarlo. El resultado es idntico al de una bsqueda secuencial. Aprovechando las propiedades del rbol de bsqueda se puede acelerar la localizacin. Simplemente hay que descender a lo largo del rbol a izquierda o derecha dependiendo del elemento que se busca. boolean buscar(tarbol *a, int elem) { if (a == NULL) return FALSE; else if (a->clave < elem) return buscar(a->der, elem); else if (a->clave > elem) return buscar(a->izq, elem); else return TRUE; }

Insercin
La insercin tampoco es complicada. Es ms, resulta prcticamente idntica a la bsqueda. Cuando se llega a un rbol vaco se crea el nodo en el puntero que se pasa como parmetro por referencia, de esta manera los nuevos enlaces mantienen la coherencia. Si el elemento a insertar ya existe entonces no se hace nada. void insertar(tarbol **a, int elem) { if (*a == NULL) { *a = (arbol *) malloc(sizeof(arbol)); (*a)->clave = elem; (*a)->izq = (*a)->der = NULL; } else if ((*a)->clave < elem) insertar(&(*a)->der, elem); else if ((*a)->clave > elem) insertar(&(*a)->izq, elem); }

Estructura de Datos

62

UCENM

Borrado
La operacin de borrado si resulta ser algo ms complicada. Se recuerda que el rbol debe seguir siendo de bsqueda tras el borrado. Pueden darse tres casos, una vez encontrado el nodo a borrar: 1) El nodo no tiene descendientes. Simplemente se borra. 2) El nodo tiene al menos un descendiente por una sola rama. Se borra dicho nodo, y su primer descendiente se asigna como hijo del padre del nodo borrado. Ejemplo: en el rbol de la Figura 2 se borra el nodo cuya clave es -1. El rbol resultante es:

3) El nodo tiene al menos un descendiente por cada rama. Al borrar dicho nodo es necesario mantener la coherencia de los enlaces, adems de seguir manteniendo la estructura como un rbol binario de bsqueda. La solucin consiste en sustituir la informacin del nodo que se borra por el de una de las hojas, y borrar a continuacin dicha hoja. Puede ser cualquier hoja?

No, debe ser la que contenga una de estas dos claves: La mayor de las claves menores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del rbol de la Figura 2. Se sustituir la clave 4 por la clave 2. La menor de las claves mayores al nodo que se borra. Suponer que se quiere borrar el nodo 4 del rbol de la Figura 2. Se sustituir la clave 4 por la clave 5. El algoritmo de borrado que se implementa a continuacin realiza la sustitucin por la mayor de las claves menores, (aunque se puede escoger la otra opcin sin prdida de generalidad). Para lograr esto es necesario descender primero a la izquierda del nodo que se va a borrar, y despus avanzar siempre a la derecha hasta encontrar un nodo hoja. A continuacin se muestra grficamente el proceso de borrar el nodo de clave 4:

Estructura de Datos

63

UCENM

Codificacin: el procedimiento sustituir es el que desciende por el rbol cuando se da el caso del nodo con descendientes por ambas ramas. void borrar(tarbol **a, int elem) { void sustituir(tarbol **a, tarbol **aux); tarbol *aux; if (*a == NULL) /* no existe la clave */ return; if ((*a)->clave < elem) borrar(&(*a)->der, elem); else if ((*a)->clave > elem) borrar(&(*a)->izq, elem); else if ((*a)->clave == elem) { aux = *a; if ((*a)->izq == NULL) *a = (*a)->der; else if ((*a)->der == NULL) *a = (*a)->izq; else sustituir(&(*a)->izq, &aux); /* se sustituye por la mayor de las menores */ free(aux); } } operacin borrado El nodo a borrar debe ser reemplazado por el nodo ms a la derecha en el subrbol izquierdo o el nodo ms a la izquierda en el subrbol derecho (el nodo ms a la derecha del subrbol izquierdo ser mayor o igual que cualquier otro nodo de ese subrbol y menor que todos los del subrbol derecho, y el nodo ms a la izquierda del subrbol derecho ser menor que todos los dems nodos de ese subrbol y mayor que todos los del subrbol izquierdo). Para Estructura de Datos 64 UCENM

el caso en el que el nodo elegido tengo un subrbol, hay por lo menos tres soluciones posibles: La primera consiste en conservar la estructura del subrbol, y colgar del elemento ubicado en el extremo (el elemento menor o mayor) correspondiente al subrbol donde se encuentra el elemento a promover hacia la raz (en este ejemplo, el subrbol izquierdo, por lo cual se buscar el elemento ms a la izquierda), lo cual es consistente, porque todos los elementos en el subrbol promovido sern mayores que los del subrbol del cual estaban colgados a la derecha. El inconveniente que presenta esta solucin es que debe utilizarse una funcin encontrarMnimo() o encontrarMximo(). La segunda solucin consiste en colgar del padre del nodo promovido hacia la raz, el subrbol remanente. Esto es consistente, porque todo elemento del subrbol derecho de un nodo ser mayor que el valor de ese nodo, y viceversa. Estas soluciones aprovechan la ventaja de contar con que el nodo promovido tiene, a lo sumo, un subrbol. Un hueco dejado por un nodo promovido tambin puede pensarse como una eliminacin.

rboles binarios perfectamente equilibrados


La eficiencia de las operaciones depende exclusivamente de la altura del rbol. Para un rbol de N nodos perfectamente equilibrado el coste de acceso es de orden logartmico: O(log N). Sin embargo, si el rbol crece o decrece descontroladamente, el rendimiento puede disminuir considerablemente, siendo para el caso ms desfavorable (insertar un conjunto de claves ordenadas en forma ascendente o descendente) el coste de acceso: O(N). En un rbol binario perfectamente equilibrado, el nmero de nodos en el subrbol izquierdo y el nmero de nodos en el subrbol derecho, difieren como mucho en una unidad, y los subrboles son tambin equilibrados.

rboles equilibrados
Un procedimiento de insercin que siempre restaure la estructura del rbol a un equilibrio perfecto es poco eficiente. Se usa una formulacin menos estricta de equilibrio: Un rbol est equilibrado si para cada uno de sus nodos ocurre que las alturas de sus dos subrboles difieren como mucho en 1.

Estructura de Datos

65

UCENM

Factor de equilibrio (FE) de un nodo


El FE es la altura del subrbol izquierdo menos la altura del subrbol derecho. Los valores que puede tomar son -1, 0, 1. Si llegara a tomar los valores -2 o 2 debe reestructurarse el rbol. Todos los rboles perfectamente equilibrados son AVL. La longitud de camino media es prcticamente idntica a la de un rbol perfectamente equilibrado. En un AVL se puede realizar con complejidad del O(log N) las siguientes operaciones: Encontrar un nodo con una clave dada. Insertar un nodo con una clave dada. Borrar un nodo con una clave dada. Un rbol AVL de altura H tiene por lo menos (Fibonacci(H+3) -1) nodos. Los pasos necesarios para insertar un nodo en un rbol AVL son: Agregar el nodo como en un rbol binario de bsqueda. En el regreso por el camino de bsqueda se comprueba el FE de los nodos. Si un nodo presenta un FE incorrecto (2 o -2) se reestructura el rbol y se contina el ascenso hasta llegar a la raz. Casos en situacin de reestructurar: 1. 2. 3. 4. Una insercin en el subrbol izquierdo del hijo izquierdo de X. Una insercin en el subrbol derecho del hijo izquierdo de X. Una insercin en el subrbol izquierdo del hijo derecho de X. Una insercin en el subrbol derecho del hijo derecho de X.

Inserciones en los mrgenes 1 y 4: inserciones en los mrgenes: rotacin simple: intercambia los papeles de los padres y de los hijos, manteniendo la ordenacin. // Rotacin izquierda - izquierda private static NodoAVL rotarConHijoIzq(NodoAVL A) { NodoAVL B = (NodoAVL) A.getIzq(); //Asigna nombre A.setIzq(B.getDer()); B.setDer(A); return B; } Inserciones por dentro 2 y 3: inserciones por dentro: rotacin doble. Notar que una rotacin simple no resuelve el problema, ya que la rama que provoc el desequilibrio se descuelga del nodo promovido y se cuelga al nodo que desciende un nivel, de manera que se mantiene con la misma profundidad, que es la que provoc el desequilibrio. Por lo tanto, antes de rotar, debe Estructura de Datos 66 UCENM

desplazarse el desequilibrio a la rama correspondiente, es decir, transformamos el caso de una insercin por dentro, a un caso de insercin en el margen, utilizando una rotacin. // Rotacin izquierda - derecha private static NodoAVL rotarDobleConHijoIzq(NodoAVL A) { NodoAVL B = (NodoAVL) A.getIzq(); //Asigna nombre A.setIzq(rotarConHijoDer((NodoAVL) B)); return rotarConHijoIzq(A); } Como se ve, el problema se convirti en un problema igual al del primer caso. Los pasos necesarios para suprimir un nodo en un rbol AVL son: Suprimir el nodo como en un rbol binario de bsqueda. En el regreso por el camino de supresin se comprueba el FE de los nodos. Si un nodo presenta un FE incorrecto (2 o -2) se reestructura el rbol y se contina el ascenso hasta llegar a la raz. La reestructuracin se efecta cuando al regresar por el camino de bsqueda despus de una insercin o una supresin se comprueba que la condicin del FE se ha violado. Una supresin puede provocar varias reestructuraciones. En la prctica se utilizan otros esquemas de equilibrio como los rboles rojinegros: como en los AVL las operaciones son logartmicas en el peor caso. La ventaja es que las inserciones y eliminaciones pueden realizarse con un nico recorrido descendente.

rboles rojinegros
rbol binario de bsqueda, donde cada nodo est coloreado con los colores rojo o negro, y se verifican las siguientes propiedades: 1. La raz es negra. 2. Si un nodo es rojo, sus hijos deben ser negros. 3. Todos los caminos desde un nodo a un nodo vaco deben contener el mismo nmero de nodos negros. Las condiciones (2) y (3) aseguran que el rbol nunca est demasiado desbalanceado. (2) asegura que no puedan haber demasiados nodos rojos, y (3) dice que, despreciando el nmero de nodos rojos, que es limitado, el rbol es perfectamente balanceado. La condicin (1) es trivial: si la raz es roja, simplemente se colorea negra, ya que esto no violar ninguna regla. En los ARN la operacin eliminar se complica. Cuando se necesitan rboles equilibrados y se requieren muchas eliminaciones se emplean los AA-rboles que aaden una condicin adicional a las impuestas por los ARN:

Estructura de Datos

67

UCENM

4. Los hijos izquierdos no pueden ser rojos.

Altura de un ARN
En un ARN con n nodos, la altura h ser:

Demostracin
La condicin (3) nos permite asegurar que, despreciando el nmero de nodos rojos, el rbol es perfectamente balanceado, y, en virtud de esa caracterstica, su altura . La condicin (2) evita que haya nodos rojos consecutivos, como mximo, la mitad de los nodos de un camino -que constituirn una altura- sern rojos.

Operaciones Se pueden realizar operaciones de bsqueda con complejidad O(log N), por lo expuesto anteriormente. Al realizar una insercin, la complejidad de bsqueda ser O(log N), pero aparece un problema: el resultado ser un rbol de bsqueda binario, pero no necesariamente un ARN. Si coloreamos el nuevo nodo rojo, el balance de negros quedar intacto, pero se puede incurrir en una violacin rojo-rojo. Si lo coloreamos negro, no se incurrir en una violacin rojo-rojo, pero en este caso, siempre alteraremos el balance de negros. Al eliminar, si el nodo a eliminar es negro, ambas violaciones pueden aparecer.

Reparacin del balance del rbol Una vez detectada una violacin, se deben tomar medidas que reparen el balance del rbol. Estas medidas utilizan dos herramientas: rotaciones y cambios de color.

Insercin ascendente Sea X la nueva hoja aadida, P su padre, S el hermano de P (si existe) y G el abuelo. 1. Los nuevos nodos se insertan en el rbol como hojas de color rojo. 2. Si el padre es negro, hemos acabado.

Estructura de Datos

68

UCENM

3. Si el padre es rojo violamos la regla 2, entonces debemos modificar el rbol de forma que se cumpla la regla (2) sin introducir violaciones de la propiedad (3). 4. Si el padre P es la raz, se colorea negro. La altura negra aumenta en 1, pero el balance se preserva. Hemos acabado.

Reparacin del balance


Asumiendo que P no es la raz 5. Si S es rojo, se puede aplicar un cambio de color: Se elimina as la violacin, y el balance de negros se mantiene. Qu pasa si el padre de G es tambin rojo? Solucin: propagar este procedimiento hacia arriba hasta conseguir que no haya dos nodos rojos consecutivos o alcanzar la raz. Esta propagacin es anloga a la que se hace en los rboles AVL. 6. Si S es negro, tenemos dos casos, con sus simtricos asociados: violacin en el margen, y violacin por dentro. 7. Si es una violacin es por dentro, la convertimos a una violacin en el margen haciendo una rotacin: Como X y P son rojos, no aaden nada en el balance de negros a los caminos que pasan por g, de manera que el balance se preserva. 8. Teniendo el caso de violacin por dentro, se efecta una rotacin simple. La rama izquierda de desbalancea, le falta un nodo negro para todos sus caminos, y an tenemos la violacin rojo-rojo. Solucionamos ambos problemas haciendo un cambio de color.

Insercin descendente
Objetivo: garantizar que en el momento de la insercin S no es rojo, de manera que slo haya que aadir una hoja roja y, si fuere necesario, realizar una rotacin (simple o doble). En el camino descendente, si un nodo X tiene dos hijos rojos, el color de X cambia a rojo y el de sus dos hijos a negro. El nmero de nodos negros en los caminos por debajo de X permanece inalterable. Si X es la raz, la convertiramos en roja, hay que volver a negro (esto no puede violar ninguna de las reglas). Si el padre de X es rojo, hay que aplicar rotacin simple o doble. Qu pasa si el hermano del padre de X es tambin rojo? Esta situacin NO puede darse, gracias al proceso efectuado en el camino descendiente.

Estructura de Datos

69

UCENM

rboles B
Mientras que la altura de un rbol binario completo es, aproximadamente, log2N, la altura de un rbol M-ario completo es, ms o menos, logMN. Un B-rbol de orden M es un rbol M-ario que verifica: Cada pgina, excepto la pgina raz y las pginas hojas, tienen entre M/2 y M descendientes, y entre (M/2 -1) y (M-1) elementos. La pgina raz, o es una hoja o tiene entre 2 y M descendientes. Las pginas hojas estn todas al mismo nivel. Relacin entre los rboles B y los rboles rojinegros Si juntamos un nodo negro con sus hijos rojos, si los hubiere, en un mismo nodo, se obtiene un rbol no binario con altura igual a la altura negra, con un mximo de 3 elementos y 4 hijos, y un mnimo de un elemento; en definitiva, es un rbol B de orden 4.

Bsqueda
Debe tenerse en memoria principal la pgina sobre la cual vamos a buscar. Considrese el elemento a buscar x. Si la bsqueda es infructuosa dentro de la pgina se estar en una de las siguientes situaciones: ki < x < ki + 1 para 1 i < n. La bsqueda contina en la pgina ri. kn < x. La bsqueda contina en la pgina rn. x < k1. La bsqueda contina en la pginar0. Si en algn caso la referencia es nula, es decir, si no hay pgina descendiente, entonces no hay ningn elemento x en todo el rbol y se acaba la bsqueda.

Insercin
Siempre se inserta en los nodos hojas. Primero se comprueba que la clave no se encuentre en el rbol. Si la cantidad de elementos es menor que 2n: Se inserta en forma secuencial la clave. Si la cantidad de elementos es 2n: Los 2n+1 elementos se dividen en dos pginas, excluyendo la clave del medio. La clave del medio se inserta en el nodo padre.

Estructura de Datos

70

UCENM

Borrado
Si la clave a ser borrada no est en una hoja, su predecesor inmediato tiene que estar en una hoja (esto se debe a que todas las hojas tienen el mismo nivel, de manera que si existe un valor menor en un nodo ms abajo, tambin tiene que haber uno mayor), y se puede promover, y as borrar el espacio que estaba en la hoja. Si la hoja queda con menos de n elementos, se comprueba si se puede promover un elemento de un hermano adyacente a su padre, y bajar el del padre a la hoja. Si el hermano tiene slo n elementos, las dos hojas y la clave del medio se unen, y la clave del medio se elimina del nodo padre.

rboles B+
Las diferencias con los rboles B son que: Slo los nodos hoja apuntan a los registros o cubetas del fichero. Existe un orden lineal entre las hojas, que estn encadenadas mediante punteros para permitir un eficiente acceso secuencial. Bsqueda por clave Buscar en la raz el valor ki ms pequeo mayor que la clave x. La bsqueda sigue por el puntero pi hasta que llegue a un nodo hoja, que ser donde est el puntero al bloque o cubeta (cuando un elemento se encuentre en una pgina raz o interior la bsqueda continuar por la rama derecha de dicha clave, hasta llegar a una hoja).

Insercin
Se busca el nodo hoja correspondiente y se inserta la clave si no est all. Si tiene lugar una particin, se inserta una clave en el nodo padre, que ser duplicada si la particin ocurre en una hoja.

Eliminacin
Se busca el nodo hoja correspondiente y se elimina la clave. Si al eliminar una clave, n queda menor a (M/2 -1), entonces debe realizarse una redistribucin de claves, tanto en el ndice como en las pginas hojas.

Aplicacin prctica de un rbol


Se tiene un fichero de texto ASCII. Para este propsito puede servir cualquier libro electrnico de la librera Gutenberg o Cervantes, que suelen tener varios cientos de miles de palabras. El objetivo es clasificar todas las palabras, es decir, determinar que palabras Estructura de Datos 71 UCENM

aparecen, y cuantas veces aparece cada una. Palabras como 'nio'-'nia', 'vengo'-'vienes' etc., se consideran diferentes por simplificar el problema. Escribir un programa, que recibiendo como entrada un texto, realice la clasificacin descrita anteriormente.

Ejemplo:

Texto: "a b'a c. hola, adis, hola" La salida que produce es la siguiente: a2 adis 1 b1 c1 hola 2 Ntese que el empleo de una lista enlazada ordenada no es una buena solucin. Si se obtienen hasta 20.000 palabras diferentes, por decir un nmero, localizar una palabra cualquiera puede ser, y en general lo ser, muy costoso en tiempo. Se puede hacer una implementacin por pura curiosidad para evaluar el tiempo de ejecucin, pero no merece la pena. La solucin pasa por emplear un rbol binario de bsqueda para insertar las claves. El valor de Log (20.000) es aproximadamente de 14. Eso quiere decir que localizar una palabra entre 20.000 llevara en el peor caso unos 14 accesos. El contraste con el empleo de una lista es simplemente abismal. Por supuesto, como se ha comentado anteriormente el rbol no va a estar perfectamente equilibrado, pero nadie escribe novelas manteniendo el orden lexicogrfico (como un diccionario) entre las palabras, as que no se obtendr nunca un rbol muy degenerado. Lo que est claro es que cualquier evolucin del rbol siempre ser mejor que el empleo de una lista. Por ltimo, una vez realizada la lectura de los datos, slo queda hacer un recorrido en orden central del rbol y se obtendr la solucin pedida en cuestin de segundos. Una posible definicin de la estructura rbol es la siguiente: typedef struct tarbol { char clave[MAXPALABRA]; int contador; /* numero de apariciones. Iniciar a 0 */ struct tarbol *izq, *der; } tarbol;

Estructura de Datos

72

UCENM

EJEMPLOS DE RBOLES

Estructura de Datos

73

UCENM

Capitulo IV

Teora de Grafos
En matemticas y ciencias de la computacin, la teora de grafos estudia las propiedades de los grafos, que son colecciones de objetos llamados vrtices (o nodos) conectados por lneas llamadas aristas (o arcos) que pueden tener orientacin (direccin asignada). Tpicamente, un grafo est diseado por una serie de puntos (los vrtices) conectados por lneas (las aristas).

Historia

Los siete puentes de Knigsberg.

El primer artculo cientfico relativo a grafos fue escrito por el matemtico suizo Leonhard Euler en 1736. Euler se bas en su artculo en el problema de los puentes de Knigsberg. La ciudad de Kaliningrado, originalmente Knigsberg, es famosa por sus siete puentes que unen ambas mrgenes del ro Pregel con dos de sus islas. Dos de los puentes unen la isla mayor con la margen oriental y otros dos con la margen occidental. La isla menor est conectada a cada margen por un puente y el sptimo puente une ambas islas. El problema planteaba lo siguiente: es posible, partiendo de un lugar arbitrario, regresar al lugar de partida cruzando cada puente una sola vez? Abstrayendo este problema y plantendolo con la (entonces an bsica) teora de grafos, Euler consigue demostrar que el grafo asociado al esquema de puentes de Knigsberg no tiene solucin, es decir, no es posible regresar al vrtice de partida sin pasar por alguna arista dos veces. Estructura de Datos 74 UCENM

De hecho, Euler resuelve el problema ms general: qu condiciones debe satisfacer un grafo para garantizar que se puede regresar al vrtice de partida sin pasar por la misma arista ms de una vez? El trabajo de Leonhard Euler, en 1736, sobre el problema de los puentes de Knigsberg es considerado como uno de los primeros resultados de la teora de grafos. Tambin se considera uno de los primeros resultados topolgicos en geometra (que no depende de ninguna medida). Este ejemplo ilustra la profunda relacin entre la teora de grafos y la topologa. En 1845 Gustav Kirchhoff public sus leyes de los circuitos para calcular el voltaje y la corriente en los circuitos elctricos. En 1852 Francis Guthrie plante el problema de los cuatro colores que plantea si es posible, utilizando solamente cuatro colores, colorear cualquier mapa de pases de tal forma que dos pases vecinos nunca tengan el mismo color. Este problema, que no fue resuelto hasta un siglo despus por Kenneth Appel y Wolfgang Haken, puede ser considerado como el nacimiento de la teora de grafos. Al tratar de resolverlo, los matemticos definieron trminos y conceptos tericos fundamentales de los grafos.

Definicin:
Un grafo es la representacin por medio de conjuntos de relaciones arbitrarias entre objetos En matemticas y ciencias de la computacin, un grafo (del griego grafos: dibujo, imagen) es el principal objeto de estudio de la teora de grafos. Informalmente, un grafo es un conjunto de objetos llamados vrtices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre elementos de un conjunto. Tpicamente, un grafo se representa grficamente como un conjunto de puntos (vrtices o nodos) unidos por lneas (aristas). Desde un punto de vista prctico, los grafos permiten estudiar las interrelaciones entre unidades que interactan unas con otras. Por ejemplo, una red de computadoras puede representarse y estudiarse mediante un grafo, en el cual los vrtices representan terminales y las aristas representan conexiones (las cuales, a su vez, pueden ser cables o conexiones inalmbricas). Prcticamente cualquier problema puede representarse mediante un grafo, y su estudio trasciende a las diversas reas de las ciencias duras y las ciencias sociales. Un grafo G es un par ordenado G = (V,E), donde: V es un conjunto de vrtices o nodos, y

Estructura de Datos

75

UCENM

E es un conjunto de arcos o aristas, que relacionan estos nodos. Normalmente V (y por tanto tambin E) suele ser finito. Muchos resultados importantes sobre grafos no son aplicables para grafos infinitos. Se llama orden de G a su nmero de vrtices, |

V|. Lazos o bucles


Un lazo o bucle es una arista que relaciona al mismo nodo; es decir, una arista donde el nodo inicial y el nodo final coinciden.

Tipos de grafos
Existen dos tipos de grafos segn la relacin entre los objetos sea unvoca o biunvoca. Los primeros forman los grafos dirigidos o dgrafos y los segundos los grafos no dirigidos o simplemente grafos.

Grafo no dirigido
Un grafo no dirigido, o grafo, al igual que un dgrafo consiste de un conjunto de vrtices V y un conjunto de arcos A. La diferencia consiste en que la existencia de aRb presupone que bRa tambin existe y adems que son iguales. De este modo es indistinto hablar del arco (a,b) o (b,a), tampoco tiene sentido hablar de la cabeza o la cola del arco. Los grafos representan como lo indica la figura , donde los crculos representan los vrtices y las lneas representan los arcos.

. Grafo no dirigido

Un grafo no dirigido o grafo propiamente dicho es un grafo G = (V,E) donde:

es un conjunto de pares no ordenados de elementos de .

Estructura de Datos

76

UCENM

Un par no ordenado es un conjunto de la forma {a,b}, de manera que {a,b} = {b,a}. Para los grafos, estos conjuntos pertenecen al conjunto potencia de V de cardinalidad 2, el cual se denota por .

Un nodo b se dice que es adyacente al nodo a si existe el arco (a, b), tmese en cuenta que para un grafo no dirigido necesariamente a es tambin adyacente a b. Esto no ocurre en los grafos dirigidos donde la existencia de (a, b) no implica que (b, a) tambin existe. Este concepto es de particular importancia dado que los grafos suelen representarse en la computadora por medio de listas o matrices de adyacencias. Un arco (a,b) incide en el nodo b, de igual modo en grafo no dirigido dicho arco tambin incide en el nodo a debido a que tambin existe (b, a). El nmero de arcos que inciden en un nodo le otorga el grado a dicho nodo. El nodo con mayor grado en el grafo le indica el grado de dicho grafo. Tambin se acostumbra representar a un grafo por medio de listas o matrices de incidencias.

Grafo dirigido
Un grafo dirigido o dgrafo consiste de un conjunto de vrtices V y un conjunto de arcos A. Los vrtices se denominan nodos o puntos; los arcos tambin se conocen como aristas o lneas dirigidas que representan que entre un par de vrtices existe una relacin unvoca aRb pero no bRa. De modo que los arcos se representan comnmente por medio de pares ordenados (a,b), donde se dice que a es la cabeza y b la cola del arco y a menudo se representa tambin por medio de una flecha, tal como se muestra en la figura .

. Grafo dirigido

Un grafo dirigido o digrafo es un grafo G = (V,E) donde:

es un conjunto de pares ordenados de elementos de .

Dada una arista (a,b), a es su nodo inicial y b su nodo final. Por definicin, los grafos dirigidos no contienen bucles.

Estructura de Datos

77

UCENM

Un vrtice que solo tiene arcos saliendo de l se denomina fuente y un vrtice que solo tiene arcos dirigidos hacia l se denomina sumidero. Dicha nomenclatura es importante cuando los dgrafos se usan para resolver problemas de flujos.

Pseudografo
Un pseudografo es un grafo G = (V,E) donde:

es un conjunto de pares no ordenados de elementos de . .

Es decir, un pseudografo es un grafo no dirigido que acepta bucles en

Pseudografo dirigido
Un pseudografo dirigido es un grafo G = (V,E) donde:

es un conjunto de pares ordenados y etiquetados de elementos de Es decir, un pseudografo dirigido es un grafo dirigido que acepta bucles en .

Variantes sobre las principales definiciones


Algunas aplicaciones requieren extensiones ms generales a las dos propuestas clsicas de grafos. Aunque la definicin original los permite, segn la aplicacin concreta pueden ser vlidos o no. A veces V o E pueden ser un multiconjunto, pudiendo haber ms de una arista entre cada par de vrtices. La palabra grafo (a secas) puede permitir o no mltiples aristas entre cada par de vrtices, dependiendo del autor de la referencia consultada. Si se quiere remarcar la inexistencia de mltiples aristas entre cada par de vrtices (y en el caso no dirigido, excluir bucles) el grafo puede llamarse simple. Por otra parte, si se quiere asegurar la posibilidad de permitir mltiples aristas, el grafo puede llamarse multigrafo (a veces se utiliza el trmino pseudografo para indicar que se permiten tanto bucles como mltiples aristas entre cada par de vrtices).

Estructura de Datos

78

UCENM

Propiedades
Adyacencia: dos aristas son adyacentes si tienen un vrtice en comn, y dos vrtices son adyacentes si una arista los une. Incidencia: una arista es incidente a un vrtice si sta lo une a otro. Ponderacin: corresponde a una funcin que a cada arista le asocia un valor (costo, peso, longitud, etc.), para aumentar la expresividad del modelo. Esto se usa mucho para problemas de optimizacin, como el del vendedor viajero o del camino ms corto. Etiquetado: distincin que se hace a los vrtices y/o aristas mediante una marca que los hace unvocamente distinguibles del resto.

Ejemplo

Grafo etiquetado con 6 vrtices y 7 aristas.

La imagen es una representacin del siguiente grafo: V:={1,2,3,4,5,6} E:={{1,2},{1,5},{2,3},{2,5},{3,4},{4,5},{4,6}} El hecho que el vrtice 1 sea adyacente con el vrtice 2 puede ser denotado como 1 ~ 2. En la Teora de las categoras una categora puede ser considerada como un multigrafo dirigido, con los objetos como vrtices y los morfismos como aristas dirigidas. En ciencias de la computacin los grafos dirigidos son usados para representar mquinas de estado finito y algunas otras estructuras discretas. Una relacin binaria R en un conjunto X es un grafo dirigido simple. Dos vrtices a, b en X estn conectados por una arista dirigida ab si aRb.

Estructura de Datos

79

UCENM

Estructuras de datos en la representacin de grafos


Existen diferentes formas de almacenar grafos en una computadora. La estructura de datos usada depende de las caractersticas del grafo y el algoritmo usado para manipularlo. Tericamente se pueden distinguir las estructuras de listas y las de matrices, pero usualmente, lo mejor es una combinacin de ambas. Las listas son preferidas en grafos dispersos porque tienen un eficiente uso de la memoria. Por otro lado, las matrices proveen acceso rpido, pero pueden consumir grandes cantidades de memoria.

Estructura de lista
lista de incidencia: Las aristas son representadas con un vector de pares (ordenados, si el grafo es dirigido) de vrtices que conecta esa arista. lista de adyacencia: Cada vrtice tiene una lista de vrtices los cuales son adyacentes a l. Esto causa redundancia en un grafo no dirigido (ya que A existe en la lista de adyacencia de B y viceversa), pero las bsquedas son ms rpidas, al costo de almacenamiento extra.

Estructuras matriciales
Matriz de incidencia: El grafo est representado por una matriz de A (aristas) por V (vrtices), donde [arista, vrtice] contiene la informacin de la arista (1 - conectado, 0 no conectado) Matriz de adyacencia: El grafo est representado por una matriz cuadrada M de tamao n, donde n es el nmero de vrtices. Si hay una arista entre un vrtice x y un vrtice y, entonces el elemento mx,y es 1, de lo contrario, es 0.

Vrtice
Un vrtice es la unidad fundamental de la que estn formados los grafos. Los vrtices son tratados como un objeto indivisible y sin propiedades, aunque puedan tener una estructura adicional dependiendo de la aplicacin por la cual se usa el grafo; por ejemplo, una red semntica es un grafo en donde los vrtices representan conceptos o clases de objetos.

Estructura de Datos

80

UCENM

En la figura, V = { a, b, c, d, e, f }, y A = { ab, ac, ae, bc, bd, df, ef }. Un grafo es una pareja de conjuntos G = (V,A), donde V es el conjunto de vrtices, y A es el conjunto de aristas, este ltimo es un conjunto de subconjuntos de la forma (u,v) tal que , tal que . Para simplificar, notaremos la arista {a,b} como ab.

En teora de grafos, slo queda lo esencial del dibujo: la forma de las aristas no son relevantes, slo importa a qu vrtices estn unidas. La posicin de los vrtices tampoco importa, y se puede variar para obtener un grafo ms claro. Generalmente, se considera que colocar los vrtices en forma de polgono regular da grafos muy legibles. Prcticamente cualquier red puede ser modelada con un grafo: una red de carreteras que conecta ciudades, una red elctrica o la red de drenaje de una ciudad.

Subgrafo
Un subgrafo de un grafo G es un grafo cuyos conjuntos de vrtices y aristas son subconjuntos de los de G. Se dice que un grafo G contiene a otro grafo H si algn subgrafo de G es H o es isomorfo a H (dependiendo de las necesidades de la situacin) El subgrafo inducido de G es un subgrafo G' de G tal que contiene todas las aristas adyacentes al subconjunto de vrtices de G. Aristas dirigidas y no dirigidas

En algunos casos es necesario asignar un sentido a las aristas, por ejemplo, si se quiere representar la red de las calles de una ciudad con sus inevitables direcciones nicas. El conjunto de aristas ser ahora un subconjunto de todos los posibles pares ordenados de Estructura de Datos 81 UCENM

vrtices, con (a, b) (b, a). Los grafos que contienen aristas dirigidas se denominan grafos orientados. Las aristas no orientadas se consideran bidireccionales para efectos prcticos (equivale a decir que existen dos aristas orientadas entre los nodos, cada una en un sentido). En el grafo anterior se ha utilizado una arista que tiene sus dos extremos idnticos: es un lazo (o bucle), y aparece tambin una arista bidireccional, y corresponde a dos aristas orientadas. Aqu V = { a, b, c, d, e }, y A = { (a, c), (d, a), (d, e), (a, e), (b, e), (c, a), (c, c), (d, b) }. Se considera la caracterstica de "grado" (positivo o negativo) de un vrtice v (y se indica como (v)), como la cantidad de aristas que llegan o salen de l; para el caso de grafos no orientados, el grado de un vrtice es simplemente la cantidad de aristas que tocan este vrtice. Por ejemplo, el grado positivo (salidas) de d es 3, mientras que el grado negativo (llegadas) de b es 1. A un vrtice del que slo salen aristas se le denomina fuente (en el ejemplo anterior, el vrtice d); tiene grado negativo 0. Por el contrario, a aquellos en los que slo entran aristas se les denomina pozo o sumidero (en el caso anterior, el vrtice e); tiene grado positivo 0.

Ciclos y caminos hamiltonianos

Ejemplo de un ciclo hamiltoniano.

Estructura de Datos

82

UCENM

Un ciclo es un camino, es decir una sucesin de aristas adyacentes, donde no se recorre dos veces la misma arista, y donde se regresa al punto inicial. Un ciclo hamiltoniano tiene adems que recorrer todos los vrtices exactamente una vez (excepto el vrtice del que parte y al cual llega). Por ejemplo, en un museo grande, lo idneo sera recorrer todas las salas una sola vez, esto es buscar un ciclo hamiltoniano en el grafo que representa el museo (los vrtices son las salas, y las aristas los corredores o puertas entre ellas). Se habla tambin de camino hamiltoniano si no se impone regresar al punto de partida, como en un museo con una nica puerta de entrada. Por ejemplo, un caballo puede recorrer todas las casillas de un tablero de ajedrez sin pasar dos veces por la misma: es un camino hamiltoniano. Ejemplo de un ciclo hamiltoniano en el grafo del dodecaedro.

Caracterizacin de grafos
Grafo nulo o vaco
Aquel que no tiene vrtices ni aristas. No hay un actual consenso sobre si deba seguir existiendo, ya que no cumple con muchas propiedades.

Grafos simples
Un grafo es simple si a lo sumo slo 1 arista une dos vrtices cualesquiera. Esto es equivalente a decir que una arista cualquiera es la nica que une dos vrtices especficos. Un grafo que no es simple se denomina complejo.

Grafo trivial
Aquel que tiene un vrtice y ninguna arista.

Grafos conexos
Un grafo es conexo si cada par de vrtices est conectado por un camino; es decir, si para cualquier par de vrtices (a, b), existe al menos un camino posible desde a hacia b.

Estructura de Datos

83

UCENM

Un grafo es fuertemente conexo si cada par de vrtices est conectado por al menos dos caminos disjuntos; es decir, es conexo y no existe un vrtice tal que al sacarlo el grafo resultante sea disconexo. En trminos matemticos la propiedad de un grafo de ser (fuertemente) conexo permite establecer en base a l una relacin de equivalencia para sus vrtices, la cual lleva a una particin de stos en "componentes (fuertemente) conexas", es decir, porciones del grafo, que son (fuertemente) conexas cuando se consideran como grafos aislados. Esta propiedad es importante para muchas demostraciones en teora de grafos.

Grafos completos
Un grafo simple es completo si existen aristas uniendo todos los pares posibles de vrtices. Es decir, todo par de vrtices (a, b) debe tener una arista e que los une. El conjunto de los grafos completos es denominado usualmente completo de n vrtices. , siendo el grafo

Un Kn, es decir, grafo completo de n vrtices tiene exactamente

aristas.

La representacin grfica de los Kn como los vrtices de un polgono regular da cuenta de su peculiar estructura.

Grafo bipartito completo


sea (W,X) una particin del conjunto de vrtices V, es aquel donde cada vrtice en W es adyacente slo a cada vrtice en X, y viceversa.

Estructura de Datos

84

UCENM

Grafos bipartitos
Un grafo G es bipartito si puede expresarse como (es decir, sus vrtices son la unin de dos grupos de vrtices), bajo las siguientes condiciones: V1 y V2 son disjuntos y no vacos. Cada arista de A une un vrtice de V1 con uno de V2. No existen aristas uniendo dos elementos de V1; anlogamente para V2. Bajo estas condiciones, el grafo se considera bipartito, y puede describirse informalmente como el grafo que une o relaciona dos conjuntos de elementos diferentes, como aquellos resultantes de los ejercicios y puzzles en los que debe unirse un elemento de la columna A con un elemento de la columna B. Operaciones en Grafos Subdivisin elemental de una arista Se convierte en Se reemplaza la arista por dos aristas y un vrtice w.

Despus de realizar esta operacin, el grafo queda con un vrtice y una arista ms. Remocin dbil de un vrtice Si y g(v) = 2 (Sea v un vrtice del grafo y de grado dos) removerlo dbilmente significa reemplazarlo por una arista que une los vrtices adyacentes a v. Se convierte en Entonces e' y e'' desaparecen y aparece

Homeomorfismos de grafos
Dos grafos G1 y G2 son homeomorfos si ambos pueden obtenerse a partir del mismo grafo con una sucesin de subdivisiones elementales de aristas.

Estructura de Datos

85

UCENM

Grafos ponderados
En muchos casos, es preciso atribuir a cada arista un nmero especfico, llamado valuacin, ponderacin o coste segn el contexto, y se obtiene as un grafo valuado. Formalmente, es un grafo con una funcin v: A R+. Por ejemplo, un representante comercial tiene que visitar n ciudades conectadas entre s por carreteras; su inters previsible ser minimizar la distancia recorrida (o el tiempo, si se pueden prever atascos). El grafo correspondiente tendr como vrtices las ciudades, como aristas las carreteras y la valuacin ser la distancia entre ellas. Y, de momento, no se conocen mtodos generales para hallar un ciclo de valuacin mnima, pero s para los caminos desde a hasta b, sin ms condicin.

Grafos planos

Un grafo es plano si se puede dibujar sin cruces de aristas. Cuando un grafo o multigrafo se puede dibujar en un plano sin que dos segmentos se corten, se dice que es plano. Un juego muy conocido es el siguiente: Se dibujan tres casas y tres pozos. Todos los vecinos de las casas tienen el derecho de utilizar los tres pozos. Como no se llevan bien en absoluto, no quieren cruzarse jams. Es posible trazar los nueve caminos que juntan las tres casas con los tres pozos sin que haya cruces? Cualquier disposicin de las casas, los pozos y los caminos implica la presencia de al menos un cruce. Sea Kn el grafo completo con n vrtices, Kn, p es el grafo bipartito de n y p vrtices. Estructura de Datos 86 UCENM

El juego anterior equivale a descubrir si el grafo bipartito completo K 3,3 es plano, es decir, si se puede dibujar en un plano sin que haya cruces, siendo la respuesta que no. En general, puede determinarse que un grafo no es plano, si en su diseo puede encontrase una estructura anloga (conocida como menor) a K5 o a K3,3. Establecer qu grafos son planos no es obvio, y es un problema tiene que ver con topologa. Dimetro

En la figura se nota que K4 es plano (desviando la arista ab al exterior del cuadrado), que K5 no lo es, y que K3,2 lo es tambin (desvos en gris). En un grafo, la distancia entre dos vrtices es el menor nmero de aristas de un recorrido entre ellos. El dimetro, en una figura como en un grafo, es la menor distancia entre dos puntos de la misma. El dimetro de los Kn es 1, y el de los Kn,p es 2. Un dimetro infinito puede significar que el grafo tiene una infinidad de vrtices o simplemente que no es conexo. Tambin se puede considerar el dimetro promedio, como el promedio de las distancias entre dos vrtices.. En el mundo real hay una analoga: tomando al azar dos seres humanos del mundo, En cuntos saltos se puede pasar de uno a otro, con la condicin de slo saltar de una persona a otra cuando ellas se conocen personalmente? Con esta definicin, se estima que el dimetro de la humanidad es de... ocho solamente! Este concepto refleja mejor la complejidad de una red que el nmero de sus elementos.

Estructura de Datos

87

UCENM

Teorema de los cuatro colores

En 1852 Francis Guthrie plante el problema de los cuatro colores. Otro problema famoso relativo a los grafos: Cuntos colores son necesarios para dibujar un mapa poltico, con la condicin obvia que dos pases adyacentes no puedan tener el mismo color? Se supone que los pases son de un solo pedazo, y que el mundo es esfrico o plano. Cuatro colores son siempre suficientes para colorear un mapa. La forma precisa de cada pas no importa; lo nico relevante es saber qu pas toca a qu otro. Estos datos estn incluidos en el grafo donde los vrtices son los pases y las aristas conectan los que justamente son adyacentes. Entonces la cuestin equivale a atribuir a cada vrtice un color distinto del de sus vecinos. Hemos visto que tres colores no son suficientes, y demostrar que con cinco siempre se llega, es bastante fcil. Pero el teorema de los cuatro colores no es nada obvio. Prueba de ello es que se han tenido que emplear ordenadores para acabar la demostracin.

Estructura de Datos

88

UCENM

Coloracin de grafos

Colores en los vrtices.


Definicin: Si G=(V,E) es un grafo no dirigido, una coloracin propia de G, ocurre cuando coloreamos los vrtices de G de modo que si {a, b} es una arista en G entonces a y b tienen diferentes colores. (Por lo tanto, los vrtices adyacentes tienen colores diferentes). El nmero mnimo de colores necesarios para una coloracin propia de G es el nmero cromtico de G y se escribe como C(G). Sea G un grafo no dirigido sea el nmero de colores disponibles para la coloracin propia de los vrtices de G. Nuestro objetivo es encontrar una funcin polinomial P(G,), en la variable , llamada polinomio cromtico de G , que nos indique el nmero de coloraciones propias diferentes de los vrtices de G, usando un mximo de colores. Descomposicin de polinomios cromticos. Si G=(V,E) es un grafo conexo y e pertenece a , entonces: P(Ge,)=P(G,)+P(Ge,) Para cualquier grafo G, el trmino constante en P(G,) es 0 Sea G=(V,E) con |E|>0 entonces, la suma de los coeficientes de P(G,) es 0. Sea G=(V,E), con a, b pertenecientes al conjunto de vrtices V pero {a, b}=e, no perteneciente a al conjunto de aristas E. Escribimos G+e para el grafo que se obtiene de G al aadir la arista e={a, b}. Al identificar los vrtices a y b en G, obtenemos el subgrafo G++e de G.

Estructura de Datos

89

UCENM

Listas de Adyacencia.
En esta estructura de datos la idea es asociar a cada vertice i del grafo una lista que contenga todos aquellos vrtices j que sean adyacentes a l. De esta forma sllo reservar memoria para los arcos adyacentes a i y no para todos los posibles arcos que pudieran tener como origen i. El grafo, por tanto, se representa por medio de un vector de n componentes (si |V|=n) donde cada componente va a ser una lista de adyacencia correspondiente a cada uno de los vertices del grafo. Cada elemento de la lista consta de un campo indicando el vrtice adyacente. En caso de que el grafo sea etiquetado, habr que aadir un segundo campo para mostrar el valor de la etiqueta.

Estructura de Datos

90

UCENM

Esta representacin requiere un espacio proporcional a la suma del nmero de vrtices, ms el numero de arcos, y se suele usar cuando el nmero de arcos es mucho menor que el nmero de arcos de un grafo completo. Una desventaja es que puede llevar un tiempo O(n) determinar si existe un arco del vrtice i al vrtice j, ya que puede haber n vertices en la lista de adyacencia asociada al vrtice i. Mediante el uso del vector de listas de adyacencias slo se reserva memoria para los arcos existentes en el grafo con el consiguiente ahorro de la misma. Sin embargo, no permite que haya vrtices que puedan ser aadidos o suprimidos del grafo, debido a que la dimensin del grafo debe ser predeterminada y fija. Para solucionar esto se puede usar una lista de listas de adyacencia. Slo los vrtices del grafo que sean origen de algn arco aparecern en la lista. De esta forma se pueden aadir y suprimir arcos sin desperdicio de memoria ya que simplemente habr que modificar la lista de listas para reflejar los cambios.

Estructura de Datos

91

UCENM

Como puede verse en el ejemplo de las figuras anteriores tanto el vector de listas de adyacencias como en la lista de listas se ha razonado en funcin de los vrtices que actan como orgenes de los arcos. Anlogamente se poda haber hecho con lod vertices destino, y combinando ambas representaciones podra pensarse en utilizar dos vectores de listas de adyacencia o dos listas de listas de adyacencia.

Representacin Propuesta.
La eleccin de una estructura idnea para representar el TDA grafo no es una tarea fcil ya que existen dos representaciones totalmente contrapuestas: por un lado tenemos la matriz de adyacencias que es muy eficiente para comprobar si existe una arista uniendo dos vertices sin embargo desperdicia una gran cantidad de espacio si el grafo no es completo o esta lejos de serlo, adems no tiene la posibilidad de aadir nuevos vrtices; y por otra parte est la lista de adyacencias que no tiene el problema de la anterior respecto al espacio pero que sin embargo no es tan eficiente a la hora de ver si existe una arista entre dos nodos determinados.

Estructura de Datos

92

UCENM

Teniendo en cuenta estas consideraciones se ha optado por realizar una mezcla de ambas representaciones intentando aprovechar de alguna forma las ventajas que ambas poseen. Por otra parte siguiendo con la idea de tratar tanto los grafos dirigidos como los no dirigidos bajo una misma estructura, la estructura elegida posee dos apariencias ligeramente diferentes para tratar de forma adecuada cada uno de estos dos tipos de grafos. La estructura consiste (en el caso de que tengamos un grafo dirigido en una lista de vrtices donde cada uno de estos posee dos listas, una de aristas incidentes a l y otra de adyacentes. Cada vez que se aade una arista al grafo se inserta en la lista de aristas adyacentes del vertice origen y en la de incidentes del vrtice destino. De esta forma la estructura desplegada se asemejara a una matriz de adyacencia en la cual hay una arista por cada 1 y el ndice de la matriz es la posicin dentro de la lista de vertices. Grficamente la estructura para un grafo dirigido queda como se puede apreciar en la siguiente figura. El puntero que de la estructura arco que apunta al destino se ha sustituido por la etiqueta del nodo destino en el grafico para simplificarlo y hacerlo mas claro.

Estructura de Datos

93

UCENM

Esta estructura no seria la ms idonea si trabajamos con solo con grafos no dirigidos ya que por cada arista no dirigida tendramos que insertar en la estructura una misma arista dirigida repetida dos veces (una con un vrtice como origen y el otro como destino y al contrario). En

Estructura de Datos

94

UCENM

muchos problemas si asumimos el desperdicio de espacio podra, de todas formas, resultar interesante representar un grafo no dirigido como un grafo dirigido simtrico, el problema se presenta cuando al tener dos aristas dirigidas esto supone la presencia de un ciclo en el grafo que realmente no existe. Teniendo en cuenta el razonamiento anterior, en el caso de que queramos manejar grafos no dirigido la estructura consistira en tener una lista de adyacencia para cada uno de los vertices pero tratando aquellas aristas que aparecen en la lista de adyacencia de dos vertices distintos y que unen ambos vrtices como una nica arista lgica (a estas dos aristas que forman una misma arista lgica las llamaremos aristas gemelas).

Conclusin:
Gracias a la teora de grafos se pueden resolver diversos problemas como por ejemplo la sntesis de circuitos secuenciales, contadores o sistemas de apertura. Los grafos se utilizan tambin para modelar trayectos como el de una lnea de autobs a travs de las calles de una ciudad, en el que podemos obtener caminos ptimos para el trayecto aplicando diversos algoritmos como puede ser el algoritmo de Floyd. La teora de grafos tambin ha servido de inspiracin para las ciencias sociales, en especial para desarrollar un concepto no metafrico de red socia que sustituye los nodos por los actores sociales y verifica la posicin, centralidad e importancia de cada actor dentro de la red. Esta medida permite cuantificar y abstraer relaciones complejas, de manera que la estructura social puede representarse grficamente. Por ejemplo, una red socia puede representar la estructura de poder dentro de una sociedad al identificar los vnculos (aristas), su direccin e intensidad y da idea de la manera en que el poder se transmite y a quines.

Algunas definiciones bsicas en grafos


Orden de un grafo: es el nmero de nodos (vrtices) del grafo. Grado de un nodo: es el nmero de ejes (arcos) que inciden sobre el nodo Grafo simtrico: es un grafo dirigido tal que si existe la relacin entonces existe , con u, v pertenecientes a V. Grafo no simtrico: es un grafo que no cumple la propiedad anterior. Grafo reflexivo: es el grafo que cumple que para todo nodo u de V existe la relacin (u, u) de A. Grafo transitivo: es aqul que cumple que si existen las relaciones (u, v) y (v, z) de A entonces existe (u, z) de A. Grafo completo: es el grafo que contiene todos los posibles pares de relaciones, es decir, para cualquier par de nodos u, v de V, (u <> v), existe (u, v) de A. Camino: un camino en el grafo G es una sucesin de vrtices y arcos: v(0), a(1), v(1), a(2), v(2), ... , a(k), v(k); tal que los extremos del arco a(i) son los vrtices v(i-1) y v(i).

Estructura de Datos

95

UCENM

Longitud de un camino: es el nmero de arcos que componen el camino. Camino cerrado (circuito): camino en el que coinciden los vrtices extremos (v(0) = v(k)). Camino simple: camino donde sus vrtices son distintos dos a dos, salvo a lo sumo los extremos. Camino elemental: camino donde sus arcos son distintos dos a dos. Camino euleriano: camino simple que contiene todos los arcos del grafo. Grafo euleriano: es un grafo que tiene un camino euleriano cerrado. Grafo conexo: es un grafo no dirigido tal que para cualquier par de nodos existe al menos un camino que los une. Grafo fuertemente conexo: es un grafo dirigido tal que para cualquier par de nodos existe un camino que los une. Punto de articulacin: es un nodo que si desaparece provoca que se cree un grafo no conexo. Componente conexa: subgrafo conexo mximas de un grafo no dirigido (parte ms grande de un grafo que sea conexa).

Estructura de Datos

96

UCENM

Ejemplos de grafos:

Estructura de Datos

97

UCENM

Grafo dirigido

Estructura de Datos

98

UCENM

Ejercicios:
G1 = (V1, A1) V1 = {1, 2, 3, 4} A1 = {(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)}

G2 = (V2, A2) V2 = {1, 2, 3, 4, 5, 6} A2 = {(1, 2), (1, 3), (2, 4), (2, 5), (3, 6)}

Estructura de Datos

99

UCENM

G3 = (V3, A3) V3 = {1, 2, 3} A3 = {<1, 2>, <2, 1>, <2, 3>}

Capitulo V

Mtodos de Clasificacin (Ordenamiento)


Un mtodo de ordenamiento consiste en un algoritmo que recibe como entrada a un conjunto de datos que son necesarios de ordenar segn cierto(s) criterio(s). El objetivo fundamental de stos mtodos es el de facilitar la bsqueda de datos segn estos mismos criterios.

Qu es ordenamiento?
Es la operacin de arreglar los registros de una tabla en algn orden secuencial de acuerdo a un criterio de ordenamiento. El ordenamiento se efecta con base en el valor de algn campo en un registro. El propsito principal de un ordenamiento es el de facilitar las bsquedas de los miembros del conjunto ordenado. Estructura de Datos 100 UCENM

Ej. de ordenamientos: Dir. telefnico, tablas de contenido, bibliotecas y diccionarios, etc. El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numrico, alfabtico o incluso alfanumrico, ascendente o descendente. Cundo conviene usar un mtodo de ordenamiento? Cuando se requiere hacer una cantidad considerable de bsquedas y es importante el factor tiempo.

Clasificacin de Mtodos
Segn lugar fsico donde residen los datos Ordenamiento Interno: Es aquel que ocurre sobre estructuras de datos residentes en memoria principal. Entre otros se tiene al de Insercin directa, Seleccin directa. Ordenamiento Externo: Es aquel que ocurre sobre estructuras de datos residentes en memoria secundaria. Entre otros se tiene al mtodo de Intercalacin, Mezcla directa, Mezcla Equilibrada.

Segn movimientos de claves de ordenamiento Ordenamiento Estable: Es aquel que una vez efectuado mantiene el orden relativo de dos o ms registros cuyo criterio de ordenamiento es el mismo. Es beneficioso para ordenamientos en donde se utilice ms de un criterio de ordenamiento. Ordenamiento No estable: Es aquel que una vez efectuado pierde el orden relativo de dos o ms registros cuyo criterio de ordenamiento es el mismo.

Estructura de Datos

101

UCENM

Comparacin de los Mtodos de Ordenamiento


Una alternativa sera comparar tiempos de ejecucin, sin embargo, esto slo sera una medida de eficiencia sobre un computador en particular. (dependiendo la arquitectura de la mquina, set de instrucciones etc.). Mayor validez tendra aislar la operacin bsica realizada en el algoritmo y determinar el n de veces que se realiza. Por ejemplo, si estuviramos sumandos los elementos de un arreglo podramos contabilizar el n de operaciones realizadas para un arreglo de tamao n, as como en este caso el nmero de operaciones realizadas es funcin del nmero de elementos del arreglo. Usualmente se utiliza la notacin O( ) para indicar el grado u orden del algoritmo que est dado en trminos de comparaciones realizadas. Esto representa cuantitativamente la complejidad de un algoritmo. Las complejidades ms usuales son O(n), O(n2), O(n3), O(log2n). Para que se entienda mejor: O(n): Llenar un arreglo lineal O(n2):Llenar un arreglo bidimensional O(n3):Llenar un arreglo Tridimensional O(log2n):Recorrer un rbol binario de bsqueda

Bsqueda Secuencial
Comenzando desde el inicio de la lista se busca registro a registro (elemento a elemento) hasta encontrar el elemento buscado o en su defecto terminar de revisar toda la estructura. Este tipo de bsqueda es aplicable a listas secuenciales(arreglos) y listas enlazadas. El siguiente algoritmo realiza la bsqueda de un campo clave sobre un arreglo de registros.

Procedure Busqueda_Secuencial(Lista: Tipo_array;Numelementos: integer; Valclave: Tipo_clave; var posicin: integer); Var ndice: integer; Encontrado: boolean; Begin Indice:=1; Encontrado:= FALSE;

Estructura de Datos

102

UCENM

While NOT ENCONTRADO AND indice <= Numelementos do begin if lista[indice].clave = valclave then ENCONTRADO:= TRUE else indice:=indice+1; end; if ENCONTRADO then Posicion :=indice else posicion:=0; end;

Consideraciones En el peor de los casos, deberamos buscar en el ltimo registro de la lista o sobre uno no existente. O(N) En promedio, si supusiramos igual probabilidad de bsqueda para cualquier item, se haran N/2 comparaciones (mitad de la lista) Si la lista estuviese ordenada (en base al campo clave) la eficiencia del algoritmo anterior se vera mejorada ya que detendramos nuestra bsqueda cuando se haya sobrepasado su posicin lgica dentro de la lista.

Algoritmos de ordenamiento:
Internos: Insercin directa. o Insercin directa. o Insercin binaria. Seleccin directa. o Seleccin directa. Intercambio directo. o Burbuja. o Shake. Insercin disminucin incremental. o Shell. Ordenamiento de rbol. o Heap. o Tournament. Sort particionado. o Quick sort. Merge sort. Radix sort. Clculo de direccin. Externos: Estructura de Datos 103 UCENM

Straight merging. Natural merging. Balanced multiway merging. Polyphase sort. Distribution of initial runs.

Clasificacin de los algoritmos de ordenamiento de informacin:


El hecho de que la informacin est ordenada, nos sirve para poder encontrarla y accesarla de manera ms eficiente ya que de lo contrario se tendra que hacer de manera secuencial. A continuacin se describirn 4 grupos de algoritmos para ordenar informacin:

Algoritmos de insercin:
En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la vez. Cada elemento es INSERTADO en la posicin apropiada con respecto al resto de los elementos ya ordenados. Entre estos algoritmos se encuentran el de INSERCION DIRECTA, SHELL SORT, INSERCION BINARIA y HASHING.

Algoritmos de intercambio:
En este tipo de algoritmos se toman los elementos de dos en dos, se comparan y se INTERCAMBIAN si no estn en el orden adecuado. Este proceso se repite hasta que se ha analizado todo el conjunto de elementos y ya no hay intercambios. Entre estos algoritmos se encuentran el BURBUJA y QUICK SORT.

Algoritmos de seleccin:
En este tipo de algoritmos se SELECCIONA o se busca el elemento ms pequeo (o ms grande) de todo el conjunto de elementos y se coloca en su posicin adecuada. Este proceso se repite para el resto de los elementos hasta que todos son analizados. Entre estos algoritmos se encuentra el de SELECCION DIRECTA.

Algoritmos de enumeracin:
En este tipo de algoritmos cada elemento es comparado contra los dems. En la comparacin se cuenta cuntos elementos son ms pequeos que el elemento que se est

Estructura de Datos

104

UCENM

analizando, generando as una ENUMERACION. El nmero generado para cada elemento indicar su posicin. Los mtodos simples son: Insercin (o por insercin directa), seleccin, burbuja y shell, en dnde el ltimo es una extensin al mtodo de insercin, siendo ms rpido. Los mtodos ms complejos son el quick-sort (ordenacin rpida) y el heap sort. A continuacin se mostrarn los mtodos de ordenamiento ms simples.

Mtodo de Insercin.
Este mtodo toma cada elemento del arreglo para ser ordenado y lo compara con los que se encuentran en posiciones anteriores a la de l dentro del arreglo. Si resulta que el elemento con el que se est comparando es mayor que el elemento a ordenar, se recorre hacia la siguiente posicin superior. Si por el contrario, resulta que el elemento con el que se est comparando es menor que el elemento a ordenar, se detiene el proceso de comparacin pues se encontr que el elemento ya est ordenado y se coloca en su posicin (que es la siguiente a la del ltimo nmero con el que se compar).

Procedimiento Insertion Sort


Este procedimiento recibe el arreglo de datos a ordenar a[] y altera las posiciones de sus elementos hasta dejarlos ordenados de menor a mayor. N representa el nmero de elementos que contiene a[]. paso 1: [Para cada pos. del arreglo] paso 2: [Inicializa v y j] paso 3: [Compara v con los anteriores] paso 4: [Recorre los datos mayores] paso 5: [Decrementa j] paso 5: [Inserta v en su posicin] paso 6: [Fin] For i <- 2 to N do v <- a[i] j <- i. While a[j-1] > v AND j>1 do Set a[j] <- a[j-1], set j <- j-1. Set a[j] <- v. End.

Ejemplo: Si el arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e'], el algoritmo va a recorrer el arreglo de izquierda a derecha. Primero toma el segundo dato 's' y lo asigna a v y i toma el valor de la posicin actual de v.

Estructura de Datos

105

UCENM

Luego compara esta 's' con lo que hay en la posicin j-1, es decir, con 'a'. Debido a que 's' no es menor que 'a' no sucede nada y avanza i. Ahora v toma el valor 'o' y lo compara con 's', como es menor recorre a la 's' a la posicin de la 'o'; decrementa j, la cual ahora tiene la posicin en dnde estaba la 's'; compara a 'o' con a[j-1] , es decir, con 'a'. Como no es menor que la 'a' sale del for y pone la 'o' en la posicin a[j]. El resultado hasta este punto es el arreglo siguiente: a = ['a','o','s','r',....] As se contina y el resultado final es el arreglo ordenado : a = ['a','a','e','e','g','i','l','m','n','o','p','r','s','t','x']

MTODO DE SELECCIN.
El mtodo de ordenamiento por seleccin consiste en encontrar el menor de todos los elementos del arreglo e intercambiarlo con el que est en la primera posicin. Luego el segundo mas pequeo, y as sucesivamente hasta ordenar todo el arreglo.

Procedimiento Selection Sort


paso 1: [Para cada pos. del arreglo] paso 2: [Inicializa la pos. del menor] paso 3: [Recorre todo el arreglo] paso 4: [Si a[j] es menor] paso 5: [Reasigna el apuntador al menor] paso 6: [Intercambia los datos de la pos. min y posicin i] paso 7: [Fin] For i <- 1 to N do menor <- i For j <- i+1 to N do If a[j] < a[menor] then min = j Swap(a, min, j). End.

Ejemplo: El arreglo a ordenar es a = ['a','s','o','r','t','i','n','g','e','x','a','m','p','l','e']. Se empieza por recorrer el arreglo hasta encontrar el menor elemento. En este caso el menor elemento es la primera 'a'. De manera que no ocurre ningn cambio. Luego se procede a buscar el siguiente elemento y se encuentra la segunda 'a'. Esta se intercambia con el dato que est en la segunda posicin, la 's', quedando el arreglo as despus de dos recorridos: a = ['a','a','o','r','t','i','n','g','e','x','s','m','p','l','e'].

Estructura de Datos

106

UCENM

El siguiente elemento, el tercero en orden de menor mayor es la primera 'e', la cual se intercambia con lo que est en la tercera posicin, o sea, la 'o'. Le sigue la segunda 's', la cual es intercambiada con la 'r'. El arreglo ahora se ve de la siguiente manera: a = ['a','a','e','e','t','i','n','g','o','x','s','m','p','l','r']. De esta manera se va buscando el elemento que debe ir en la siguiente posicin hasta ordenar todo el arreglo. El nmero de comparaciones que realiza este algoritmo es : Para el primer elemento se comparan n-1 datos, en general para el elemento i-simo se hacen n-i comparaciones, por lo tanto, el total de comparaciones es: la sumatoria para i de 1 a n-1 (n-i) = 1/2 n (n-1).

MTODO BURBUJA.
El bubble sort, tambin conocido como ordenamiento burbuja, funciona de la siguiente manera: Se recorre el arreglo intercambiando los elementos adyacentes que estn desordenados. Se recorre el arreglo tantas veces hasta que ya no haya cambios. Prcticamente lo que hace es tomar el elemento mayor y lo va recorriendo de posicin en posicin hasta ponerlo en su lugar.

Procedimiento Bubble Sort


paso 1: [Inicializa i al final de arreglo] For i <- N down to 1 do paso 2: [Inicia desde la segunda pos.] For j <- 2 to i do paso 4: [Si a[j-1] es mayor que el que le sigue] If a[j-1] < a[j] then paso 5: [Los intercambia] Swap(a, j-1, j). paso 7: [Fin] End.

Tiempo de ejecucin del algoritmo burbuja: Para el mejor caso (un paso) O(n) Peor caso n(n-1)/2 Promedio O(n2)

Estructura de Datos

107

UCENM

MTODO DE SHELL.
Ordenamiento de disminucin incremental. Nombrado as debido a su inventor Donald Shell. Ordena subgrupos de elementos separados K unidades (respecto de su posicin en el arreglo) del arreglo original. El valor K es llamado incremento. Despus de que los primeros K subgrupos han sido ordenados (generalmente utilizando INSERCION DIRECTA), se escoge un nuevo valor de K ms pequeo, y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor ms pequeo de K. Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo consiste de todo el arreglo ya casi ordenado. Al principio del proceso se escoge la secuencia de decrecimiento de incrementos; el ltimo valor debe ser 1. "Es como hacer un ordenamiento de burbuja pero comparando e intercambiando elementos." Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del subgrupo y se aplica insercin directa. El mtodo se basa en tomar como salto N/2 (siendo N el nmero de elementos) y luego se va reduciendo a la mitad en cada repeticin hasta que el salto o distancia vale 1.

Procedimiento Shell Sort;


const MAXINC = _____; incrementos = array[1..MAXINC] of integer; var j,p,num,incre,k:integer; begin for incre := 1 to MAXINC do begin /* para cada uno de los incrementos */

Estructura de Datos

108

UCENM

k := inc[incre];

/* k recibe un tipo de incremento */

for p := k+1 to MAXREG do begin /* insercin directa para el grupo que se encuentra cada K posiciones */ num := reg[p]; j := p-k; while (j>0) AND (num < reg[j]) begin reg[j+k] := reg[j]; j := j - k; end; reg[j+k] := num; end end end; Ejemplo: Para el arreglo a = [6, 1, 5, 2, 3, 4, 0] Tenemos el siguiente recorrido: Intercambio Recorrido 1 2 3 4 5 Salto 3 3 3 1 1 Lista Ordenada 2,1,4,0,3,5,6 0,1,4,2,3,5,6 0,1,4,2,3,5,6 0,1,2,3,4,5,6 0,1,2,3,4,5,6 (6,2), (5,4), (6,0) (2,0) Ninguno (4,2), (4,3) Ninguno

Estructura de Datos

109

UCENM

ARCHIVOS
Definicin y Componentes
Es una es estructura de datos que reside en memoria secundaria o almacenamiento permanente (cinta magntica, disco magntico, disco ptico, disco lser, etc.). La forma de clasificacin ms bsica se realiza de acuerdo al formato en que residen estos archivos, de esta forma hablamos de archivos ASCII (de texto) y archivos binarios.

Definicin archivo binario:


Estructura de datos permanente compuesto por registros (filas) y stos a su vez por campos (columnas). Se caracteriza por tener un tipo de dato asociado, el cual define su estructura interna.

Definicin archivo texto:


Estructura de datos permanente no estructurado formado por una secuencia de caracteres ASCII.

Tipos de Acceso a los Archivos


Secuencial
Se accesan uno a uno los registros desde el primero hasta el ltimo o hasta aquel que cumpla con cierta condicin de bsqueda. Se permite sobre archivos de Organizacin secuencial y Secuencial Indexada.

Random
Se accesan en primera instancia la tabla de ndices de manera de recuperar la direccin de inicio de bloque en donde se encuentra el registro buscado. Se permite para archivos con Organizacin Sec.Indexada.

Dinmico
Se accesan en primera instancia la tabla de ndices de manera de recuperar la direccin de inicio de bloque en donde se encuentra el registro buscado. Se permite para archivos con Organizacin Sec.Indexada.

Estructura de Datos

110

UCENM

Directo
Es aquel que utiliza la funcin de Hashing para recuperar los registros. Slo se permite para archivos con Organizacin Relativa.

Clasificacin de los Archivos Segn su Uso


La siguiente tabla resume las distintas denominaciones dadas a los archivos segn la utilizacin dada: Tipo Maestros Definicin Ejemplo Perduran durante todo el Archivo de ciclo de vida de los empleados en un sistemas. sistema de Remuneraciones. Transaccionales Se utilizan para actualizar Archivo de ventas otros archivos. Pueden ser diarias en un eliminados al trmino de sistema de ventas. este proceso o conservados como respaldos. De respaldo Son copias de seguridad de otros archivos De paso Son creados y eliminados entro de un proceso computacional. Histricos Registran acontecimientos Registros de a travs del tiempo. movimientos diarios de CC en un Sistema Bancario de CC. De referencia Corresponden a los Registro % archivos de consultas de imposiciones % parmetros. descuentos isapre, etc. Informes o Son respuestas del Planillas de Reportes sistema computacional sueldos en un cuyos contenidos deben sistema de ser interpretados por Remuneraciones. personas. Pueden ser en forma escrita, por pantalla e incluso hacia algn archivo con formato editable.

Estructura de Datos

111

UCENM

Organizaciones Bsicas de Archivos


Secuencial
Es la organizacin ms comn. Los registros se almacenan uno tras otro por orden de llegada. Para acceder un registro determinado se deben leer todos los registros que estn almacenados antes que l. Se recomienda: para archivos de procesamiento batch (aquellos para los cuales se debe realizar la misma operacin sobre la mayor parte de sus registros)

Secuencial Indexada
Los registros son almacenados en una distribucin tal que permiten ser consultados a travs de ndices. En ellos se distinguen 3 reas de almacenamiento: De ndices: Mecanismo de acceso a los registros de datos. Primaria o de datos: En donde se encuentran los datos propiamente tal. De overflow: Encargada de recibir aquellos registros que no pueden ser almacenados en el rea primaria. Se recomienda : Para archivos de consulta

Relativa
Existe una relacin directa entre la ubicacin lgica de un registro y su ubicacin fsica. Para ello necesita una funcin matemtica que asigne a un valor de clave una direccin fsica nica. El encontrar una Fh ptima es tarea compleja por lo que esta organizacin es poco utilizada. Se recomienda: Para archivos en donde sea crucial minimizar tiempos de acceso.

Operaciones Bsicas de Archivos


Consiste ordenar el archivo a partir de uno o ms criterios impuestos sobre sus campos. Es normal que los archivos estn ordenados por clave o por algn campo alfabtico ascendente o descendentemente

Estructura de Datos

112

UCENM

Concatenacin
Consiste en unir 2 ms archivos en uno (uno a continuacin del otro). Antes de...

Despus de...

Intercalacin
Consiste en generar un archivo ordenado segn algn criterio preestablecido a partir de dos ms archivos que pueden o no encontrarse en la misma secuencia.

Estructura de Datos

113

UCENM

Antes de...

Despus de...

Pareamiento
Consiste en ubicar registros correspondientes entre 2 ms archivos. Consiste en ubicar aquellos pares de registros pertenecientes a dos archivos diferentes que cumplen una cierta relacin de correspondencia.

Edicin
Consiste en preparar los datos que constituyen a uno ms archivos para que sean interpretados por personas. Se asocia generalmente a la generacin de listados en papel impreso.

Estructura de Datos

114

UCENM

Validacin
Consiste en asegurar la veracidad e integridad de los datos que ingresan a un archivo. Existen numerosas tcnicas de validacin tales como: Dgito verificador, chequeo de tipo, chequeo de rango.

Actualizacin
Consiste en agregar y eliminar registros desde un archivo, as como tambin modificar el valor de uno ms campos. Tambin se conoce como mantenimiento de uno o ms archivos.

Bases de Datos
Una base de datos es un conjunto de archivos o tablas relacionadas almacenados en forma estructurada. Est formada adems por consultas e ndices. Existen ciertos enfoques para el diseo de BD: Relacional, Jerrquica y de Red. Las aplicaciones que permiten administrar una base de datos se denominan DBMS (Data Base Manager System), entre ellos podemos citar a: Access, SQL Server, ORACLE Server etc. Estas ultimas se conocen tambin como RDBMS (Relational Data Base Manager System) ya que siguen el enfoque relacional. En empresas de gran envergadura, se habla de Base de Datos Corporativa conformada por mltiples modelos de bases de datos pertenecientes a distintas instancias e interrelacionados entre s. En general, el diseo de las bases de datos se rige segn ciertas normas, algunas creadas por E. Codd permiten evitar redundancias, e inconsistencias como consecuencia del proceso de actualizacin. Estas reglas son las denominadas FORMAS NORMALES. Ejemplo: Esquema fsico relacional

P: Primary Key F: Foreing Key

Estructura de Datos

115

UCENM

Notar que existe una relacin entre las tablas reparacin y producto representada la tabla relacin prod_reparpor, debido a que en una reparacin se pueden utilizar varios productos como insumos y stos a su vez pueden participar en ms de una reparacin.

Formas Normales
Las formas normales definidas en la teora de bases de datos relacionales representan lineamientos para el diseo de registros. Las reglas de normalizacin estn dirigidas a la prevencin de anomalas de actualizacin y de inconsistencias en los datos. Ellas no reflejan ninguna consideracin de rendimiento. En cierta forma, pueden ser visualizadas como orientadas por el supuesto de que todos los campos no-clave sern actualizados frecuentemente. No hay obligacin de normalizar completamente todas las relaciones cuando se deben considerar aspectos de rendimiento (tiempo de acceso por consulta). Finalmente, podemos decir que estas formas normales tambin son aplicables al diseo de archivos tradicionales con clave, con lo que abarcaramos todos los sistemas. Aqu enunciamos las 2 primeras formas normales:

Primera forma normal


Bajo la primera formal normal, todas las ocurrencias de un registro deben contener el mismo nmero de campos. La primera forma normal excluye campos de repeticin variable. Ejemplo: Archivo = LIBROS Registro = Reg_libros Cod_lib Nom_lib Autor Num_cop Materia Idioma Precio

Este registro transgrede la primera forma normal, debido a que pueden existir varios autores para un mismo libro (igual sucede con el campo materia). Una solucin a este problema separa los campos "conflictivos", agrupndolos en otras tablas:

Cod_lib

Nom_lib

Num_cop

Materia

Idioma

Precio

Cod_lib

Autor

Estructura de Datos

116

UCENM

Segunda forma normal


Todo campo no clave debe depender directamente del campo clave. Ejemplo:

Articulo

Bodega

Cantidad

Direc_bod

La clave est compuesta de 2 campos ARTICULO y BODEGA, sin embargo, DIRECCIONBODEGA, est relacionado exclusivamente con BODEGA. Los problemas bsicos de diseo son: La direccin de la bodega se repite en cada registro para cada parte almacenada en esa bodega (redundancia).Si la direccin de la bodega cambia, cada registro que se refiera a una parte almacenada en esa bodega debe ser actualizado. Debido a la redundancia, los datos pueden llegar a ser inconsistentes, con diferentes registros indicando diferentes direcciones para la misma bodega (integridad). Si en algn momento no hubiera partes almacenadas en alguna bodega, no habra un registro para anotar la direccin de la bodega (anomala).

Estructura de Datos

117

UCENM

Glosario
A ASCII "Cdigo Americano de Normalizacin para el Intercambio de Informacin". Un sistema de codificacin para convertir caracteres del teclado e instrucciones en el cdigo de nmero binario, el que entiende el computador. B BIBLIOTECA Es el archivo que contiene las funciones estndares que se pueden usar en los programas. Estas funciones incluyen todas las operaciones de entrada/salida (E/S), manejo de pantalla en modo texto o modo grfico as como otras rutinas tiles. BIT La porcin ms pequea de informacin "representable" en un computador. Es un 0 1. Mediante el lenguaje de los computadores se interpretan series de 1 y 0's para formar smbolos, signos de puntuacin, caracteres y nmeros. BYTE Corresponde a un set de 8 bits que representa un carcter de dato. Es la unidad ms pequea "referenciable" en un computador.

C CACH Una porcin de memoria en donde se ubica la informacin utilizada con mayor frecuencia para permitir un acceso ms rpido. CASE "Computer Aided Software Design". Herramienta Computacional que apoya a alguna de las fases del desarrollo del Sw CDIGO FUENTE Es el texto que un usuario puede leer. Normalmente considerado como el programa.

Estructura de Datos

118

UCENM

CDIGO OBJETO Es la traduccin del cdigo fuente de un programa a cdigo mquina, que es el que la Computadora puede leer y ejecutar directamente. El Cdigo Objeto es la entrada al enlazador. CUADRO DE DILOGO Ventana que aparece y requiere entrada de datos por parte del usuario (las ms bsicas muestran slo un mensaje). Cuando el usuario completa la informacin necesaria o hace clic en los botones correctos, el cuadro de dilogo desaparece. E EFICACIA Se dice que un proceso es eficaz, si capaz de cumplir sus objetivos. EFICIENCIA Se dice que un proceso es eficiente, si es eficaz y adems utiliza un mnimo de recursos. ENLAZADOR Es un programa que enlaza funciones compiladas por separado para producir un solo programa (Combina las funciones de biblioteca estndar con el cdigo que se ha escrito). La salida del Enlazador es un programa ejecutable. G GIGA BYTE (GB) 1024 x 1024 x 1024 bytes I IDENTIFICADOR Nombre asignado a una variable, procedimiento o funcin dentro del cdigo fuente. M MEGA BYTE (MB) 1024 x 1024 bytes.

Estructura de Datos

119

UCENM

O OOP (OBJECT ORIENTED PROGRAMMING) La programacin orientada a objetos es una modalidad de programacin usada para escribir programas como una coleccin de mdulos y objetos. En lugar de escribir los programas lnea por lnea, se escriben programas con mdulos prescritos. Los mdulos disimulan la complejidad del lenguaje de programacin y facilitan el proceso de copiar las instrucciones de un programa a otro. A pesar de que la programacin orientada a objetos es mucho ms sencilla de aprender y aplicar que otros lenguajes, es comn que estos programas sean un poco ms lentos, aunque con las rpidas computadoras de hoy, la diferencia en velocidad cada vez es menos notoria. p PORTABILIDAD [TRANSPORTABILIDAD]: Capacidad que tiene un programa o lenguaje para ser cambiado de plataforma con el mnimo nmero de modificaciones. Tiene relacin directa con la independencia que posee el lenguaje de la mquina. PROGRAMACIN MODULAR Los programas complejos se descomponen en mdulos (partes independientes), que estos a su vez se analizan, codifican y se verifican por separado. Su codificacin se realiza mediante programacin estructurada u orientada al objeto. PANEL DE CONTROL En plataforma Windows de Microsoft y en Macintosh, se refiere a una ventana en la cual se pueden hacer selecciones sobre ciertas caractersticas del ambiente en el que se trabaja. Por ejemplo, definir el color del fondo en la pantalla o la velocidad del cursor, as como elegir qu figuras queremos que aparezcan en el monitor mientras la computadora est prendida en los momentos en que no estamos trabajando. PATH Un mapa que le dice a su computadora dnde encontrar cierta informacin. Usando el sistema operativo DOS, usted puede utilizar esta instruccin para ejecutar un programa desde cualquier directorio sin necesidad de hallarse fsicamente en el directorio donde se encuentra el programa. PROGRAMAS DE UTILERIAS (Utilitarios) Son programas auxiliares que ayudan a manejar archivos, a obtener informacin acerca de la computadora, a diagnosticar o reparar fallas comunes, o bien a mantener el sistema

Estructura de Datos

120

UCENM

Operativo operando eficientemente. Los programas ms populares de este tipo son el PC Tools y el Norton Utilities. PROTOCOLO Normas y estndares para transferir informacin entre computadores conectados en red. PRUEBA ALFA El primer pas de prueba de verificacin para productos de cmputo antes de que stos sean lanzados al mercado. Normalmente, los fabricantes de equipo o bien los encargados de la mercadotecnia de los programas son los responsables de llevar a cabo estas pruebas. Ms adelante, se aplica la prueba beta en la cual ya participa un grupo seleccionado de usuarios. T TERA BYTE (TB) 1024 x 1024 x 1024 x 1024 bytes TIEMPO DE EJECUCIN Se refiere a lo que sucede mientras el programa se est ejecutando realmente. Normalmente, estos trminos aparecern cuando se consideren posibles errores, encontrndose como "Errores de tiempo de Compilacin" y "Errores de tiempo de ejecucin". TRADUCTOR Se refiere a un programa que se encarga de convertir lenguajes de un nivel superior a otro inferior. Segn el tipo de lenguaje se puede tratar de un traductor: Compilador o un traductor: intrprete.

Estructura de Datos

121

UCENM

BIBLIOGRAFA

Nombre del libro: Matemticas discretas y combinatoria. Autor: Ralph P. Grimaldi Editorial: Addison Wesley Longman

Sitios en Internet:
www.altavista.com www.elrincondelvago.com www.aulaclick.com www.monografias.com www.wikipedia.com

http://dgicii.mty.itesm.mx:8095/%7Empadilla/Estructura/abstrac.htm http://guiafe.com.ar/aedd/teoria.htm http://www.programmersheaven.com http://www.cc.ece.ntua.gr/%7Egkaval/applets/sortdemo.html

Estructura de Datos

122

UCENM

También podría gustarte