Metodos Busqueda Interna

Post on 13-Jun-2015

12.070 views 3 download

Transcript of Metodos Busqueda Interna

ESTRUCTURAS DE DATOS II

1. Introducción 2. Búsqueda3. Búsqueda interna4. Búsqueda externa

INTRODUCCIÓN

La búsqueda: Es una operación que nos permite

recuperar información previamente almacenada

El resultado puede ser éxito (encuentra)

Ó fracaso en caso (no se encuentra)

Búsqueda

Se puede realizar sobre:

Elementos ordenados

Elementos desordenados

Búsqueda

Se pueden clasificar en:

• Búsqueda Interna: Cuando los elementos se encuentran en memoria principal

•Búsqueda externa: Cuando todos los elementos se encuentran en memoria secundaria

Búsqueda Interna

Este tipo de búsqueda trabaja con elementos residentes en memoria principal

• Estructuras estáticas (arreglos)

• Estructuras dinámicas (listas encadenadas y árboles)

Búsqueda Interna

Los métodos de búsqueda interna más importantes son:

• Búsqueda Secuencial (Lineal)

• Búsqueda Binaria

• Por transformación de Claves (Hash)

• Árboles de búsqueda

Búsqueda Secuencial

Consiste en revisar elemento por elemento de la estructura de datos hasta encontrar el dato más buscado ó hasta llegar al final de la lista de datos disponibles

• Búsqueda Secuencial en Arreglo Desordenado

• Búsqueda Secuencial en Arreglo Ordenado

• Búsqueda Secuencial en Lista Enlazada Desordenada

• Búsqueda Secuencial en Lista Enlazada Ordenada

Búsqueda SecuencialSecuencial Desordenado1 (V, N ,X){Este algoritmo busca secuencialmente el elemento X en el arreglo desordenado V, de N elementos }{ I es una variable de tipo entero, BANDERA es una variable de tipo Booleano}1. I=1 y BANDERA=Falso2. Repetir mientras (I N) y (BANDERA=FALSO) 2.1 Si V[I] = x entonces Hacer BANDERA =VERDADERO si no Hacer I =I + 1 2.2 {Fin del condicional del paso 2.1}3. {Fin del ciclo des paso 2}4. Si BANDERA = VERDADERO entonces Escribir "El elemento esta en la posición I" si no Escribir "El elemento no esta en el arreglo"5. {Fin del condicional del paso 4}

Búsqueda SecuencialSecuencial Desordenado2 (V, N ,X){Este algoritmo busca secuencialmente el elemento X en el arreglo desordenado V, de N elementos}{ I es una variable de tipo entero}1. I=12. Repetir mientras (I N) y (V[I] X) Hacer I =I + 13. {Fin del condicional del paso 2}4. Si (I>N) entonces Escribir "El elemento no esta en el arreglo" si no Escribir "El elemento esta en la posición I"5. {Fin del condicional del paso 4}

Búsqueda SecuencialSecuencial Ordenado (V, N ,X){Este algoritmo busca secuencialmente el elemento X en el arreglo ordenado V, de N elementos, El arreglo esta ordenado ascendentemente V[1] V[2] … V[N]}{ I es una variable de tipo entero}

1. I=12. Repetir mientras (I N) y (X > V[I]) Hacer I =I + 13. {Fin del condicional del paso 2}4. Si (I>N) o (X<V[I]) entonces Escribir "El elemento no esta en el arreglo" si no Escribir "El elemento esta en la posición I"5. {Fin del condicional del paso 4}

Búsqueda SecuencialSecuencial _Listas (P ,X){Este algoritmo busca secuencialmente el elemento X en la lista cuyo nodo inicial está apuntado por P }{ Q es una variable puntero de tipo entero}

1. Q=P 2. Repetir mientras (QNULL) y (QINFO X ) Hacer Q = QLIGA3. {Fin del condicional del paso 2}4. Si (Q = NULL) entonces Escribir "El elemento no esta en la lista" si no Escribir "El elemento esta en la lista"5. {Fin del condicional del paso 4}

Búsqueda Secuencial BINARIABinaria (V, N ,X){Este algoritmo busca secuencialmente el elemento X en el arreglo ordenado V, de N elementos}{ Izq, Cen y Der son variables de tipo entero, Bandera es una variable de tipo booleano }1. Izq=1, Der=N; y Bandera=FALSO2. Repetir mientras (Izq Der) y (Bandera = FALSO) Hacer Cen = Parte Entera ((Izq + Der)/2)

