Está en la página 1de 59

Curso propedutico Estructuras de datos

M. EN I. JORGE CARLOS REYES MAGAA

Objetivo General
El alumno utilizar un lenguaje de programacin orientado a objetos para desarrollar programas de cmputo que utilicen estructuras de datos avanzadas, considerando la optimizacin de recursos como el espacio de memoria y de disco.

Contenido
Tema 1. Mtodos de ordenamiento y bsqueda Objetivo: Al concluir la unidad, los estudiantes habrn elaborado un sistema integrado con todos los mtodos de ordenamiento vistos en clases y usarn la bsqueda binaria para encontrar elementos sobre los datos ordenados. Insercin Shellsort Mergesort Quicksort Bsqueda binaria

Contenido
Tema 2. Estructuras de datos lineales Objetivo: Al concluir el estudio de esta unidad, el estudiante podr elaborar programas que apliquen las estructuras de Datos Lineales. Pilas Colas Listas

Contenido
Tema 3. Hashing Dispersion Objetivo: Al concluir la unidad, los estudiantes habrn desarrollado e implementado aplicaciones que requieran el uso de la dispersin. Hashing Mapas

Contenido
Tema 4. Estructuras de datos no lineales. Objetivo: Al concluir esta unidad, el estudiante habr desarrollado e implementado programas que usen estructuras de datos no lineales Arboles binarios Representacin y recorrido. Arboles de bsqueda. Binarios, B, B+. Arboles balanceados

Criterios de evaluacin
Exmenes Tareas Proyecto 40 puntos 30 puntos 30 puntos

Mtodos de ordenamiento y bsqueda

Mtodo de insercin directa

Anlisis de eficiencia del mtodo de insercin directa


Si el arreglo se encuentra ordenado se efectan como mximo n-1 comparaciones y 0 movimientos entre los elementos.

El nmero de comparaciones y movimientos mximo entre elementos se produce cuando los elementos del arreglo estn en orden inverso. Ejemplo: Sea A un arreglo formado por los siguientes elementos:
A: 86 52 45 20 15 Las comparaciones que se realizan son:

A: 86 52 45 20 15
Primera iteracin
A[2] < A[1] A[3] < A[2] A[2] < A[1] A[4] < A[3] A[3] < A[2] A[2] < A[1] (52<86) (45<86) (45<52) (20<86) (20<52) (20<45) si hay intercambio si hay intercambio si hay intercambio si hay intercambio si hay intercambio si hay intercambio

Segunda iteracin

Tercera iteracin

A: 86 52 45 20 15
Cuarta iteracin
A[5] < A[4] A[4] < A[3] A[3] < A[2] A[2] < A[1] (15<86) (15<52) (15<45) (15<20) si hay intercambio si hay intercambio si hay intercambio si hay intercambio

Observaciones:
En la primera iteracin se realiz una comparacin, en la segunda, dos comparaciones, en la tercera, tres comparaciones y as sucesivamente hasta n-1 compraciones entre elementos. Por lo tanto:

Comp max = 1 + 2 + 3 + + (n-1) = n * (n - 1) / 2 Que es igual a: Comp max = (n2 n ) / 2 El nmero de comparaciones promedio , que es cuando los elementos del arreglo aparecen en forma aleatoria se puede calcular mediante la suma de las comparaciones mnima y mxima dividida entre 2.

En resumen:

Haciendo las cuentas

Respecto al nmero de movimientos, si el arreglo se encuentra ordenado no se realiza ninguno, Por lo tanto: Mmin = 0 El nmero mximo de movimientos se presenta cuando el arreglo est en orden inverso. Observemos el ejemplo anterior En la primera pasada se realiz un movimiento, en la segunda dos y as sucesivamente hasta n-1 movimientos.

Mov max = 1 + 2 + 3 + + (n-1) = n * (n - 1) / 2 Que es igual a: Mov max = (n2 n ) / 2 Finalmente el nmero de movimientos promedio es:

Haciendo las cuentas:

Ejercicio
Se tiene que ordenar un arreglo que contiene 500 elementos:
Cuntas comparaciones y cuantos movimientos son necesarios si el arreglo se encuentra ordenado? Cuntas comparaciones y cuantos movimientos son necesarios si el arreglo se encuentra en forma aleatoria? Cuntas comparaciones y cuantos movimientos son necesarios si el arreglo se encuentra en orden inverso?

Es importante sealar que el tiempo requerido para ejecutar el algoritmo de insercin es proporcional a n2 , donde n es el nmero de elementos del arreglo. A pesar de ser un mtodo ineficiente y recomendable slo cuando n es pequeo, el mtodo de insercin se comporta mejor que el mtodo de burbuja.

Pseudocdigo del mtodo de insercin


