Está en la página 1de 8

Bsqueda y Ordenacin

T T E E M M A A 1 1
1.1. Introduccin 1.2.1. Bsqueda Secuencial 1.2.2. Bsqueda Binaria 1.2.3. Bsqueda en Cadenas 1.2.4. Hashing 1.3. Ordenacin 1.3.1. Ordenacin por Insercin 1.3.2. Ordenacin por Seleccin 1.3.3. Ordenacin por Intercambio
Metodologa de Programacin

Introduccin
Objetivos Uso de las estructuras de datos antes Estructura de datos seleccionada Algoritmo diseado Tipos de Algoritmos Interno / Externo
Metodologa de Programacin

Bsqueda
Operacin frecuente en Programacin Diversidad de Algoritmos Diferentes Tcnicas de Bsqueda Bsqueda en Listas: Algoritmos, Eficiencia Lista Elementos componentes: Tipo de Datos Simple
Vector = ARRAY[0..N-1]DE TipoElemento

Bsqueda Secuencial
Aplicabilidad: Desconocimiento acerca de la organizacin de los datos Estructura solo accedida secuencialmente Idea Clave: Visitar todas las posiciones del array, hasta que se encuentre el elemento o se llegue al final del mismo (elemento no esta)
PROC Secuencial( x:TipoElemento) VAR ind:NATURAL Inicio ind 0 MIENTRAS (ind<N) (V[ind] <> x) HACER ind ind+1 FINMIENTRAS SI ind = N ENTONCES escribir("no encontrado") EN OTRO CASO escribir("encontrado") FINSI Fin

Metodologa de Programacin

Metodologa de Programacin

Bsqueda Secuencial
Consideraciones
La expresin lgica slo es correcta si el segundo trmino slo se evala cuando el primero es TRUE ( ) Mejor Caso 1 comparacin Peor Caso N comparaciones Caso Promedio N/2 comparaciones Fin de Bsqueda: Elemento hallado V[ind]=x Elemento no hallado ind=N
Metodologa de Programacin

Bsqueda Secuencial con Centinela


Posible optimizacin del algoritmo anterior: Eliminar el chequeo (ind < N) Asegurarnos que x est en V Como? Aadiendo x al final del array (centinela)
Vector=ARRAY[0..N]DE TipoElemento
PROC secuencial_Op( V:Vector; x:TipoElemento) VAR ind:NATURAL Inicio V[N] x ind 0 MIENTRAS (V[ind] <> x) HACER ind ind+1 FINMIENTRAS SI ind = N ENTONCES escribir("no encontrado") EN OTRO CASO escribir("encontrado") FINSI Fin

Metodologa de Programacin

Bsqueda Binaria
Aplicabilidad:
-Informacin adicional: Cmo estn organizados los datos. -Bsqueda ms eficiente Datos Ordenados. k tal que 1 k N-1, se cumple que V[k-1] V[k ]

Bsqueda Binaria
PROC Binaria (V:Vector; x:TipoElemento) VAR izq,der,m:NATURAL; encontrado:LOGICO Inicio Izq 0 Der N - 1 Encontrado FALSO MIENTRAS (Izq Der) ( Encontrado)HACER m (*cualquier valor entre Izq y Der*) SI V[m] = x ENTONCES Encontrado TRUE EN OTRO CASO SI V[m] < x ENTONCES Izq m + 1 EN OTRO CASO Der m - 1 FINSI FINSI FINMIENTRAS Fin

Idea Clave:
Inspeccionar un elemento de ndice m elegido al azar (x elemento a buscar): - Si V[m]=x Fin Bsqueda - Si V[m]<x k/ k m, V[k] eliminados - Si V[m]>x k/ k m, V[k] eliminados
Metodologa de Programacin

Metodologa de Programacin

Bsqueda Binaria
Consideraciones Eleccin de m No afecta a la correccin del Algoritmo Objetivo: Eliminar el mayor nmero de elementos en cada iteracin Eleccin Optima m(Izq + der)/2 Eficiencia(Peor Caso) Trunc(log2N) +1