2.1 Si X=V[Cen] Entonces Hacer Bandera=VERDADERO; si no {Redefinir intervalo de búsqueda}

2.1.1 Si (X>V[Cen]) Entonces Hacer Izq=CEN+1 Si no Hacer Der=Cen-1

2.1.2 {Fin del paso 2.1.1}2.2{fin del condicional del paso 2.1}

3. {Fin del ciclo del paso 2}4. Si (Bandera = Verdadero) Entonces Escribir " El elemento esta en la posición Cen" Si no Escribir " El elemento no esta en el arreglo"5. {Fin del condicional del paso 4}

Búsqueda por Transformación de Claves (Hash)

Este método permite asignar a un valor una posición determinada de un arreglo y de igual forma permite recuperarla fácilmente.

Convierte una clave dada en una dirección (índice), dentro del arreglo.

Búsqueda por Transformación de Claves (Hash)

Dos pasos:

1. Consiste en la aplicación de una función de transformación o función hash a los valores que se van a insertar, para saber en que posición del arreglo quedarán

2. Un método para resolver colisiones, el hecho de que dos valores distintos sean asignados a la misma dirección del arreglo por causa de la función hash, hecho que se conoce como colisión.

Búsqueda por Transformación de Claves (Hash)

• La recuperación de colisiones, consiste en como reasignar y recuperar un valor que por motivo de la función hash quede en la misma posición de otro.

H (K1) = d donde K1 K2

H (K2) = d

Existen varios métodos:• Función Modulo• Función Cuadrática• Función Truncamiento• Función Plegamiento

Transformación de Claves (Hash)

• La recuperación de colisiones, consiste en como reasignar y recuperar un valor que por motivo de la función hash quede en la misma posición de otro.

Existen varios métodos:

• Función Modulo• Función Cuadrática• Función Truncamiento• Función Plegamiento

Función Modulo (Por división)Consiste en tomar el residuo de la división de la clave entre el número de componentes del arreglo. Suponga que se tiene un arreglo de N elementos y K es la clave del dato a buscar.

La función hash queda:

H(k) = (K mod N) +1

Para lograr una mayor uniformidad en la distribución, N debe ser un número primo. (El número primo próximo a N)

Función Modulo (Por división)Sea N=100,el tamaño del arregloSus direcciones de 1-100.

Sea K1 = 7259 K2 = 9359Dos claves que deban asignarse posiciones en

el arreglo

H(K1) = (7259 mod 100) +1=60 H(K2) = (9359 mod 100) +1=60Donde H(K1) es igual a H(K2) y K1 es distinto

de K2, es una colisión

Función Modulo (Por división)

Se aplica N igual a un valor primo en lugar de utilizar N=100

H(K1) = (7259 mod 97) +1=82 H(K2) = (9359 mod 97) +1=48

Con N=97 se ha eliminado la colisión

Función CuadradoConsiste en elevar al cuadrado la clave y tomar los dígitos centrales como dirección.

El número de dígitos a tomar queda determinado por el rango del índice.

La función hash queda:

H(k) = dígitos centrales (K 2) +1

Para lograr una mayor uniformidad en la distribución, N debe ser un número primo. (El número primo próximo a N)

Función CuadradoSea N=100,el tamaño del arregloSus direcciones de 1-100.

Sea K1 = 7259 K2 = 9359Dos claves que deban asignarse posiciones en

el arreglo

H(K12) = dígitos_centrales(52693081) +1 = 94

H(K22) = dígitos_centrales (87590881) +1 =

91

Función Plegamiento

Consiste en dividir la clave en partes de igual número de dígitos (La última puede tener menos dígitos) y operar con ellos tomando como dirección los dígitos menos significativos.

La operación entre las partes puede hacerse por medio de sumas o multiplicaciones.

H(k)=digitos_menos_significativos((d1..di)+(di+1..dj)+...+(d1..dn))+1

Función PlegamientoSea N=100,el tamaño del arregloSus direcciones de 1-100. Sea K1 = 7259

K2 = 9359Dos claves que deban asignarse posiciones en el

arreglo

H(K12) = DígitosMenosSignificativos(72+59)+1 =

(131)+1=32H(K2

2) = DígitosMenosSignificativos(93+59)+1 = (152)+1=53

Se toman solamente dos dígitos, por que el arreglo va de 1 a 100

Función TruncamientoConsiste en tomar algunos de la clave y formar con ellos una dirección.

