You are on page 1of 41

Estructura de Datos.

ANLISIS DE ALGORITMOS.
Unidad 1. Anlisis de Algoritmos. El Anlisis de algoritmos es una parte importante de una 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 cota superior asinttica, y la notacin omega y theta se usan con esa finalidad. Por ejemplo, la bsqueda binaria decimos que se ejecuta en una cantidad de pasos proporcional a un logaritmo, en O(log(n)), coloquialmente "en tiempo logartmico". Normalmente las estimaciones asintticas se utilizan porque diferentes implementaciones del mismo algoritmo no tienen por qu tener la misma eficiencia. No obstante la eficiencia de dos implementaciones "razonables" cuales quiera de un algoritmo dado est relacionada por una constante multiplicativa llamada constante oculta. 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. Por ejemplo, si al conjunto ordenado al que aplicamos una bsqueda binaria tiene n elementos, y podemos garantizar que una nica bsqueda binaria puede realizarse en un tiempo unitario, entonces se requieren como mucho log 2N + 1 unidades de tiempo para devolver una respuesta. Las medidas exactas de eficiencia son tiles para quienes verdaderamente implementan y usan algoritmos, porque tienen ms precisin y as les permite saber cunto tiempo pueden suponer que tomar la ejecucin. Para algunas personas, como los desarrolladores de videojuegos, una constante oculta puede significar la diferencia entre xito y fracaso. 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. Hay que mantenerse precavido en este terreno; por ejemplo, algunos anlisis cuentan con que la suma de dos nmeros se hace en
Antologa. Pgina 1

Estructura de Datos.
un paso. Este supuesto puede no estar garantizado en ciertos contextos. Si por ejemplo los nmeros involucrados en la computacin puedes ser arbitrariamente largos, dejamos de poder sumir que la adicin requiere un tiempo contante (usando papel y lpiz, compara el tiempo que necesitas para sumar dos enteros de 2 dgitos cada uno y el necesario para hacerlo con enteros de 1000 dgitos). 1.1 Concepto de Complejidad de Algoritmos. El anlisis de algoritmo es una parte muy importante de la ciencia de la computacin, de modo que la medida de la eficiencia de u algoritmo ser uno de los factores fundamentales. Por consiguiente es importante poder analizar los requisitos de tiempo y espacio de u algoritmo para ver si existe dentro de lmites aceptables. Es difcil realizar un anlisis simple de un algoritmo que determine la cantidad exacta de tiempo requerida para ejecutarlo. La primera complicacin es que la cantidad exacta de tiempo depender de la implementacin del algoritmo y de la maquina en que se ejecuta. El anlisis normalmente debe ser independiente del lenguaje o mquina que se utilice para implementar el algoritmo. El anlisis del algoritmo tratar de obtener el orden de magnitud de tiempo requerido para la ejecucin del mismo y cada algoritmo tendr un coste computacional diferente. La eficiencia es un criterio que se debe utilizar cuando se selecciona un algoritmo y su implementacin. Existe al menos tres dificultades fundamentales que son los siguientes: Cmo se codifican los algoritmos? Que computadoras utilizara? Qu datos debe utilizar el programa? El anlisis del a eficiencia debe ser independiente de las implementacin especficas de la computadora y de los datos especficos que se manipulan. Pero las consideraciones de eficiencia fundamentales son: el tiempo y el espacio. La complejidad del espacio de un programa es la cantidad de memoria que se necesita para ejecutar hasta la complecin (terminacin).La complejidad del tiempo de un programa es la cantidad de tiempo de computadora que se necesita para ejecutar hasta la complecin al considerar estos dos aspectos podremos tener la medida exacta de tiempo y espacio del cual necesitamos para realizar u buen anlisis de algoritmos. Un algoritmo ser ms eficiente comparado con otro, siempre que consuma menos recursos, como el tiempo y espacio de memoria necesarios para ejecutarlo.

Antologa.

Pgina 2

Estructura de Datos.
1.2 Aritmtica de la Notacin O. La notacin O (tambin llamada O mayscula), se utiliza para comparar la eficiencia de los algoritmos. Tipos de anlisis de la Notacin O Peor caso (usualmente)T(n) = Tiempo mximo necesario para un problema de tamao n. Caso medio (a veces)T(n) = Tiempo esperado para un problema cualquiera de tamao n. Requiere establecer una distribucin estadstica. Mejor caso (engaoso). Anlisis del peor caso.

Cul es el tiempo que necesitara un algoritmo concreto? Vara en funcin del ordenador que utilicemos. Vara en funcin del compilador que seleccionemos. Puede variar en funcin de nuestra habilidad como programadores.

1.3 Complejidad. 1.3.1 Tiempo de Ejecucin de un Algoritmo. El tiempo de ejecucin de un algoritmo, es prioritario cuando este es analizado. El tiempo de ejecucin de un algoritmo o estructura de datos depende de varios factores relativos al hardware (procesador, reloj, memoria, disco, etc) y el software (sistema operativo, lenguaje, compilador, etc.). Interesa hallar la dependencia del tiempo de ejecucin en funcin del tamao de la entrada. Un mtodo para estudiar el tiempo de ejecucin es la experimentacin, que tiene limitaciones:

1.-Los experimentos se pueden hacer sobre un conjunto limitado de entradas de prueba. 2.-Es necesario realizar los experimentos con el mismo hardware ysoftware.3.-Es necesario implementar y ejecutar el algoritmo. Adicionalmente a la experimentacin conviene disponer de un enfoque analtico que: Tome en consideracin todas las posibles entradas. Permita evaluar la
Antologa. Pgina 3

Estructura de Datos.
eficiencia de dos algoritmos de forma independiente del hardware y software. Se pueda realizar estudiando una representacin de alto nivel del algoritmo sin necesidad de implementarlo. 1.3.2 Complejidad en Espacio. Memoria que utiliza un programa para su ejecucin, La eficiencia en memoria de un algoritmo indica la cantidad de espacio requerido para ejecutar el algoritmo; es decir, el espacio en memoria que ocupan todas las variables propias al algoritmo. Para calcular la memoria esttica de un algoritmo se suma la memoria que ocupan las variables declaradas en el algoritmo. Para el caso de la memoria dinmica, el clculo no es tan simple ya que, este depende de cada ejecucin del algoritmo. 1.4 Seleccin de un Algoritmo. La seleccin del mejor algoritmo para el problema dado; en la prctica las cosas no son tan fciles y en ocasiones no es tan obvio poder escoger un algoritmo entre un grupo, pues la cantidad de operaciones no siempre es el nico criterio a tener en cuenta. Tambin debe considerarse, por ejemplo, el tamao del algoritmo, la claridad con que est expresado, etc.Finalidad.-Todo algoritmo tiene el objetivo o una finalidad de resolver un tipo de problema y se ejecuta para obtener un resultado que es la solucin de un caso particular de ese problema. Orden.-Los pasos del algoritmo tienen que ejecutarse en un orden preciso e indicado en el algoritmo. Si este orden se altera, generalmente no se obtiene el resultado deseado. Finitud.-El algoritmo tiene que ser finito en tres aspectos: a. El algoritmo es una secuencia finita de pasos (no tiene sentido ninguno un algoritmo cuya descripcin sea infinitamente larga) b. La ejecucin del algoritmo termina despus de concluir un nmero finito de pasos Ntese que este aspecto es diferente al anterior, pues podra tenerse una cantidad pequea de pasos en la definicin que se ejecutara repetidamente un nmero infinito de veces. Por ejemplo: dividir un nmero racional mayor que 0 por dos repetidamente hasta que el cociente sea cero. c. La ejecucin de un paso cualquiera del algoritmo tiene que poder ejecutarse en un tiempo finito.
Antologa. Pgina 4

Estructura de Datos.
Unidad II.- Manejo de Memoria.