Bsqueda en Cadenas
Objetivo: Localizar la presencia de una
cadena de longitud M dentro de otra de N

Tipos:
TipoElemento=CARACTER
Texto=ARRAY[0..N-1]DE TipoElemento Patrn=ARRAY[0..M-1]DE TipoElemento

Metodologa de Programacin

Metodologa de Programacin

Bsqueda Directa Hacia Delante


Algoritmo de bsqueda en cadenas Idea Clave: Comparar carcter a carcter texto y patrn comenzando por el extremo izquierdo de ambos Coinciden ? Si se compara el siguiente carcter No el proceso se reinicia comenzado en la posicin siguiente a la que se inici la
FUNC BusqCadena(P:Patron; T:texto):ENTERO VAR i,j:NATURAL res:ENTERO Inicio i 0; j 0 MIENTRAS(i<N) (j<M) HACER SI T[i] = P[j] ENTONCES i i + 1 j j + 1 EN OTRO CASO i i - j + 1 j 0 FINSI FINMIENTRAS SI j = M ENTONCES Res i - M EN OTRO CASO Res -1 FINSI RESULTADO Res
Fin

Bsqueda Directa Hacia Atrs


Algoritmo de bsqueda en cadenas Idea Clave: Comparar carcter a carcter texto y patrn comenzando por el extremo derecho de ambos Coinciden ? Si se compara el carcter anterior No el proceso se reinicia comenzado en la anterior posicin a la que se inici la

El diseo del Algoritmo se deja propuesto al alumno como ejercicio

Metodologa de Programacin

Metodologa de Programacin

Hashing
Listas: Elementos componentes Tipo de Datos Estructurado (Ej. 2N)+1 Secuencial Binaria

Hashing
Opciones:
Relacin perfecta entre el valor clave y la posicin de un registro Impracticable en muchas ocasiones Ordenar los elementos aplicando alguna

Objetivo: Mejorar Eficiencia

+ 1 iteracin

Usos de la Funcin Hash:


El resultado de la misma se usa para la Se utiliza como mtodo de acceso (

Metodologa de Programacin

Metodologa de Programacin

Hashing
Funcin Hash clave MOD 100
0 1 2 3 clave 459250704 funcin hash clave MOD 100
. . .

Hashing
Una Funcin Hash no garantiza direcciones nicas Colisiones Sinnimos: valores clave que producen colisiones al aplicarle una Funcin Colisiones difciles de evitar Algoritmos de Manejo de Colisiones Esquema Almacenamiento = Bsqueda
Metodologa de Programacin

4 5 6

99

Metodologa de Programacin

Algoritmos de manejo de Colisiones


Hash y Bsqueda
Almacenamiento: Almacenar el elemento colisionado en el siguiente espacio libre Estructura Circular : Aplicar la funcin Obtenemos una posicin Comparacin de claves, Si Fin. Elemento hallado Bsqueda Secuencial
Metodologa de Programacin
clave 556677003

Algoritmos de Manejo de Colisiones


Hash y Bsqueda
vaco registro (453614001) funcin hash clave MOD 100 vaco registro (123450003) registro (445500104) vaco vaco
. . .

0 1 2 3 4 5 6

. . . 99

registro (010233099)

Metodologa de Programacin

Algoritmos de Manejo de Colisiones


Hash y Bsqueda
PROC Almacenamiento( ArrayEmpleados:TipoArray; NuevoValor:TipoReg; LugarEncontrado:LOGICO); VAR LugarInicio,IntentarLugar : ENTERO Inicio LugarInicio NuevoValor.clave MOD 100 IntentarLugar LugarInicio; LugarEncontrado FALSO REPETIR SI (ArrayEmpleados[IntentarLugar]=Vaco) ENTONCES ArrayEmpleados[IntentarLugar] NuevoValor LugarEncontrado CIERTO EN OTRO CASO IntentarLugar (IntentarLugar+1) MOD 100 FINSI HASTA QUE LugarEncontrado (IntentarLugar=LugarInicio) Fin

Algoritmos de Manejo de Colisiones


Hash y Bsqueda
TipoReg = REGISTRO clave:Z,.... FINREGISTRO TipoArray=ARRAY [0..99] DE TipoReg

Funcin Hash Ejemplo Campo clave: cadena de caracteres


(i ORD(clave[i])) MOD tamao

FUNC ValorHash(clave:Cadena) :ENTERO VAR i,long:NATURAL valor:ENTERO Inicio long longitud(clave) valor 0 PARA i 1 HASTA long HACER valorvalor+ORD(clave[i]) FINPARA RESULTADO valor MOD 100 Fin

Metodologa de Programacin

Metodologa de Programacin

Algoritmos de Manejo de Colisiones


Rehasing
clave funcin hash direccin (colisin) funcin rehash direccin (colisin)

Algoritmos de Manejo de Colisiones


Rehashing
Almacenamiento: Se usa la direccin que produjo la colisin como entrada a otra funcin El proceso se repite hasta que no : : Idntico proceso pero invertido
Metodologa de Programacin

funcin rehash

.....

direccin (no colisin)

Metodologa de Programacin

Algoritmos de Manejo de Colisiones


Cubos y Encadenamientos Cubos: Cada direccin transformada contiene espacio para mltiples registros Cubo : Cubo lleno Colisiones Encadenamientos: Cada direccin transformada se usa como ndice de una posicin del nos permite acceder a una cadena de registros : Recorrido secuencial de la Cadena
Metodologa de Programacin

Algoritmos de Manejo de Colisiones


Cubos
vaco registro (453614001) funcin hash clave MOD 100 vaco registro (123450003) registro (445500104) vaco vaco
. . .

vaco registro (302472101) vaco vaco vaco vaco vaco


. . .

vaco vaco vaco vaco vaco vaco vaco


. . .

0 1 2 3 4 5 6

clave 556677003

registro (010233099)

registro (243056399)

vaco

99

Metodologa de Programacin

Algoritmos de Manejo de Colisiones


Encadenamientos
0 1 2 3 clave 556677003 funcin hash clave MOD 100 4 5 6
. . .

Eleccin de una buena Funcin Hash


Objetivos de diseo:
Minimizar Colisiones Distribuir de manera uniforme los elementos a lo largo de la estructura.

registro (453614001) registro (123450003) registro (123450003)

registro (302472101)

Como?
Usar estructuras de datos con ms espacio del 20%) Conocimiento sobre la distribucin, dominio y
registro (243056399)

99

registro (010233099)

Metodologa de Programacin

Metodologa de Programacin

Ordenacin
Actividad esencial y muy relevante en Programacin Ocupa ms del 25% del Tiempo de computacin Problema ampliamente estudiado Diversidad de Algoritmos Objetivo: Eficiencia Buscar el mejor algoritmo de Ordenacin

Ordenacin
Eficiencia
Algoritmos que economicen la memoria disponible Algoritmo ms eficiente: Quickshort n*log(n) Algoritmos directos: Insercin, Seleccin e Intercambio n2 -Menos eficientes -Adecuados para dilucidar las principales caractersticas de los algoritmos de Ordenacin
Metodologa de Programacin

Metodologa de Programacin

Ordenacin
Algoritmos de Ordenacin
Tipo: Indice=[1..N] Vector=ARRAY Indice DE TipoElemento TipoElemento: Tipo sobre el que hay definida una El problema de ordenacin es encontrar una permutacin s, tal que si V es una variable del tipo Vector : V[si] V[si+1], 1 i N-1 El orden deseado ser: V[s1], V[s2], ........, V[sN].
Metodologa de Programacin

Ordenacin por Insercin


Idea Clave: para cada paso i, los elementos
V1,..., Vi-1 estn ordenados y se inserta entre ellos Vi de forma que despus de la insercin los 1,....., Vi estn ordenados.

Ejemplo: Se ha de ordenar la siguiente coleccin

23 15 20
Metodologa de Programacin

Ordenacin por Insercin