Este método es de los más sencillos, pero es también de los que ofrece menos uniformidad en la distribución de las claves.

Se pueden elegir los dígitos de las posiciones pares o impares. H(k) = elegir_digitos(d1,d2,...,dn)+1

Función Truncamiento

Sea N=100,el tamaño del arregloSus direcciones de 1-100.

Sea K1 = 7 259 K2 = 9 359Dos claves que deban asignarse posiciones en

el arreglo H(K1

2) = Elegir_dígitos(7259) +1 = 76 H(K2

2) = Elegir_dígitos(9359) +1 = 96

Se toman el primer y tercer número de la clave y se une de izquierda a derecha

Soluciones de colisiones

Existe una colisión cuando hay una sola dirección para dos claves diferentes.

• Hay un costo excesivo para resolver colisiones

Métodos:• Reasignación

• Arreglos anidados

• Encadenamiento

Reasignación

Existe varios enfoques que trabajan bajo el principio de comparación y reasignación de elementos:

Enfoques de reasignación:

1.Prueba lineal

2.Prueba cuadrática

3.Doble dirección hash

Prueba Lineal

Consiste en recorre el arreglo secuencialmente a partir del punto de colisión, buscando el elemento

Concluye:

• El elemento es hallado

• Se encuentra en una posición vacía

El arreglo se considera como una estructura circular

El siguiente elemento después del último es el primero

PRUEBA LINEAL

PruebaLinal (V, N ,K){Este algoritmo busca el dato con clave K en el arreglo V de N elementos. Resuelve el

problema de las colisiones por medio de la prueba lineal}{ D y DX son variables de tipo entero}1. D=H[K] {Genera dirección}2. Si (V[D] == K) entonces Escribir “El elemento esta en la posición D”

Si no Hacer DX=D+1;

2.1 Repetir mientras (DX <= N) y (V[DX]<> K) y (V[DX]<>VACIO) y (DX<>D) Hacer DX=DX+1;

2.1.1 Si (DX==N+1) Entonces Hacer DX=1 Si no Hacer Der=Cen-1

2.1.2 {Fin del paso 2.1.1}2.2{fin del ciclo del paso 2.1}

2.3 Si (V[DX] == K) entonces Escribir “El elemento esta en la posición DX”

Si no Escribir “El elemento no está en el arreglo” 2.4{ Fin del condicional del paso 2.3}3 {Fin del condicional del paso 2}

Prueba Lineal

Ejemplo:

V=[25, 43, 56, 35, 54, 13, 80, 104]

Usando la función hash:

H(K)= (k mod 10) +1

Prueba LinealEjemplo:V=[25, 43, 56, 35, 54, 13, 80,

104]H(K)= (k mod 10)

+143

54

25

56

8

104

13

35

K H(K)

25 6

43 4

56 7

35 6

54 5

13 4

80 1

104 5

3

4

5

2

6

7

1

10

9

8

Prueba Cuadrática

Funciona similar a la prueba lineal, pero con saltos cuadráticos de las direcciones que se generarán:

Ejemplo:

• D+(1) 2, D+(2) 2, D+(3) 2,+…D+i2• D+1, D+4, D+9, …D+i2

Permite una mejor distribución de las claves colisionadas

Desventaja:• Pueden quedar casillas sin visitar, además resulta

difícil definir una condición general para detener el ciclo.

• Se puede utilizar una variable auxiliar, que dirija el recorrido de tal forma que garanticen que serán visitadas todas las casillas.

Prueba Cuadrática

Prueba Cuadrática

Ejemplo:

V=[25, 43, 56, 35, 54, 13, 80, 104, 55]

Usando la función hash:H(K)= (k mod 10) + 1

D I DX

6 12

710

Solución de colisiones por la prueba cuadrática K=35

PruebaCuadratica (V, N ,K){Este algoritmo busca el dato con clave K en el arreglo V de N elementos. Resuelve el

problema de las colisiones por medio de la prueba cuadrática}{ D, DX e I son variables de tipo entero}1. D=H[K] {Genera dirección}2. Si (V[D] == K) entonces Escribir “El elemento esta en la posición D”

Si no Hacer I = 1 y DX = D + I2;

2.1 Repetir mientras (V[DX] <> K) y (V[DX]<>VACÍO) Hacer I = I + 1; DX = D + I2 ;

2.1.1 Si (DX > N) Entonces Hacer I=0; DX=1 y D=1;