2.1 Manejo de Memoria Esttica. La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de ejecucin es en memoria esttica o permanente a lo largo de toda la ejecucin del programa. No todos los objetos (variables) pueden ser almacenados estticamente. Para que un objeto pueda ser almacenado en memoria esttica su tamao (nmero de bytes necesarios para su almacenamiento) ha de ser conocido en tiempo de compilacin, como consecuencia de esta condicin no podrn almacenarse en memoria esttica: Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo de compilacin no se sabe el nmero de variables que sern necesarias. Las estructuras dinmicas de datos tales como listas, rboles, etc. ya que el nmero de elementos que las forman no es conocido hasta que el programa se ejecuta. 2.2 Manejo de Memoria Dinmica. Qu es la memoria dinmica? Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Un ejemplo simple podra ser el de un programa que lee las lneas de un archivo y las ordena. Por tanto, deberemos leer un nmero indeterminado de lneas, y tras leer la ltima, ordenarlas. Una manera de manejar ese ``nmero indeterminado'', sera declarar una constante MAX_LINEAS, darle un valor vergonzosamente grande, y declarar un array de tamao MAX_LINEAS. Esto, obviamente, es muy ineficiente (y feo). Nuestro programa no slo quedara limitado por ese valor mximo, sino que adems gastara esa enorme cantidad de memoria para procesar hasta el ms pequeo de los ficheros. La solucin consiste en utilizar memoria dinmica. La memoria dinmica es un espacio de almacenamiento que se solicita en tiempo de ejecucin. De esa manera, a medida que el proceso va necesitando espacio para ms lneas, va solicitando ms memoria al sistema operativo para guardarlas. El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que no podemos saber en tiempo de compilacin dnde nos dar huecos el sistema operativo (en la memoria de nuestro PC).
Antologa. Pgina 5

Estructura de Datos.
Unidad III.- Estructura Lineales Estticas y Dinmicas.

3.1 Pilas. Es un TAD que se caracteriza por el modo de acceso a sus elementos. En estas pilas, el ltimo elemento en aadirse es el primero en liberarse. No existe un mtodo de acceso directo a cualquier elemento de la pila, sino que para acceder a uno de ellos es necesario desafilarlos anteriores (los que estn "por encima" de ste). Las pilas son estructuras de tipo LIFO (Last InputFirst Output). Llevan asociados una variable llamada cima que indica la posicin del ltimo elemento apilado.

Uso de pilas. a) El gestor de programas del S.O. utiliza la pila para guardar momentneamente los parmetros y direccin de retorno de la funcin que se est procesando actualmente. b) La pila tambin puede utilizarse para la resolucin de expresiones algebraicas, pasando las expresiones a notacin infija y evalundolas de este modo, mucho ms sencillo. 3.2 Colas. Son un TAD formados por una secuencia de elementos, caracterizados porque sus elementos se insertan por un extremo y se extraen por el extremo opuesto (el primer elemento en insertarse es el primero en extraerse, o FIFO).

Antologa.

Pgina 6

Estructura de Datos.

USO DE LAS COLAS Las colas se suelen utilizar en los sistemas operativos para controlar las Prioridades de los Procesos (Colas de...), o en las impresoras (cola de impresin donde se almacenan las peticiones de impresin de documentos que van llegando). 3.3 Listas Enlazadas. 3.3.1 Listas Simples. Una lista simple es una secuencia de 0 o ms elementos de un tipo de datos determinado. Este tipo de datos se llama el tipo de elemento: a1, a2, a3, ... , a n-1, an. El valor de n es mayor o igual a 0 y cada elemento ai es del tipo de elemento. El nmero n es la cantidad de elementos de la lista y se denomina longitud de la lista. Si n1 se denomina a 1 el primer elemento y a n el ltimo elemento de la lista. Si n = 0, se tiene una lista vaca, en este caso la longitud es igual a 0. Una propiedad importante de una lista es que sus elementos pueden estar ordenados segn algn criterio. En estos casos ai precede a ai+1; n = 1, 2, ..., n1 y ai sucede a ai-1; i = 2, 3, ..., n. Cada elemento de una lista tiene una posicin: el elemento ai est en la posicin i. De esta forma, cada elemento tiene una distancia del primer elemento de una lista. El elemento ai tiene la distancia i-1 del primer elemento de una lista. La posicin fin (lista) es la posicin que sucede a la posicin del ltimo elemento de la lista. La posicin fin (lista) tiene una distancia variable con respecto al principio de la lista. Esto se debe a que la lista es una estructura de datos en la cual se agregan y se eliminan elementos. Operaciones representativas de listas son: crear una lista insertar un elemento localizar un elemento recuperar la informacin de un elemento eliminar un elemento
Pgina 7

Antologa.

Estructura de Datos.
determinar el siguiente elemento o elemento anterior

Detalles sobre el TDA de listas se puede encontrar en la seccin 2.1 del texto gua. Listas se programan con arreglos, con cursores o con punteros. Cada una de estas formas tiene ventajas y desventajas. Es la aplicacin especfica que permite tomar la decisin sobre como programar una lista. La utilizacin de arreglos y cursores se presenta muy bien la seccin 2.2 del texto gua. A continuacin se presentan 10 funciones que implementan una lista enlazada por punteros. Primero se declara una estructura que contiene dos campos: dato y puntero. El campo dato permite almacenar un nmero entero en cada elemento de la lista y el campo puntero permite enlazar los elementos de la lista. 3.3.2 Listas Dobles. Son TAD en las que los elementos estn organizados siguiendo un orden secuencial. Cada elemento tiene un anterior y un siguiente en la lista. En las listas genricas (no as en colas o pilas, que son casos especiales de listas) no existe una restriccin en la localizacin de los elementos insertados o extrados. Son estructuras mucho ms flexibles, donde tanto la insercin como eliminacin pueden darse en cualquier posicin de la lista.

Si la lista de implementar de manera esttica, la eliminacin o insercin de un elemento supondra la reorganizacin (movimiento) del resto de elementos del vector. La implementacin enlazada es mucho ms eficiente, y mediante ella podemos construir Listas Simplemente Enlazadas (cada elemento tiene acceso al siguiente), Listas Doblemente Enlazadas (cada elemento tiene acceso al anterior y al siguiente) o Listas Circulares (el ltimo elemento tiene acceso al inicio de la lista).

Antologa.

Pgina 8

Estructura de Datos.
Unidad IV.- Recursividad. 4.1 Definicin. El rea de la programacin es muy amplia y con muchos detalles. Los programadores necesitan ser capaces de resolver todos los problemas que se les presente a travs del computador aun cuando en el lenguaje que utilizan no haya una manera directa de resolver los problemas. En el lenguaje de programacin C, as como en otros lenguajes de programacin, se puede aplicar una tcnica que se le dio el nombre de recursividad por su funcionalidad. Esta tcnica es utilizada en la programacin estructurada para resolver problemas que tengan que ver con el factorial de un nmero, o juegos de lgica. Las asignaciones de memoria pueden ser dinmicas o estticas y hay diferencias entre estas dos y se pueden aplicar las dos en un programa cualquiera. La recursividad es una tcnica de programacin importante. Se utiliza para realizar una llamada a una funcin desde la misma funcin. Como ejemplo til se puede presentar el clculo de nmeros factoriales. l factorial de 0 es, por definicin, 1. Los factoriales de nmeros mayores se calculan mediante la multiplicacin de 1 * 2 * ..., incrementando el nmero de 1 en 1 hasta llegar al nmero para el que se est calculando el factorial. El siguiente prrafo muestra una funcin, expresada con palabras, que calcula un factorial." Si el nmero es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero. Si el nmero es cero, su factorial es uno. Si el nmero es mayor que cero, se multiplica por l factorial del nmero menor inmediato. "Para calcular el factorial de cualquier nmero mayor que cero hay que calcular como mnimo el factorial de otro nmero. La funcin que se utiliza es la funcin en la que se encuentra en estos momentos, esta funcin debe llamarse a s misma para el nmero menor inmediato, para poder ejecutarse en el nmero actual. Esto es un ejemplo de recursividad. La recursividad y la iteracin (ejecucin en bucle) estn muy relacionadas, cualquier accin que pueda realizarse con la recursividad puede realizarse con iteracin y viceversa. Normalmente, un clculo determinado se prestar a una tcnica u otra, slo necesita elegir el enfoque ms natural o con el que se sienta ms cmodo. Claramente, esta tcnica puede constituir un modo de meterse en problemas. Es fcil crear una funcin recursiva que no llegue a devolver nunca un resultado definitivo y no pueda llegar a un punto de finalizacin. Este tipo de recursividad hace que el sistema ejecute lo que se conoce como bucle "infinito". Para entender mejor lo que en realidad es el concepto de recursin veamos un poco lo referente a la secuencia de Fibonacci.
Antologa. Pgina 9