Paso1: i:=2.SuponemosV1,....,V1ordenados, insertamos V2 =>V1,.....,V2 ordenados. 1 3 9 7 5 23 15 20 ordenados, insertamos V3 => V1,....,V3 ordenados. 1 3 9 7 5 23 15 20
1,...., V3 ordenados, insertamos V4 => V1,....,V4 ordenados. 1 3 7 9 5 23 15 20 1,....,V2

Ordenacin por Insercin


20

7
1,....,

23

15

insertamos V6 1 3 5 7

1,....,V6

V5 ordenados, ordenados. 23 15 20

Cmo realizar la insercin? Insercin directa Abrir un hueco en la sucesin V1,....Vi-1 para encajar Vi Ejemplo:
Paso4: i:=5. Suponemos V1,...., V4 ordenados, insertamos V5 => V1,......, V5 ordenados. 1 3 7 9 5 23 15 20 1 3 5 7 9 23 15 20
Metodologa de Programacin

1,...., V6 ordenados, insertamos V7 => V1,....,V7 ordenados. 1 3 5 7 9 15 23 20

1,...., V4 ordenados, insertamos V5 => V1,....,V5 ordenados.

1,...., V7 ordenados, insertamos V8 => V1,....,V8 ordenados. 1 3 5 7 9 15 20 23

Metodologa de Programacin

Ordenacin por Insercin


FUNC buscar_posicion (valor: TipoElemento; V:Vector; fin: Indice): Indice VAR i:Indice Inicio i 1 MIENTRAS (i fin) (V[i] < valor) HACER i i+1 FINMIENTRAS RESULTADO i Fin PROC abrir_hueco (V:Vector; inicio, fin:Indice) VAR i:Indice Inicio PARA ifin HASTA inicio+1 (PASO -1) HACER V[i] V[i-1] FINPARA Fin

Ordenacin por Insercin


PROC Insercion ( V:Vector) VAR i, pos:Indice aux:TipoElemento Inicio PARA i 2 HASTA N HACER aux V[i] pos buscar_posicion (aux, V, i-1) abrir_hueco(V, pos, i) V[pos] aux FINPARA Fin

de realizar la insercin

posicin insercin valor

Metodologa de Programacin

Metodologa de Programacin

Ordenacin por Insercin


FUNC buscar_posicion (valor:TipoElemento; V:Vector; fin: Indice) :Indice VAR izd, der, med:Indice Inicio izq 1 der fin MIENTRAS izd <= der HACER med (izq + der) / 2 SI valor < V[med] ENTONCES der med EN OTRO CASO izq med + 1 FINSI FINMIENTRAS RESULTADO izq Fin

Ordenacin por Seleccin


Idea Clave: 1)Determinar la posicin del menor elemento del array 2)Intercambiar dicho elemento por el elemento que hay en la primera posicin V1 3)Repetir esta operacin con los N-1 elementos restantes V2,....., VN
Metodologa de Programacin

Metodologa de Programacin

Ordenacin por Seleccin


Ejemplo
320 96 16 90 120 80 200 64 320 96 16 90 120 80 200 64 16 64 80 90 96 320 200 120 16 96 320 90 120 80 200 64 16 64 80 90 96 120 200 320 16 64 320 90 120 80 200 96 Paso5: 16 64 80 90 120 320 200 96

Ordenacin por Seleccin


FUNC posicion_menor_elem (V:Vector; inicio:Indice):Indice VAR pos_menor, i:Indice Inicio pos_menor inicio i inicio+1 HASTA N HACER SI V[i] < V[pos_menor] ENTONCES pos_menor i FINSI FINPARA RESULTADO pos_menor Fin PROC Intercambiar ( x, y: TipoElemento) VAR aux: TipoElemento Inicio aux x x y y aux Fin

Resultado
16 64 80 90 96 120 200 320

16 64 80 90 120 320 200 96

N elementos

N-1 Intercambios

Metodologa de Programacin

Metodologa de Programacin

Ordenacin por Seleccin