2.1.2 {Fin del paso 2.1.1}2.2{fin del ciclo del paso 2.1}

2.3 Si (V[DX] == K) entonces Escribir “El elemento esta en la posición DX”

Si no Escribir “El elemento no está en el arreglo” 2.4{ Fin del condicional del paso 2.3}3 {Fin del condicional del paso 2}

Prueba Cuadrática

Doble Dirección

• Consiste en una colisión detectada, para generar otra dirección aplicando una función hash a la dirección previamente obtenida.

• El proceso termina cuando el elemento es encontrado o existe una posición vacía

Doble DirecciónEjemplo:V=[25, 43, 56, 35, 54, 13, 80,

104]H(K)= (k mod 10)

+1 43

54

25

56

80

13

104

35

3

4

5

2

6

7

1

10

9

8

K H(K) H’ (D)

H’(D’)

H’ (D´´)

25435635541380

104

64765415

---8-6-7

-----8-9

-----

10--

Se define una función Hash H´ para calcular direcciones alternativas cuando haya colisiones

H’(D)=((D+1) mod 10) + 1

Doble Dirección

DobleDireccion(V, N ,K){Este algoritmo busca el dato con clave K en el arreglo V de N elementos. Resuelve el

problema de las colisiones por medio de la doble dirección hash}{ D y DX son variables de tipo entero}1. D=H[K] {Genera dirección}2. Si (V[D] == K) entonces Escribir “El elemento esta en la posición D”

Si no Hacer DX = H’ (D);

2.1 Repetir mientras (DX <=N) y (V[DX]<> K) y (V[DX]<>VACÍO) y (DX<>D) Hacer DX = H’ (DX) ;

2.2{fin del ciclo del paso 2.1} 2.3 Si (V[DX] == K) entonces Escribir “El elemento esta en la posición DX”

Si no Escribir “El elemento no está en el arreglo” 2.4{ Fin del condicional del paso 2.3}3 {Fin del condicional del paso 2}

Doble Dirección

En cada elemento del arreglo tenga otro arreglo, donde se almacenan los elementos colisionados

• Solución ineficiente• costo de memoria• Número de valores colisionados

ARREGLOS ANIDADOS

Arreglos Anidados

Ejemplo:V=[25, 43, 56, 35, 54, 13, 80, 104]

Usando la función hash:H(K)= (k mod 10) +1

80 - - - -

--

43542556---

--

1310435----

---------

---------

---------

Cada elemento del arreglo tiene un apuntador a una lista ligada, la cual se irá generando e ira almacenando los valores colisionados

Es un método eficiente debido al dinamismo de las listas

Desventajas:• Ocupa un espacio adicional al de la tabla• Se requiere manejo de lista ligada• Si la lista crecen demasiado se pierde el acceso directo del método hash

ENCADENAMIENTO

EncadenamientoEjemplo:V=[25, 43, 56, 35, 54, 13, 80, 104]Almacenados usando la función hash:

H(K)= (k mod 10) +143

54

25

80

56

13

104

3525 6

43 4

56 7

35 6

54 5

13 4

80 1

104 5

K H(K)

En el curso de Estructuras de Datos I, se analizó el uso de los árboles como una estructura eficiente y poderosa para almacenar y recuperar información.

Para los métodos de búsqueda se refiere a la estructura trie, como una variante de la estructura tipo árbol

Un trie es una estructura similar a un árbol con N raíces, donde cada nodo del árbol puede ser un trie

Arboles de Búsqueda

Arboles de búsqueda

AB

C D E H P ST

NTE

AJOA O E N A

RAS

E I OA O

BE

N

TRA

SDE

STA CIA

TRE

GUN

BRE

M

ARA R

Representación de Tries

Arboles de búsqueda

AB

C D E H P ST

N A

A OE N A

R

E I OA O

BE

NTRA

SDE

STA CIA

GUNBRE

N

ARA

R

Representación de un trie con discriminación 2

TE JO

TRE

RAS

Arboles de búsqueda

NTE

A N

BE

NSDE

Representación del trie como Bosque

AJO

A B C

O

TRA

D

E

E

TRE

A

H

CIA

STA

A

RA

R

P

O E

GUN

N

S

I O

BRE

RAS

T

Arboles de búsqueda

NTE

A

N

BE

N

SDE

Representación del bosque como árbol binario

AJO

A

B

C

O

TRA

D

E

E

TRE

A

H

CIA

STA

RAS

T

A

RA

R

P

O

E

GUN

N

S

I

O

BRE