Estructura de Datos.
Principalmente habra que aclarar que es un ejemplo menos familiar que el de la factorial, que consiste en la secuencia de enteros. 0, 1, 1, 2 3, 5, 8, 13, 21, 34,..., Cada elemento en esta secuencia es la suma de los precedentes (por ejemplo 0 + 1 =0, 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5,...) sean fib (0) = 0, fib (1) = 1 y as sucesivamente, entonces puede definirse la secuencia de Fibonacci mediante la definicin recursiva (define un objeto en trminos de un caso ms simple de s mismo): fib (n) = n if n = = 0 or n = = 1 fib (n) = fib (n - 2) + fib (n - 1) if n >= 2 4.2.- Procedimientos Recursivos. Cuando se definen grupos de uno o ms procedimientos mutuamente recursivos (por ejemplo, el procedimiento p llama al procedimiento q en su cuerpo y viceversa), cada llamada aun procedimiento del grupo es considerada como una llamada recursiva. Los procedimientos recursivos deben tener asociados una funcin de cota. Dentro del cuerpo de los procedimientos, adems del cumplimiento de la precondicin, es necesario que las llamadas recursivas, hagan disminuir la cota, sin que sta llegue a ser menor que cero. La cota es nicamente utilizada para demostrar la terminacin de las definiciones de los procedimientos. Las llamadas a procedimientos definidos recursivamente, ubicadas fuera de las definiciones de stos no necesitan condicin alguna sobre la cota para estar definidas. Correccin de llamadas recursivas 4. Sin parmetros formales de salida Sean n tal que (0<=n) y p un procedimiento cuya definicin es de la forma siguiente: proc p : (in x1:t1,...,in xn:tn) {pre Pre_p} {post Post_p} {bount T_p}... La correccin de una llamada a p en las acciones de su cuerpo viene definida por:

Antologa.

Pgina 10

Estructura de Datos.

5. Con un parmetro out. Sean m, n tales que (0<=m<=n) y p un procedimiento cuya definicin es de la forma siguiente: proc p : (in x1:t1,...,in xm:tm, out o:=ini, ...,in xn:tn){pre Pre_p} {post Post_p} ... Sea C el nombre de una constante que no aparece en el programa. La correccin de una llamada a p en las acciones de su cuerpo viene definida por:

6. Con un parmetro in out Sean m, n tales que (0<=m<=n) y p un procedimiento cuya definicin es de la forma siguiente: proc p : (in x1:t1,...,in xm:tm, in out o,...,in xn:tn){pre Pre_p} {post Post_p} ... Sea C el nombre de una constante no utilizada en el programa. La correccin de una llamada a P en las acciones de su cuerpo viene definida por:

4.3 Mecnica de recursin.


Antologa. Pgina 11

Estructura de Datos.
Recursin es la forma en la cual se especifica un proceso basado en su propia definicin. Siendo un poco ms precisos, y para evitar el aparente crculo sin fin en esta definicin, las instancias complejas de un proceso se definen en trminos de instancias ms simples, estando las finales ms simples definidas de forma explcita. Funciones definidas de forma recursiva Aquellas funciones cuyo dominio puede ser recursivamente definido pueden ser definidas deforma recursiva. El ejemplo ms conocido es la definicin recursiva de la funcin factorial f(n): f(0) = 1 f(n) =n. f(n-1) para todo nmero natural n> 0 Con esta definicin veamos cmo funciona esta funcin para el valor del factorial de 3:

4.5.- Recursividad en el Diseo. Programacin II trata del diseo y anlisis formal de algoritmos abordndolo desde el punto de vista recursivo y el iterativo. La formacin bsica en programacin (asignatura PROGRAMACIN I, por ejemplo) proporciona conceptos bsicos de programacin imperativa: secuencia de rdenes, sentencias condicionales, bucles. Usando el tpico ejemplo de la factorial, se propone como ejercicio el desarrollo de un procedimiento o funcin que calcule el factorial de un nmero no negativo (el factorial !n de un nmero n no negativo es igual a producto de todos los nmeros no negativos iguales o inferiores que n teniendo en cuenta que el factorial de 0 es 1 por definicin). Intuitivamente alguien con experiencia en MODULA-2 programara la siguiente funcin para clculo de factorial:

Antologa.

Pgina 12

Estructura de Datos.

Existe una va alternativa para abordar el diseo de algoritmos: la recursiva. Sin embargo la mayora de las personas que abordan la asignatura PROGRAMACION II por primera vez no han asimilado el concepto de recursividad. El objeto de este apartado es la introduccin de ese concepto, dada su importancia para el dominio de la asignatura. Una aproximacin diferente a la programacin de una funcin que calcule el factorial de un nmero estara basada en el siguiente razonamiento: El factorial de 0 es 1. La factorial de un nmero natural n, mayor que cero, es igual al producto de n por el factorial del nmero n-1, es decir: ! n=n* !(n-1).

Siguiendo este razonamiento se puede llegar a programar el siguiente algoritmo en MODULA-2:

La primera sorpresa reside en el hecho de que en la lnea remarcada se ejecute una llamada a la propia funcin Factorial. Es esto posible ?. Conceptualmente si. En la prctica muchos lenguajes de alto nivel permiten la recursividad: Pascal, C, MODULA-2, etc.

Antologa.

Pgina 13

Estructura de Datos.
4.6 Complejidad de los Algoritmos Recursivos. La resolucin prctica de un problema exige por una parte un algoritmo o mtodo de resolucin y por otra un programa o codificacin de aquel en un ordenador real. Ambos componentes tienen su importancia; pero la del algoritmo es absolutamente esencial, mientras que la codificacin puede muchas veces pasar a nivel de ancdota. A efectos prcticos o ingenieriles, nos deben preocupar los recursos fsicos necesarios para que un programa se ejecute. Aunque puede haber muchos parmetros, los ms usuales son el tiempo de ejecucin y la cantidad de memoria (espacio). Ocurre con frecuencia que ambos parmetros estn fijados por otras razones y se plantea la pregunta inversa: cul es el tamao del mayor problema que puedo resolver en T segundos y/o con M bytes de memoria? En lo que sigue nos centraremos casi siempre en el parmetro tiempo de ejecucin, si bien las ideas desarrolladas son fcilmente aplicables a otro tipo de recursos. Para cada problema determinaremos una medida N de su tamao (por nmero de datos) e intentaremos hallar respuestas en funcin de dicho N. El concepto exacto que mide N depende dela naturaleza del problema. As, para un vector se suele atizar como N su longitud; para una matriz, el nmero de elementos que la componen; para un grafo, puede ser el nmero de nodos (a veces es ms importante considerar el nmero de arcos, dependiendo del tipo de problema a resolver); en un fichero se suele usar el nmero de registros, etc. Es imposible dar una regla general, pues cada problema tiene su propia lgica de coste. Unidad V.- Estructuras no Lineales Estticas y Dinmicas. Estructura De Datos Estticas Son aquellas en las que el tamao ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamao durante la ejecucin del programa. Estas estructuras estn implementadas en casi todos los lenguajes. Su principal caracterstica es que ocupan solo una casilla de memoria, por lo tanto una variable simple hace referencia a un nico valor a la vez, dentro de este grupo de datos se encuentra: enteros, reales, caracteres, bolanos, enumerados y subrangos (los ltimos no existen en algunos lenguajes de programacin).
Antologa. Pgina 14

Estructura de Datos.

Estructura De Datos Estticas Una estructura de datos memoria se define antes dicho tamao durante la estticas se encuentran cadenas. esttica es aquella en la que el tamao ocupado en de que el programa se ejecute y no pueda modificarse ejecucin del programa entre las estructuras de datos los array (vectores y matrices), registros, archivos y

Las estructuras de datos dinmicas: No tienen las limitaciones o restricciones en el tamao de memoria ocupada que son propias de las estructuras estticas. Mediante el uso de un tipo de datos especifico, denominado puntero, es posible construir estructuras de datos dinmicas que no son soportadas por la mayora de los lenguajes, pero que en aquellos que si tienen estas caractersticas ofrecen soluciones eficaces y efectivas en la solucin de problemas complejos.

Antologa.

Pgina 15

Estructura de Datos.
Se caracteriza por el hecho de que con un nombre se hace referencia a un grupo de casillas de memoria. Es decir un dato estructurado tiene varios componentes.

Estructuras de datos dinmicas Una estructura de datos dinmica es aquella en la que el tamao ocupado en memoria puede modificarse durante la ejecucin del programa. Las variables que se crean y estn disponibles durante la ejecucin del programa se llaman variables continuas. De esta manera se pueden adquirir posiciones adicionales de memoria a medida que se necesiten durante la ejecucin del programa y liberarlas cuando no se necesiten. Las estructuras dinmicas de datos se pueden dividir en dos grandes grupos: Lineales: Pilas, Colas. Listas enlazadas: No lineales, rboles, Grafo.

Antologa.