PROC Seleccion( V:Vector) VAR i:Indice Inicio PARA i 1 HASTA N-1 HACER FINPARA Fin PROC subir_menor_seleccion ( V:Vector; posicion:Indice) VAR pos_menor:Indice Inicio pos_menor posicion_menor_elem(V, posicion+1) SI V[posicion] > V[pos_menor] ENTONCES intercambiar(V[posicion], V[pos_menor]) FINSI Fin

Ordenacin por Intercambio


Idea Clave: Comparar pares de elementos adyacentes e intercambiarlos entre s
1) Comparar VN y VN-1, si no estn ordenados, intercambiarlos 2) Comparar VN-1 y VN-2, repitiendo el proceso 3) El proceso continua hasta que cada elemento del haya sido comparado con sus elementos

Metodologa de Programacin

Metodologa de Programacin

Ordenacin por Intercambio


En el primer recorrido el elemento ms pequeo del array sube posicin a posicin hasta ocupar la
Ejemplo
72 64 72 64 50 23 85 18 37 99 8 45 50 72 64 50 23 85 18 37 8 99 45 23 72 64 50 23 85 18 8 37 99 45

Ordenacin por Intercambio


85 72 64 50 23 85 8 18 37 99 45 18 72 64 50 23 8 85 18 37 99 45 37 72 64 50 8 23 85 128 37 99 45 99 72 64 8 50 23 85 18 37 99 45 45 72 8 64 50 23 85 18 37 99 45 8 8 72 64 50 23 85 18 37 99 45

Paso1:
72 64 50 23 85 18 37 99 45 8

segundo recorrido el segundo elemento mayor llegar a la

N-1 Recorridos, N-i Comparaciones, N-i Intercambios como mximo (recorrido i)


Metodologa de Programacin

Metodologa de Programacin

Ordenacin por Intercambio


Paso2:
8 72 64 50 23 85 18 37 99 45 8 72 64 50 23 85 18 37 45 99 8 72 64 50 23 85 18 37 45 99 8 72 64 50 23 85 18 37 45 99 8 72 64 50 23 18 85 37 45 99 8 72 64 50 18 23 85 37 45 99 8 72 64 18 50 23 85 37 45 99 8 72 18 64 50 23 85 37 45 99 8 18 72 64 50 23 85 37 45 99

Ordenacin por Intercambio


PROC Intercambio (V:Vector) VAR i:Indice Inicio PARA i 1 HASTA N-1 HACER subir_menor_burbuja(V,i) FINPARA Fin PROC subir_menor_burbuja( V:Vector; posicion:Indice) VAR i:Indice Inicio PARA iN HASTA posicion+1 (PASO -1) HACER SI V[i-1] > V[i] ENTONCES intercambiar( V[i-1], V[i]) FINSI FINPARA Fin

Paso3,....., Paso9:
8 18 23 37 45 50 64 72 85 99

Metodologa de Programacin

Metodologa de Programacin

Ordenacin por Intercambio


Mejora
Eliminar recorridos innecesarios Elementos ya ordenados en un recorrido no se ha hecho ningn intercambio

Ordenacin por Intercambio


PROC Intercambio_2 ( V:Vector) VAR i:Indice intercambio:LOGICO aux:TipoElemento Inicio intercambio CIERTO i 1 MIENTRAS i N-1 intercambio HACER intercambio FALSO PARA j 1 HASTA N-i HACER SI V[j]>V[j+1] ENTONCES intercambioCIERTO aux V[j] V[j] V[j+1] V[j+1] aux FINSI FINPARA i i+1 FINMIENTRAS Fin

Metodologa de Programacin

Metodologa de Programacin

Bibliografa
Pascal y Estructuras de Datos. Dale, N. y Lilly, S. Ed. McGraw Hill 1989 Fundamentals of Data Structures in Pascal. Horowitz, E. y Sahni, S. Computer Science Press, 1994. Algoritmos y Estructuras de Datos. Wirth, N. Prentice-Hall, 1987. Estructuras de Datos en Pascal. Tenenbaum, A. y Augenstein, M. Prentice-Hall, 1983.
Metodologa de Programacin

También podría gustarte