{I, AUX, y K son variables de tipo entero} Repetir con I desde 2 hasta N Hacer AUX = A[I] y K = I 1 Mientras ((K>= 1) y (AUX < A[K]) Repetir
Hacer A[K+1] = A[K] y K = K 1

Fin del ciclo Mientras Hacer A[K+1] = AUX

Fin del ciclo Repetir

Shellsort

El mtodo shellsort es una versin mejorada del mtodo de insercin directa. Este mtodo tambin se conoce con el nombre de insercin con incrementos decrecientes.

Shell propone que las comparaciones entre elementos se efecten con saltos de mayor tamao (comparado con el mtodo de insercin) pero con incrementos decrecientes, as, los elementos quedarn ordenados en el arreglo ms rpidamente.

Considrese un arreglo que contenga 16 elementos. Se dividirn los elementos del arreglo en 8 grupos teniendo en cuenta los elementos que se encuentran a ocho posiciones de distancia entre s y se ordenarn por separado. Quedarn los siguientes grupos:
A[1] y A[9], A[2] y A[10], A[3] y A[11], etc.

Despus se dividirn los elementos del arreglo en 4 grupos, teniendo en cuenta ahora los elementos que se encuentren a cuatro posiciones de distancia entre si y se los ordenar por separado. Quedarn los grupos:
A[1],A[5], A[9], A[13] A[2],A[6], A[10], A[14] Etc.

En el tercer paso se dividirn los elementos del arreglo en grupos, tomando en cuenta los elementos que se encuentran ahora a 2 posiciones de distancia entre s y sucesivamente se les ordenar por separado. Quedarn los grupos:
A[1],A[3], A[5], A[7], A[9],A[11], A[13], A[15] A[2],A[4], A[6], A[8], A[10],A[12], A[14], A[16]

Finalmente se agruparn y ordenarn los elementos de manera normal, es decir de uno en uno. Ejemplo:
Supngase que se desea ordenar los siguientes elementos que se encuentran en el arreglo A utilizando el mtodo shell. A: 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10

Algoritmo
Shell(A,N) {INT,I,AUX son variables de tipo entero, BAND es una variable de tipo booleano} Hacer INT = N + 1 Repetir mientras (INT > 1) Hacer INT = parte entera (INT entre 2) y BAND = verdadero Repetir mientras (BAND = verdadero) Hacer Band = falso ,I = 1 Repetir mientras ((I + INT )<= N ) si A[I] > A[I + INT] entonces Hacer AUX = A[I], A[I] = A[I + INT] A[I+INT] = AUX y Band = verdadero Fin si Hacer I = I + 1 Fin ciclo Repetir mientras Fin ciclo Repetir mientras Fin ciclo Repetir mientras

Anlisis de eficiencia del mtodo shell


El anlisis de eficiencia del mtodo de Shell es un problema muy complicado y an no resuelto. No se ha podido establecer hasta el momento la mejor secuencia de incrementos cuando n es grande. Cada vez que se propone una secuencia de intervalos es necesario correr el algoritmo para analizar el tiempo de ejecucin del mismo.

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. Estas pruebas tambin determinaron que el menor nmero de movimientos se registraba con las secuencias 3, 2, 1.

Mejores secuencias para un arreglo de 8 elementos

Posicin 1 2 3 4 5 6 7 8 9 10

Secuencia 1 6 1 5 1 7 1 4 1 3 1 2 1 5 3 1 4 2 1 3 2 1

Estudios realizados en 1971 muestran que las mejores secuencias para valores de N comprendidos entre 100 y 60000 son las siguientes:
Secuencias 1,3,5,9, , (2^k) + 1 1,3,7,15,, (2^k) - 1 1,3,5,11,., ((2^k) +- 1) /3 1,4,13,40,., ((3^k) - 1) /2

k= 0,1,2,3,

Tarea
Supngase que se desea ordenar las siguientes claves del arreglo A utilizando el mtodo de Shell. La secuencia que se utilizar corresponde a la frmula: (2^k) - 1 .
A[1]: 8780 A[2]: 8439 A[3]: 9698 A[4]: 5319 A[5]: 6145 A[6]: 2166 A[7]: 7116 A[8]: 6236 A[9]: 2404 A[10]: 7432 A[11]: 7868 A[12]: 3513 A[13]: 5310 A[14]: 8054 A[15]: 4935 A[16]: 8034

MergeSort

MergeSort
A grandes rasgos, el algoritmo consiste en dividir en dos partes iguales el vector a ordenar, ordenar por separado cada una de las partes, y luego mezclar ambas partes, manteniendo la ordenacin, en un solo vector ordenado. Desarrollado en 1945 por John Von Neumann. Para lograr ordenar por medio de mergesort un arreglo de elementos, los pasos a seguir son los siguientes:
Tomar como fuente la secuencia original Divisin o distribucin:
Dividir la fuente en dos mitades en las cintas destino c1 y c2

Mezcla:
Mezclar c2 y c3 combinando cada elemento accesible en pares ordenados

Repetir el pase compuesto de las dos etapas hasta el ordenamiento de la cinta.

35

Ejemplo

Ordenar la lista
8 2 4 6 9 7 10 1 5 3

Usando mergesort

36

Se puede describir el merge sort recursivamente. Se divide la lista en 2 sublistas de tamao igual o aproximadamente igual. Ordenar cada sublista usando mergeSort y despus mezclar ambas listas.

PseudoCodigo
Procedimiento MergeSort (L = a1,.,an) si (n>1) entonces
M = ceiling (n/2) L1 = a1,a2,,am L2= am+1 , am+2 , , an L = merge(MergeSort(L1), mergeSort(L2))

Fin si

Procedimiento merge(L1,L2) L = lista vaca Mientras (L1 y L2 ambas sean no vacas)


Remover el elemento mas pequeo de L1 y L2 de la lista en la cual est y ponerla a la izquierda de L. Si remover este elemento hace que una lista est vaca
Remover los elementos de la otra lista y agregarlos el final de L

Fin si

Fin mientras

Complejidad del MergeSort

Si hubiramos ordenado 2 elementos hubiramos necesitado 1 pase para 4 ---------------------------- 2 pases para 8 ---------------------------- 3pases para n ---------------------------- [log n] (parte entera superior de) En cada pase el elemento se copia dos veces, como hay n elementos, el nmero de movimientos ser 2n[log n]

QuickSort

El mtodo de ordenacin QuickSort es el ms eficiente y veloz de los mtodos de ordenacin interna. Recibe el nombre de QuickSort por la velocidad con que ordena los elementos del arreglo. Fue realizado por C.A. Hoare.

La idea central de este algoritmo consiste en lo siguiente:


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 todos lo elementos que se encuentren a su izquierda sean menores o iguales a X y todos los elementos que 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 encuentren a la izquierda y a la derecha de la posicin correcta de X en el arreglo. El proceso termina cuando todos los elementos se encuentran en su posicin correcta del arreglo.

Ejemplo
Supngase que se desea ordenar los elementos que se encuentran en el arreglo A utilizando el mtodo quicksort. A: 15 67 08 16 44 27 12 35

Considrese el arreglo A del ejemplo anterior. Luego de la primera particin. A queda de la siguiente manera: A: 12 08 15 16 44 27 67 35 1 er conjunto 2 conjunto

Para construir el algoritmo deben almacenarse en las pilas los ndices de los conjuntos de datos que falta tratar. Se utilizarn 2 pilas, PILAMENOR y PILAMAYOR. En la primera se almacenarn el extremo izquierdo y en la otra se almacenar el extremo derecho de los conjuntos de datos que falta tratar.

A: 12 08 15 16 44 27 67 1 er conjunto 2 conjunto

35

4 1
PILAMENOR

8 2
PILAMAYOR

Los ndices del primer conjunto quedaron almacenados en la primera posicin de PILAMENOR y PILAMAYOR respectivamente. La posicin del extremo izquierdo del primer conjunto en PILAMENOR y la posicin del extremo derecho del mismo conjunto en PILAMAYOR. Las posiciones de los extremos izquierdo y derecho del segundo conjunto (4 y 8) fueron almacenados en la cima de PILAMENOR y PILAMAYOR, respectivamente.

Ejercicio
Ordenar con quicksort las siguientes claves. Usar las pilas vistas anteriormente: A: 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10

Posiciones
Extremo

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 15 67 08 16 44 27 12 35 56 21 13 28 60 36 07 10 10 07 08 13 12 15 10 07 08 13 12 15 10 07 08 13 12 15 10 07 08 13 12 15 10 07 08 13 12 15 10 07 08 13 12 15 10 07 08 13 12 15 27 35 56 21 44 28 60 36 16 67 16 21 27 56 44 28 60 36 35 67 16 21 27 35 44 28 36 56 60 67 16 21 27 35 44 28 36 56 60 67 16 21 27 28 35 44 36 56 60 67 16 21 27 28 35 36 44 56 60 67 16 21 27 28 35 36 44 56 60 67 (01,16) (7,16) (10,16) (15,16) (10,13) (12,13) (07,08) (01,05)

Pila Menor

Pila Mayor

NULL 01 07 01 10 07 01 07 01 07 01 01 NULL

NULL 05 08 05 13 08 05 08 05 08 05 05 NULL

Posiciones
Extremo

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 08 07 10 13 12 15 08 07 10 12 13 15 07 08 10 12 13 15 16 21 27 28 35 36 44 56 60 67 16 21 27 28 35 36 44 56 60 67 16 21 27 28 35 36 44 56 60 67 (04,05) (01,02) NULL

Pila Menor

Pila Mayor

01 NULL NULL

02 NULL NULL

Pseudocodigo
QuickSort(A,N) {TOP, INI, FIN, Y POS. Son variables de tipo entero. PILAMENOR Y PILAMAYOR son arreglos} Hacer TOP = 1, PILAMENOR[TOP] = 1 Y PILAMAYOR[TOP] = N Repetir mientras (TOP > 0) Hacer INI = PILAMENOR[TOP], FIN = PILAMAYOR[TOP] y TOP = TOP 1 Llamar a PosicionaQuickSort(INI,FIN,POS) Si INI < POS 1 entonces Hacer TOP = TOP + 1, PILAMENOR[TOP] = INI y PILAMAYOR[TOP] = POS-1 Fin si Si FIN > POS + 1 entonces Hacer TOP = TOP + 1, PILAMENOR[TOP] = POS+1 y PILAMAYOR[TOP]=FIN Fin si Fin ciclo Repetir

Pseudocdigo
PosicionaQuickSort(INI, FIN, POS) {INI y FIN representan las posiciones de los extremos izquierdo y derecho del conjunto de elementos a evaluar. POS es una variable donde se almacenar el resultado de este algoritmo} {IZQ, DER, y AUX son variables de tipo entero. BAND es una variable de tipo booleano} Hacer IZQ = INI, DER = FIN , POS = INI Y BAND = VERDADERO Repetir mientras (BAND = VERDADERO) Repetir mientras (A[POS] <= A[DER]) y (POS DER) Hacer DER = DER 1 Fin ciclo Repetir Si POS = DER entonces Hacer BAND = FALSO si no Hacer AUX = A[POS], A[POS] = A[DER], A[DER] = AUX, POS = DER Repetir mientras (A[POS] >= A[IZQ]) y (POS IZQ) IZQ = IZQ + 1 Fin ciclo repetir Si POS = IZQ entonces Hacer BAND = FALSO sino Hacer AUX = A[POS], A[POS] = A[IZQ], A[IZQ] = AUX, POS = IZQ Fin Si Fin si Fin ciclo Repetir

Anlisis de eficiencia del mtodo QuickSort


Diversos estudios realizados sobre su comportamiento demuestran que si se escoge en cada pasada el elemento que ocupa la posicin central del conjunto de datos a analizar, el nmero de pasadas necesarias para ordenarlo es del orden log n. Respecto al numero de comparaciones , si el tamao del arreglo es una potencia de 2, en la primera pasada realizar (n-1) comparaciones, en la segunda (n-1)/2 comparaciones, pero en 2 conjuntos diferentes, en la tercera realizar (n-1)/4, pero en 4 conjuntos diferentes y as sucesivamente.

Anlisis de eficiencia del mtodo QuickSort


Por lo tanto:

Lo cual es lo mismo que:

Si se considera a cada uno de los componentes de la sumatoria como un trmino y el nmero de la sumatoria es igual a m, entonces se tiene que: Considerando que el nmero de trminos de la sumatoria (m) es igual al nmero de pasadas, y que ste es igual a log n la expresin queda:

Bsqueda binaria
La bsqueda binaria consiste en dividir el intervalo de bsqueda en dos partes, comparando el elemento buscado con el central. En el caso de no ser iguales se redefinen los extremos del intervalo (segn el elemento central sea mayor o menor que el buscado) disminuyendo el espacio de bsqueda.

El proceso concluye cuando el elemento es encontrado o bien cuando el intervalo de bsqueda se anula. El mtodo funciona nicamente para arreglos ordenados. Con cada iteracin del mtodo el espacio de bsqueda se reduce a la mitad.

Binaria(V,N,X) {IZQ, CEN y DER son variables de tipo entero. BANDERA es una variable De tipo booleano} 1. Hacer IZQ = 1, DER = N Y BANDERA = FALSO 2. Repetir mientras (IZQ <=DER y BANDERA = FALSO) Hacer CEN = PARTE ENTERA((IZQ+DER)/2) 2.1 Si X = V[CEN] entonces Hacer BANDERA = VERDADERO sino {Redefinir el intervalo de bsqueda} 2.1.1 Si X > V[CEN] entonces Hacer IZQ = CEN + 1 si no Hacer DER = CEN -1 2.1.2{Fin del condicional del paso 2.1.1} 2.2 {Fin del ciclo del paso 2} 3. {Fin del paso 2} 4. Si BANDERA = VERDADERO Escribir El elemento esta en posicin CEN sino Escribir El elemento no est en el arreglo 5. {Fin del condicional del paso 4}