Pgina 16

Estructura de Datos.
5.1.- Concepto de rbol. rbol General Es una estructura jerrquica aplicada sobre una coleccin de elementos llamados nodos, uno de los cuales es conocido como la raz, y ente los nodos tienen una relacin o parentesco dando lugar a trminos como padre, hijo, hermano, etctera. Los rboles son estructuras dinmicas porque su estructura puede cambiar durante la ejecucin del programa. 5.1.1 Clasificacin de rboles. Son no lineales porque a cada elemento o nodo pueden seguirle varios nodos. rbol Binario Es un conjunto finito de nodos en el cual cada nodo puede tener como mximo dos hijos llamados subrbol izquierdo y subrbol derecho. Clasificacin de Arboles Binarios a) rbol Binario Distinto Se dice que dos rboles binarios son distintos cuando sus estructuras graficas son diferentes. b) rbol Binario Similar Dos rboles binarios son similares cuando tiene la misma estructura grafica pero la informacin de sus nodos es diferente. c) rbol Binario Equivalente Son aquellos arboles binarios que tiene la misma estructura grfica y adems la misma informacin en sus nodos. d) rbol Binario Completo Es aquel rbol en el que todos sus nodos excepto los del ltimo nivel tienen sus dos hijos. e) rbol Binario Lleno Es aquel rbol que contiene el nmero mximo de posibles nodos a excepcin de los nodos terminales u hojas.
Antologa. Pgina 17

Estructura de Datos.
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 viene dadas por la posicin del nodo en el array. 5.2 Operaciones Bsicas Sobre Arboles Binarios. 5.2.1 Creacin. Una de las operaciones bsicas de un rbol binario es la creacin del mismo en memoria. Un algoritmo muy simple para formar un rbol, por medio de la creacin dinmica de nodos y la asignacin a estos de informacin, es el que se muestra a continuacin. Una vez que se crea el rbol binario, se pueden realizar otras operaciones sobre sus elementos: recorrer todos los nodos, insertar un nuevo nodo, eliminar alguno de los existentes o buscar un valor determinado. Una de las operaciones ms importantes que se realiza en un rbol binario es el recorrido de los mismos. Recorrer significa visitar los nodos del rbol en forma ordenada, de tal manera que todos los nodos del mismo sean visitados una sola vez. Existen tres formas diferentes de efectuar el recorrido y todas ellas de naturaleza recursiva; estas son: a) Recorrido en preorden
Antologa. Pgina 18

Estructura de Datos.
Visitar la raz Recorrer el subrbol izquierdo Recorrer el subrbol derecho b) Recorrido en inorden Recorrer el subrbol izquierdo Visitar la raz Recorrer el subrbol derecho c) Recorrido en posorden Recorrer el subrbol izquierdo Recorrer el subrbol derecho Visitar la raz 5.2.2 Insercin. Insercin en un rbol binario de bsqueda La insercin en un rbol binario de bsqueda es una operacin que se puede realizarse eficientemente en este tipo de estructura de datos. La estructura crece conforme se insertan elementos al rbol. Los pasos que se deben realizar para agregar un nuevo nodo a un rbol binario de bsqueda son los siguientes: 1. Comparar la clave a insertar con la raz del rbol. Si es mayor, se sigue con el a subrbol derecho. Si es menor, se contina con el subrbol izquierdo. 2. Repetir sucesivamente el paso 1 hasta que se cumpla alguna de las siguientes a condiciones: 2.1 El subrbol derecho, o el subrbol izquierdo, es igual a vaco, en cuyo caso se proceder a insertar el elemento en el lugar que le corresponde. 5.2.3 Eliminacin. Eliminacin en un rbol binario de bsqueda La operacin de eliminacin en un rbol binario de bsqueda es un poco ms complicada que la de insercin. Esta consiste en eliminar un nodo sin violar los
Antologa. Pgina 19

Estructura de Datos.
principios que definen un rbol binario de bsqueda. Se deben distinguir los siguientes casos: a) Si el elemento a eliminar es terminal u hoja, simplemente se suprime redefiniendo el puntero de su predecesor. b) Si el elemento a eliminar tiene un solo descendiente, entonces tiene que sustituirse por ese descendiente. c) Si el elemento a eliminar tiene los dos descendientes, entonces se tiene que sustituir por el nodo que se encuentra ms a la izquierda en el subrbol derecho o por el nodo que se encuentra ms a la derecha en el subrbol izquierdo. Cabe destacar que antes de eliminar un nodo, se debe localizar ste en el rbol. Para esto se utiliza el algoritmo de bsqueda presentado anteriormente. 5.2.4 Recorrido Sistemtico. Una vez que se crea el rbol binario, se pueden realizar otras operaciones sobre sus elementos: recorrer todos los nodos, insertar un nuevo nodo, eliminar alguno de los existentes o buscar un valor determinado. Una de las operaciones ms importantes que se realiza en un rbol binario es el recorrido de los mismos. Recorrer significa visitar los nodos del rbol en forma ordenada, de tal manera que todos los nodos del mismo sean visitados una sola vez. Existen tres formas diferentes de efectuar el recorrido y todas ellas de naturaleza recursiva; estas son: a) Recorrido en preorden Visitar la raz Recorrer el subrbol izquierdo Recorrer el subrbol derecho b) Recorrido en inorden Recorrer el subrbol izquierdo Visitar la raz Recorrer el subrbol derecho

Antologa.

Pgina 20

Estructura de Datos.
c) Recorrido en posorden Recorrer el subrbol izquierdo Recorrer el subrbol derecho Visitar la raz 5.2.5 Balanceo. rboles Balanceados Cuando se estudiaron los arboles binarios de bsqueda se mencion que es una estructura sobre la cual se pueden realizar eficientemente las operaciones de bsqueda, insercin y eliminacin. Sin embargo, si el rbol crece o decrece descontroladme, el rendimiento puede disminuir considerablemente. El caso ms desfavorable se produce cuando se inserta un conjunto de claves ordenadas en forma ascendente o descendente. Es de notar que el nmero promedio de comparaciones que se deben realizar para localizar una determinada clave en un rbol binario de bsqueda con crecimiento descontrolado es N/2, cifra que muestra un rendimiento muy pobre en la estructura. Con el objeto de mantener la eficiencia en la operacin de bsqueda surgen los arboles balanceados. La principal caracterstica de estos es la de realizar reacomodos o balanceos, despus de inserciones o eliminaciones de elementos. Estos rboles tn reciben el nombre de AVL en honor a sus inventores, dos matemticos rusos, G. M. Adelson-Velskii y E. M. Landis. Formalmente se define un rbol balanceado como un rbol binario de bsqueda, en el cual se debe cumplir la siguiente condicin: Para todo nodo T del rbol, la altura de los subrbols izquierdo y derecho no deben diferir en ms de una unidad.

Donde HRI es la altura de la rama o subrbol izquierdo y HRD es la altura de la rama o subrbol derecho. Los arboles balanceados se parecen mucho, en su mecanismo de formacin, a los nmeros Fibonacci. El rbol de altura 0 es vaco, el rbol de altura 1 tiene un nico

Antologa.

Pgina 21

Estructura de Datos.
nodo y, en general, el nmero de nodos del rbol con altura h > 1 se calcula aplicando la siguiente formula recursiva:

Formula2 td25 donde Kindica el nmero de nodos del rbol y hla altura. Por otra parte, algunos estudios demuestran que la altura de un rbol balanceado de n nodos nunca exceder de 1.44 * log n. Insercin en rboles balanceados Al insertar un elemento en un rbol balanceado se deben distinguir los siguientes casos: 1. Las ramas izquierda (RI) y derecha (RD) del rbol tienen la misma altura (HRI = HRD) por lo tanto: 1.1 unidad. Si se inserta un elemento en RI, entonces HRI ser mayor en una

1.2 Si se inserta un elemento en RD, entonces HRD ser mayor en una unidad. Observe que en cualquiera de los dos casos mencionados (1.1 y 1.2), no se viola el criterio de equilibrio del rbol. 2. Las ramas izquierda (RI) y derecha (RD) del rbol tienen altura diferente 2.1 Supongamos que HRI < HRD : 2.1.1 Si se inserta un elemento en RI, entonces HRI ser igual a HRD.{ las ramas tienen la misma altura, por lo que se mejora el equilibrio de y no es necesario estructurarlo} 2.1.2 Si se inserta un elemento en RD, entonces se rompe el criterio de equilibrio del rbol y es necesario reestructurarlo. 2.2 Supongamos que HRI > HRD: 2.2.1 Si se inserta un elemento en RI, entonces se rompe el criterio de equilibrio del rbol y es necesario reestructurarlo.

Antologa.

Pgina 22

Estructura de Datos.
2.2.2 Si se inserta un elemento en RD, entonces HRD ser igual a HRI {Las ramas tienen la misma altura, por lo que se mejora el equilibrio del rbol} Ahora bien, para poder determinar si un rbol esta balanceado o no, se debe manejar informacin relativa al equilibrio de cada nodo del rbol. Surge as el concepto de factor de equilibrio de un nodo (FE) que se define como la altura del subrbol derecho menos la altura del subrbol izquierdo. Unidad VI.- Ordenacin Interna.

6.1 Algoritmos de Ordenamiento por Intercambio. El mtodo de intercambio directo, conocido coloquialmente como burbuja, es el utilizado entre los estudiantes principiantes de computacin por su fcil comprensin y programacin. Pero es preciso sealar que es quizs el mtodo ms ineficiente. 6.1.1 Burbuja. El mtodo de intercambio directo puede trabajar de dos maneras diferentes: llevando los elementos ms pequeos hacia la parte izquierda del arreglo o trasladando elementos ms grandes hacia su parte derecha. La idea bsica de este algoritmo con en comparar pares de elementos adyacentes e intercambiarlos entre si hasta que los elementos se encuentren ordenados. Se realizan (n - 1) pasadas transportando en cada una del menor o mayor de elementos segn sea el caso a su position ideal. Al final 1 (n - 1) pasadas los elementos del arreglo estarn ordenados. Ejemplo. Supongamos que se desea ordenar las siguientes claves del arreglo unidimensional A, transportando en cada pasada el menor elemento hacia la parte izquierda del arreglo. A: 15 67 08 16 44 27 12 35

Las comparaciones que se realizan son: PRIMERA PASADA A[7] > A[8] A[6] > A[7]
Antologa.

(12 > 35) (27 > 12)

no hay intercambio si hay intercambio


Pgina 23

Estructura de Datos.
A[5] > A[6] A[4] > A[5] A[3] > A[4] A[2] > A[3] A[1] > A[2] (44 > 12) (16 > 12) (08 > 12) (67 > 08) (15 > 08) si hay intercambio si hay intercambio no hay intercambio si hay intercambio si hay intercambio

Luego de la primera pasada el arreglo queda as: A: 08 15 67 12 16 44 27 35

Observe que el elemento ms pequeo, en este caso 08, fue situado en izquierda del arreglo. SEGUNDA PASADA A[7] > A[8] A[6] > A[7] A[5] > A[6] A[4] > A[5] A[3] > A[4] A[2] > A[3] (27 > 35) (44 > 27) (16 > 27) (12 > 16) (67 > 12) (15 > 12) no hay intercambio si hay intercambio no hay intercambio no hay intercambio si hay intercambio si hay intercambio

Luego de la segunda pasada el arreglo queda as: A: 08 12 15 67 16 27 44 35

y el segundo elemento ms pequeo del arreglo, en este caso 12, fue situado en la segunda position. 6.1.2 Quicksort. El mtodo de ordenacin quicksort es actualmente el ms eficiente y veloz de los mtodos de ordenacin interna. Es tambin conocido como mtodo rpido y de ordena por particin. Este mtodo es una mejora sustancial d todo de intercambio direct0 y se denomina quicksort rpido por la velocidad con que ordena los elemento del arreglo. Su autor, C. A. Hoare, lo llamo as. La idea central de este algoritmo con en lo siguiente:
Antologa. Pgina 24

Estructura de Datos.
Se toma un elemento X de una posicin cualquiera del arreglo. Se trata de ubicar a X en la posicin correcta del arreglo, de tal forma que todo los elementos que se encuentren a su izquierda sean menores o iguales a X y todos los se encuentren a su derecha sean mayores o iguales a X. Se repiten los pasos anteriores, pero ahora para los conjuntos de datos que se encuentran a la izquierda y a la derecha de la posicin de X en el arreglo. El proceso termina cuando todos los elementos se encuentran en su posicin correcta en el arreglo. Se debe seleccionar, entonces, un elemento X cualquiera. En este caso se seleccionar A[l]. Se empieza a recorrer el arreglo de derecha a izquierda comparando si elementos son mayores o iguales a X. Si un elemento no cumple con esta condicin, se intercambian aquellos y se almacena en una variable la posicin del elemento intercambiado se acota el arreglo por la derecha. Se inicia nuevamente el recorrido. Pero ahora de izquierda a derecha, comparando si los elementos son menores o iguales a X. Si un elemento no cumple con esta condicin, entonces se intercambian aquellos y se almacena en otra variable la posicin del elemento intercambiado se acota el arreglo por la izquierda. Se repiten los pasos anteriores hasta que el elemento X encuentra su posicin correcta en el arreglo. Analicemos a continuacin el siguiente ejemplo. Supongamos que se desea ordenar los elementos que se encuentran en el arreglo A utilizando el mtodo. A: 15 67 08 16 44 27 12 35

Se selecciona A[1], por lo tanto, X <- 15. Se llevan a cabo las comparaciones que se muestran a continuacin: PRIMERA PASADA Recorrido de derecha a izquierda A[8] > X A[7] > X A: (35 15) (12 15) 27 15* no hay intercambio si hay intercambio 35
Pgina 25

12* 67 08 16 44

Antologa.

Estructura de Datos.
Nota: La cota con el * indica los elementos a intercambiar. Recorrido de izquierda a derecha A [2] < X A: 12 15* 08 (67 15) 16 44 27 si hay intercambio 67* 35

SEGUNDA PASADA Recorrido de derecha a izquierda A[6] > X A[5] > X A[4] > X A[3] > X A: 12 08* (27 15) (44 15) (16 15) (08 15) 15* 16 no hay intercambio no hay intercambio no hay intercambio si hay intercambio 44 27 67 35

Como el recorrido de izquierda a derecha se debera iniciar en la misma posicin donde se encuentra el elemento X, el proceso termina ya que se detecta que el elemento X se encuentra en la posicin correcta. Observe que los elementos que forman parte del primer conjunto son menores o iguales a X, y los del segundo conjunto son mayores o iguales a X. A: 12 08 15 16 44 27 67 35

ler. Conjunto conformados por los elementos 12, 08 posicin de X en el elemento 15 2o. conjunto conformados por los elementos 16, 44, 27, 67, 35 Este proceso de aprisionamiento aplicado para localizar la posicin correcta de elemento X en el arreglo se repite cada vez que queden conjuntos formados por dos o ms elementos. El mtodo se puede aplicar de manera iterativa o recursiva. 6.1.3 ShellSort. El mtodo de Shell es una versin mejorada del mtodo de insercin directa. Recibe ese nombre en honor de su autor, Donald L. Shell, quien lo propuso en 1959. Este mtodo tn se conoce como insercin con incrementos decrecientes.

Antologa.

Pgina 26

Estructura de Datos.
En el mtodo de ordenacin por insercin directa cada elemento se compara para su ubicacin correcta en el arreglo con los elementos que se encuentran en su parte izquierda. Si el elemento a insertar es ms pequeo que el grupo de elementos que se encuentran a su izquierda, ser necesario efectuar varias comparaciones antes de su ubicacin. Shell propone que las comparaciones entre elementos se efecten con saltos de mayor tamao, pero con incrementos decrecientes; as, los elementos quedaran n nados en el arreglo ms rpidamente. Para comprender mejor este algoritmo analice siguiente caso. Consideremos un arreglo que contenga 16 elementos. En primer lugar, se dividirn los elementos del arreglo en ocho grupos, teniendo en cuenta los elementos que se encuentran a ocho posiciones de distancia entre si y se ordenaran por separado. Quedarn en el primer grupo los elementos (A[l], A[9]); en el segundo, (A[2], A[10]); en d i cero, (A[3], A[ll]), y as sucesivamente. Despus de este primer paso se dividir los elementos del arreglo en cuatro grupos, teniendo en cuenta ahora que los elementos se encuentren a cuatro posiciones de distancia entre si y se les ordenara por separado. Quedarn en el primer grupo los elementos (A[l], A[5], A[9], A[13]); en el segundo (A[2], A[6], A[10], A[14]), y as sucesivamente. En el tercer paso se dividirn los elementos del arreglo en grupos, tomando en cuenta los elementos que se encuentran ahora a dos posiciones de distancia entre si y nuevamente se les ordenara por separado. En el primer grupo quedarn (A[l], A[3], A[5], A[7], A[9], A[ll], A[13], A[15]) y en el segundo (A [2], A[4], A[6], A[8], A[10], A[12], A[14], A[16]). Finalmente se agruparan y ordenaran los elementos de manera normal; es decir, de uno en uno. Se presenta a continuacin un ejemplo. Ejemplo. Supongamos que se desea ordenar los elementos que se encuentran en el arreglo unidimensional A utilizando el mtodo de Shell. A: 10 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07

Anlisis de eficiencia del mtodo de Shell El anlisis de eficiencia del mtodo de Shell es un problema muy complicado y aun no resuelto. Hasta el momento no se ha podido establecer la mejor secuencia de incrementos cuando n es grande. Cabe recordar que cada vez que se propone una
Antologa. Pgina 27

Estructura de Datos.
secuencia de intervalos, es necesario correr el algoritmo para analizar su tiempo de ejecucin. En 1969, Pratt descubri que el tiempo de ejecucin del algoritmo es del orden de n*(log n)2. Unas pruebas exhaustivas realizadas para obtener la mejor secuencia de intervalos cuando el nmero de elementos del arreglo es igual a 8 arrojaron como resultado que la mejor secuencia corresponde a un intervalo de 1, que no es ms que el mtodo de insercin directa estudiado previamente. Estas pruebas tambin determinaron que el menor nmero de movimientos se registraba con la secuencia 3, 2, 1. Cabe aclarar que las pruebas exhaustivas corresponden al anlisis de (8!) posibilidades; es decir, 40 320 casos diferentes. Para concluir con el anlisis de eficiencia de mtodo de Shell, se menciona que estudios de Peterson y Russell, en la Universidad de Stanford, en 1971, muestran que las mejores secuencias para valores de N comprendidos entre 100 y 60 000 son las que se presentan en la Lista de secuencias, donde k = 0, 1, 2, 3,... Listas de Secuencias l, 3, 5, 9, ... ,2k + l 1, 3, 7, 15, ..., 2k -l 1, 3, 5, 11, ...,(2k l)/3 1, 4, 13, 40,..., (3k + l)/2 6.2 Algoritmos de Ordenamiento por Distribucin. 6.2.1 Radix. El ordenamiento Radix (radix sort en ingls) es un algoritmo de ordenamiento que ordena enteros procesando sus dgitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, nmeros en punto flotante especialmente formateados, radix sort no est limitado slo a los enteros. La mayor parte de los ordenadores digitales representan internamente todos sus datos como representaciones electrnicas de nmeros binarios, por lo que procesar los dgitos de las representaciones de enteros por representaciones de grupos de dgitos binarios es lo ms conveniente. Existen dos clasificaciones de radix sort: el de dgito menos significativo (LSD) y el de dgito ms significativo (MSD). Radix sort LSD procesa las representaciones de enteros empezando por el
Antologa. Pgina 28

Estructura de Datos.
dgito menos significativo y movindose hacia el dgito ms significativo. Radix sort MSD trabaja en sentido contrario. Las representaciones de enteros que son procesadas por los algoritmos de ordenamiento se les llamas a menudo "claves", que pueden existir por s mismas o asociadas a otros datos. Radix sort LSD usa tpicamente el siguiente orden: claves cortas aparecen antes que las claves largas, y claves de la misma longitud son ordenadas de forma lxica. Esto coincide con el orden normal de las representaciones de enteros, como la secuencia "1, 2, 3, 4, 5, 6, 7, 8, 9, 10". Radix sorts MSD usa orden lxico, que es ideal para la ordenacin de cadenas de caracteres, como las palabras o representaciones de enteros de longitud fija. Una secuencia como "b, c, d, e, f, g, h, i, j, ba" ser ordenada lxica mente como "b, ba, c, d, e, f, g, h, i, j". Si se usa orden lxico para ordenar representaciones de enteros de longitud variable, entonces la ordenacin de las representaciones de los nmeros del 1 al 10 ser "1, 10, 2, 3, 4, 5, 6, 7, 8, 9", como si las claves ms cortas estuvieran justificadas a la izquierda y rellenadas a la derecha con espacios en blanco, para hacerlas tan largas como la clave ms larga, para el propsito de este ordenamiento. Ejemplo. Vector original: V: 25 57 48 37 12 92 86 33

Asignamos los elementos en colas basadas en el dgito menos significativo de cada uno de ellos. 0: 1: 2: 12, 92 3: 33 4: 5: 25 6: 86 7: 57, 37
Antologa. Pgina 29

Estructura de Datos.
8: 48 9: Despus de la primera pasada, la ordenacin queda: V: 12 92 33 25 86 57 37 48 Colas basadas en el dgito ms significativo. 0: 1: 12 2: 25 3: 33, 37 4: 48 5: 57 6: 7: 8: 86 9: 92 Lista ordenada: V: 12, 25, 33, 37, 48, 57, 86, 92 Unidad VII.- Ordenacin Externa. 7.1 Algoritmos de Ordenacin Externa. 7.1.1 Intercalacin Directa. El mtodo de ordenacin por mezcla directa es probablemente el ms utilizado por su fcil comprensin. La idea central de este algoritmo consiste en la realizacin sucesiva de una particin y una fusin que produce secuencias ordenadas de longitud cada vez mayor. En la primera pasada, la particin es de longitud 1 y la fusin o mezcla produce secuencias ordenadas de longitud 2. En la segunda pasada, la particin es de longitud 2 y la fusin o mezcla produce secuencias ordenadas de longitud 4. Este proceso se repite hasta que la longitud de la secuencia para la particin sea:
Antologa. Pgina 30

Estructura de Datos.
Parte entera ((n +l)/2). Donde n representa el nmero de elementos del archivo original. Ejemplo. Supongamos que se desea ordenar las claves del archivo F. Para realizar tal actividad se utilizan los archivos auxiliares a los que se les denominara F1 y F2. F: 09 75 14 68 29 17 31 25 04 05 13 18 72 46 61

PRIMERA PASADA Particin en secuencias de longitud 1. F1: 09' F2: 75' 14' 68' 29' 17' 31' 25' 04' 05' 13' 18' 72' 46' 61'

Fusin en secuencias de longitud 2. F: 09 61' 75' 14 68' 17 29' 25 31' 04 05' 13 18' 46 72'

SEGUNDA PASADA Particin en secuencias de longitud 2. F1: F2: 09 14 75' 68' 17 25 29' 31' 04 05' 13 18' 46 61' 72'

Fusin en secuencias de longitud 4. F: 09 72' 14 68 75' 17 25 29 31' 04 05 13 18' 46 61

TERCERA PASADA Particin en secuencias de longitud 4. F1: F2: 09 17 14 25 68 29 75' 31' 04 46 05 61 13 72' 18'

Fusin en secuencias de longitud 8.

Antologa.

Pgina 31

Estructura de Datos.
F: 09 14 17 25 29 31 68 75' 04 05 13 18 46 61 72'

CUARTA PASADA Particin en secuencias de longitud 8. Fl: F2: 09 04 14 05 17 13 25 18 29 46 31 61 68 72' 75'

Fusin en secuencias de longitud 16. F: 04 05 09 13 14 17 18 25 29 31 46 61 68 72 75

7.1.2 Mezcla Natural. Ordenacin por el mtodo de mezcla equilibrada El mtodo de ordenacin por mezcla equilibrada, conocido tambin como natural, es una optimizacin del mtodo de mezcla directa. La idea central de este algoritmo consiste en realizar las particiones tomando secuencias ordenadas de mxima longitud en lugar de secuencias de tamao fijo previamente determinadas. Luego se realiza la fusin de las secuencias ordenadas, en alternada, sobre dos archivos. Aplicando estas acciones en forma repetida se lograr el archivo original quede ordenado. Para la realizacin de este proceso de ordenacin se necesitaran cuatro archivos. El archivo original F y tres archivos auxiliares a los que se denominara F1, F2 y F3. De estos archivos, dos sern considerados de entrada y dos de salida; esto, de manera alternada, con el objeto de realizar la fusin-particin. El proceso termina cuando en la realizacin de una fusin-particin el segundo archivo quede vaco. Supongamos que se desea ordenar las claves del archivo F utilizando el mtodo mezcla equilibrada. F: 09 75 14 68 29 17 31 25 04 05 13 18 72 46 61

Los pasos que se realizan son: PARTICIN INICIAL F2: F3: 09 14 75' 68' 29' 17 25' 31' 46 61' 13 18 72'

04 05

Antologa.

Pgina 32

Estructura de Datos.
PRIMERA FUSION-PARTICION F: F1: 09 14 68 75' 31' 04 05 13 18 25 46 61 72'

17 29

SEGUNDA FUSION-PARTICION F1: 09 14 17 29 31 68 75' F3: 04 05 13 18 25 46 61 72' TERCERA FUSION-PARTICION F: 04 05 09 13 14 17 18 25 29 31 46 61 68 72 75

Unidad VIII.- Mtodos de Bsqueda. 8.1 Algoritmos de Ordenacin Externa. La bsqueda interna trabaja con elementos que se encuentran almacenados en la memoria principal de la mquina. Estos pueden estar en estructuras estticas arreglos o dinmicas listas ligadas y arboles. Los mtodos de bsqueda interna ms importantes son: Secuencial o lineal Binaria Por transformacin de claves ( Hash ) rboles de bsqueda 8.1.1 Secuencial. La bsqueda secuencial consiste en revisar elemento tras elemento hasta encontrar el dato buscado, o llegar al final del conjunto de datos disponible. Primero se tratara sobre la bsqueda secuencial en arreglos, y luego en listas enlazadas. En el primer caso, se debe distinguir entre arreglos ordenados y desordenados. Esta ltima consiste, bsicamente, en recorrer el arreglo de izquierda a derecha hasta que se encuentre el elemento buscado o se termine el arreglo, lo que ocurra prime-ro. Normalmente cuando una funcin de bsqueda concluye con xito,
Antologa. Pgina 33

Estructura de Datos.
interesa conocer en que posicin fue hallado el elemento que se estaba buscando. Esta idea se puede generalizar para todos los mtodos de bsqueda. Anlisis de la bsqueda secuencial El nmero de comparaciones es uno de los factores ms importantes que se utilizan para determinar la complejidad de los mtodos de bsqueda. Para analizar la complejidad de la bsqueda secuencial, se deben establecer los casos ms favorable o desfavorable que se presenten. Al buscar, por ejemplo, un elemento en un arreglo unidimensional desordenado de N componentes, puede suceder que ese valor no se encuentre; por lo tanto, se har N comparaciones al recorrer todo el arreglo. Por otra parte, si el elemento se encuentra en el arreglo, este puede estar en la primera posicin, en la ltima o en alguna intermedia. Si es el primero, se har una comparacin; si se trata del ltimo, se harn N comparaciones; y si se encuentra en la posicin i(1 < i < N), entonces se realizaran i comparaciones. Ahora bien, el nmero de comparaciones que se llevan a cabo si trabajamos con arreglos ordenados ser el mismo que para desordenados, siempre y cuando el elemento se encuentre en el arreglo. Si no fuera este el caso, entonces el nmero de comparaciones disminuir sensiblemente en arreglos ordenados, siempre que el valor buscado este comprendido entre el primero y los ltimos elementos del arreglo. Por otra parte, el nmero de comparaciones en la bsqueda secuencial en listas simplemente ligadas es el mismo que para arreglos. 8.1.2 Binaria. La bsqueda binaria consiste en dividir el intervalo de bsqueda en dos partes, comparando el elemento buscado con el que ocupa la posicin central en el arreglo. Para el caso de que no fueran iguales se redefinen los extremos del intervalo, segn el elemento central sea mayor o menor que el elemento buscado, disminuyendo de esta forma el espacio de bsqueda. El proceso concluye cuando el elemento es encontrado, o cuando el intervalo de bsqueda se anula, es vaco. El mtodo de bsqueda binaria funciona exclusivamente con arreglos ordenados. No se puede utilizar con listas simplemente ligadas no podramos retroceder para establecer intervalos de bsqueda ni con arreglos desordenados. Con cada iteracin del mtodo el espacio de bsqueda se reduce a la mitad; por lo tanto, el nmero de comparaciones a realizar disminuye notablemente.
Antologa. Pgina 34

Estructura de Datos.
Anlisis de la bsqueda binaria Para analizar la complejidad del mtodo de bsqueda binaria es necesario establecer los casos ms favorables y desfavorables que se pudieran presentar en el proceso de bsqueda. El primero sucede cuando el elemento buscado es el central, en dicho caso se har una sola comparacin; el segundo sucede cuando el elemento no se encuentra en el arreglo; entonces se harn aproximadamente log2(n) comparaciones, ya que con cada comparacin el nmero de elementos en los cuales se debe buscar se reduce en un factor de 2. De esta forma, se determinan los nmeros mnimo, mediano y mximo de comparaciones que se deben realizar cuando se utiliza este tipo de bsqueda.

8.1.2 Hash. Los dos mtodos analizados anteriormente permiten encontrar un elemento en un arre-glo. En ambos casos el tiempo de bsqueda es proporcional a su nmero de componentes. Es decir, a mayor nmero de elementos se debe realizar mayor nmero de compara-ciones. Se mencion adems que si bien el mtodo de bsqueda binaria es ms eficiente que el secuencial, existe la restriccin de que el arreglo se debe encontrar ordenado. Esta seccin se dedica a un nuevo mtodo de bsqueda. Este mtodo, conoci: como transformacin de claves o hash, permite aumentar la velocidad de bsqueda sin necesidad de tener los elementos ordenados. Cuenta con la ventaja de que el tiempo de bsqueda es independiente del nmero de componentes del arreglo. Supongamos que se tiene una coleccin de datos, cada uno de ellos identificado por una clave. Es claro que resulta atractivo tener acceso a ellos de manera directa; es decir sin recorrer algunos datos antes de localizar al buscado. El mtodo por transformacin de claves permite realizar justamente esta actividad; es decir, localizar el dato en forma directa. El mtodo trabaja utilizando una funcin que convierte una clave dada en una direccin ndice- dentro del arreglo. Direccin <- H(clave)

Antologa.

Pgina 35

Estructura de Datos.
La funcin hash (H) aplicada a la clave genera un ndice del arreglo que permite acceder directamente al elemento. El caso ms trivial se presenta cuando las claves son nmeros enteros consecutivos. Supongamos que se desea almacenar la informacin relacionada con 100 alumnos cuyas matriculas son nmeros del 1 al 100. En este caso conviene definir un arreglo de 100 elementos con ndices numricos comprendidos entre los valores 1 y 100. Los datos de cada alumno ocuparan la posicin del arreglo que se corresponda con el nmero de la matricula; de esta manera se podr acceder directamente a la informacin de cada alumno. Consideremos ahora que se desea almacenar la informacin de 100 empleados. La clave de cada empleado corresponde al nmero de su seguro social. Si la clave esta forma-da por 11 dgitos, resulta por completo ineficiente definir un arreglo con 99 999 999 999 elementos para almacenar solamente los datos de los 100 empleados. Utilizar un arreglo tan grande asegura la posibilidad de acceder directamente a sus elementos; sin embargo, el costo en memoria resulta tanto ridculo como excesivo. Siempre es importante equilibrar el costo del espacio de memoria con el costo por tiempo de bsqueda. Cuando se tienen claves que no se corresponden con ndices por ejemplo, por ser alfanumricas, o cuando las claves representen valores numricos muy grandes o no se corresponden con los ndices de los arreglos, se utilizara una funcin hash que permita transformar la clave para obtener una direccin apropiada. Esta funcin hash debe ser simple de calcular y asignar direcciones de la manera ms uniforme posible. Es decir, debe generar posiciones diferentes dadas dos claves tambin diferentes. Si esto ltimo no ocurre (H(K1) = d, H(K2) = d y K K2) hay una colisin, que se define como la asignacin de una misma direccin a dos o ms claves distintas. En este contexto, para trabajar con este mtodo de bsqueda se debe seleccionar previamente: Una funcin hash que sea fcil de calcular y distribuya uniformemente las claves. Un mtodo para resolver colisiones. Si estas se presentan, se contara con algn mtodo que genere posiciones alternativas. Estos dos casos se trataran en forma separada. Como ya se mencion, seleccionar una buena funcin hash es muy importante, pero es difcil encontrarla. Bsicamente porque no existen reglas que permitan determinar cul ser la
Antologa. Pgina 36

Estructura de Datos.
funcin ms apropiada para un conjunto de claves que asegure la mxima uniformidad en su distribucin. Realizar un anlisis de las principales caractersticas de las claves siempre ayuda en la eleccin de una funcin de este tipo. A continuacin se explican algunas de las funciones hash ms utilizadas. Funcin hash por mdulo: divisin. Funcin hash cuadrado. Funcin hash por plegamiento. Funcin hash por truncamiento. Soluciones de colisiones. Reasignacin, Doble direccin hash Arreglos anidados. Encadenamiento Anlisis del mtodo por transformacin de claves Para analizar la complejidad de este mtodo es necesario realizar varios clculos probabilsticos, que no se estudiaran en esta obra. La dificultad del anlisis se debe principalmente a que no solo interviene la funcin hash sino tambin mtodo utilizado para resolver las colisiones. Por lo tanto, se debera analizar cada una de las posibles combinaciones que se pudieran presentar. Sea el factor de ocupacin de un arreglo, definido como MIN, donde M es el nmero de elementos en el arreglo y N es su tamao. Segn Lipschutz, la probabilidad de llevar a cabo una bsqueda con xito (S) y otra sin xito (Z), quedan determinadas por las siguientes formulas:

Antologa.

Pgina 37

Estructura de Datos.
8.2 Bsqueda Externa. En la seccin anterior se estudiaron las tcnicas de bsqueda que son aplicables cuando la informacin reside en la memoria principal de la computadora. En particular, se analiza la operacin de bsqueda en estructuras estticas arreglos y dinmicas listas y arboles de informacin. Sin embargo, existen casos en los cuales no se puede manejar toda la informacin en memoria principal, sino que es necesario trabajar con informacin almacenada en archivos. Este tipo de bsqueda se denomina bsqueda externa. Los archivos se usan normalmente cuando el volumen de datos es significativo. o cuando la aplicacin exige la permanencia de los datos, aun despus de que esta se termine de ejecutar. Como los archivos se encuentran almacenados en dispositivos perifricos cintas, discos, etc., las operaciones de escritura y lectura de datos tienen un alto costo en cuanto a tiempo, por los accesos a estos perifricos. Para disminuir el tiempo de acceso es muy importante optimizar las operaciones de bsqueda, insercin y eliminacin en archivos. Una forma de hacerlo es trabajar con archivos ordenados. A continuacin se describen algunos de los mtodos ms utilizados en bsqueda externa. 8.2.1 Secuencial. El mtodo de bsqueda secuencial consiste en recorrer el archivo comparando la clave buscada con la clave del registro en curso. El recorrido lineal del archivo termina cuando se encuentra el elemento, o cuando se alcanza el final del archivo. Se pueden presentar algunas variantes dentro de este mtodo, dependiendo sobre todo de si el archivo esta ordenado o desordenado. 8.2.2 Binaria. El principio que rige el mtodo de bsqueda binaria en la bsqueda externa es el mismo que se explic en bsqueda binaria interna. El archivo debe estar ordenado y se debe conocer su nmero de elementos (N) para aplicar este mtodo. El lector puede desarrollarlo fcilmente, ya que conoce el mtodo de bsqueda binaria en memoria principal interna. Cabe destacar que un gran inconveniente de la bsqueda binaria externa es que requiere accesos a diferentes posiciones del dispositivo perifrico en el cual est almacenado el archivo; ello produce un alto costo en tiempo de acceso, que hace muy imprctica esta bsqueda.

Antologa.

Pgina 38

Estructura de Datos.
8.2.3 Hash. El mtodo de bsqueda externa por transformacin de claves tiene bsicamente las mismas caractersticas que el presentado en la bsqueda interna. Los archivos normalmente se encuentran organizados en areas llamadas cubetas. Estas se encuentran formadas por cero, uno o ms bloques de registros. Por lo tanto, la funcin hash, aplicada a una clave, dar como resultado un valor que hace referencia a una cubeta en la cual se puede encontrar el registro buscado. Tal como se mencion en bsqueda interna, la eleccin de una adecuada funcin hash y de un mtodo para resolver colisiones es fundamental para lograr mayor eficiencia en la bsqueda. Antes de presentar algunas funciones hash se har un comentario sobre las colisio-nes. Los bloques contienen un nmero fijo de registros. Con respecto a las cubetas, no se establece un lmite en cuanto al nmero de bloques que pueden almacenar. Esta caracterstica permite solucionar, al menos parcialmente, el problema de las colisiones. Sin embargo, si el tamao de las cubetas crece considerablemente, se perdern las ventajas propias de este mtodo. Es decir, si el nmero de bloques que se deben recorrer en una cubeta es grande, el tiempo necesario para ello ser significativo; por lo tanto, ya no se contara con la ventaja del acceso directo que caracteriza al mtodo por transformacin de claves. Es importante elegir una funcin hash que distribuya las claves en forma homognea a s de las cubetas, de manera que se evite la concentracin de numerosas claves en una cubeta mientras otras permanecen vacas. A continuacin se presentan algunas de las funciones hash ms comunes. Funciones hash Una funcin hash se puede definir como una transformacin de clave a una direccin. Al aplicar una funcin hash a una clave se obtiene el nmero de cubeta en la cual se puede encontrar el registro con dicha clave. La funcin debe transformar las claves para que la direccin resultante sea un nu-mero comprendido entre los posibles valores de las cubetas. Por ejemplo, si se tienen 10 000 cubetas numeradas de 0 a 9 999, las direcciones producidas por la funcin deben ser valores comprendidos entre 0 y 9 999. Si las claves fueran alfabticas o alfricas, primero debern convertirse en numricas, tratando de no perder informacin, para luego ser transformadas en una direccin. Es importante

Antologa.

Pgina 39

Estructura de Datos.
que la funcin distribuya homogneamente las claves entre los nmeros de cubetas disponibles. Las funciones modulo, cuadrado, plegamiento y truncamiento presentadas anterior-mente para bsqueda interna son vlidas tambin para bsqueda externa. Otra funcin que se puede utilizar para el clculo de direcciones es la de conversin de bases, aunque no proporciona mayor homogeneidad en la distribucin. De todas, la funcin modulo es, sin embargo, la que ofrece mayor uniformidad. Conversin de bases La conversin de bases consiste en modificar de manera arbitraria la base de la clave obteniendo un nmero que corresponda a una cubeta. Si el nmero de dgitos del valor resultante excede el orden de las direcciones, entonces se suprimirn los dgitos ms significativos. Supongamos que se tienen 100 cubetas, cada una de ellas referenciada por un nmero entero comprendido entre 1 y 100. Sea K= 7 259 la clave del registro que se busca. Se elige el 9 como base a la cual se convierte la clave. H{7 259) = dgmensig (7 * 9^3 + 2 * 9^2 + 5 * 91 + 9 * 9^0) H(7 259) = dgmensig (5 319) = 19 Se toma entonces como direccin el 19 y los dgitos ms significativos, 5 y 3, se desprecian. Solucin de colisiones Como se mencion anteriormente cuando se trat bsqueda interna, uno de los aspectos que siempre se deben de considerar en el mtodo por transformacin de claves es la solucin de colisiones. Cuando dos o ms elementos con distintas claves tienen una misma direccin, se origina una colisin. Para evitar las colisiones se debe elegir un tamao adecuado de cubetas y de bloques. Con respecto a las cubetas, si se definen muy pequeas el nmero de colisiones aumenta, mientras que si se definen muy grandes se pierde eficiencia en cuanto a espacio de almacenamiento. Adems, si se necesitara copiar una cubeta en memoria principal y esta fuera muy grande, ocasionara problemas por falta de espacio. Otro inconveniente que se presenta en el caso de cubetas muy grandes es que se requiere mucho tiempo para recorrerlas.
Antologa. Pgina 40

Estructura de Datos.
Con respecto al tamao de los bloques, es importante considerar la capacidad de estos para almacenar registros. Un bloque puede almacenar uno, dos o ms registros. Normalmente los tamaos de las cubetas y los bloques dependen de las capacidades del equipo con el que se est trabajando.

Biografas. Osavaldo Cairo, Silva Guardati; "Estructura de Datos ", Tercera Edicin; Mc Graw Hill; Mxico, D.F.; 2006. Captulo 6: rboles. Osavaldo Cairo, Silva Guardati; "Estructura de Datos ",Tercera Edicion; Mc Graw Hill; Mexico, D.F.; 2006. Captulo 8: Mtodos de Ordenacin Osavaldo Cairo, Silva Guardati; "Estructura de Datos ",Tercera Edicion; Mc Graw Hill; Mexico, D.F.; 2006. Captulo 9: Mtodos de Bsqueda Osavaldo Cairo, Silva Guardati; "Estructura de Datos ",Tercera Edicion; Mc Graw Hill; Mexico, D.F.; 2006. Captulo 9: Mtodos de Bsqueda

Antologa.

Pgina 41

You might also like