Vous êtes sur la page 1sur 8

INSTITUTO TECNOLOGICO SUPERIOR DE HUATUSCO ESTRUCUTRA DE DATOS UNIDAD 6: METODOS DE BUSQUEDA HAIDE ING EN SISTEMAS COMPUTACIONALES LUIS ESTEBAN

CUACUA CHICUELLAR TERCER SEMESTRE "304B" VIERNES 16 DE DICIEMBRE CONTENIDO: INTRODUCCION. 6.METODOS DE BUSQUEDA 6.1 BUSQUEDA SECUENCIAL 6.2 BUSQUEDA BINARIA 6.3 BUSQUEDA POR FUNCIONES HASH CUADRO COMPARATIVO

INTRODUCION:

Es muy comun trabajar con grandes cantidades de datos almacenados en arrays y registros, y por ello ser necesario determinar si un array contiene un valor que coincida con un cierto valor clave(elemento a buscar). El proceso de encontrar un elemento especfico de un array se denomina bsqueda. En esta seccin se examinarn dos tcnicas de bsqueda: bsqueda lineal o secuencial, la tcnica ms sencilla, y bsqueda binaria o dicotmica, la tcnica ms eficiente.
UNIDA 6 6.1 BUSQUEDA SECUENCIAL METODOS DE BUSQUEDA

La bsqueda secuencial busca un elemento de una lista utilizando un valor destino llamado clave. En una bsqueda secuencial (a veces llamada busqueda lineal) los elementos de una lista o vector se exploran (se examinan) en secuencia, uno despus de otro. La bsqueda secuencial es necesaria, por ejemplo, si se desea encontrar la persona cuyo nmero de telfono es 958-

220000 en un directorio o listado telefnico de su ciudad. Los directorios de telfonos estn organizados alfabticamente por el nombre del abonado en lugar de por nmeros de telfono, de modo que deben explorarse todos los nmeros, uno despus de otro, esperando encontrar el nmero 958220000. El algoritmo de bsqueda secuencial compara cada elemento del array con la clave de bsqueda. Dado que el array no est en un orden prefijado, es probable que el elemento a buscar pueda ser el primer elemento, el ltimo elemento o cualquier otro. De promedio, al menos el programa tendr que comparar la clave de bsqueda con la mitad de los elementos del array. El mtodo de bsqueda lineal funcionar bien con arrays pequeos o no ordenados. La eficiencia de la bsqueda secuencial es pobre, tiene complejidad lineal, O(n). COMPLEGIDAD DE LA BUSQUEDA SECUENCIAL La complejidad de la bsqueda secuencial diferencia entre el comportamiento en el caso peor y mejor. El mejor caso se encuentra cuando aparece una coincidencia en el primer elemento de la lista y en ese caso el tiempo de ejecucin es O(1). El caso peor se produce cuando el elemento no est en la lista o se encuentra al final de la lista. Esto requiere buscar en todos los n trminos, lo que implica una complejidad de O(n). El caso medio requiere un poco de razonamiento probabilista. Para el caso de una lista aleatoria es probable que una coincidencia ocurra en cualquier posicin. Despus de la ejecucin de un nmero grande de bsquedas, la posicin media para una coincidencia es el elemento central n/2. El elemento central ocurre despus de n/2 comparaciones, que define el coste esperado de la bsqueda. Por esta razn, se dice que la prestacin media de la bsqueda secuencial es O(n). 6.2 BUSQUEDA BINARIA La bsqueda secuencial se aplica a cualquier lista. Si la lista est ordenada, la bsqueda binaria proporciona una tcnica de bsqueda mejorada. Una bsqueda binaria tpica es la bsqueda de una palabra en un diccionario. Dada la palabra, se abre el libro cerca del principio, del centro o del final dependiendo de la primera letra del primer apellido o de la palabra que busca. Se puede tener suerte y acertar con la pgina correcta; pero, normalmente, no ser as y se mueve el lector a la pgina anterior o posterior del libro. Por ejemplo, si la palabra comienza con J y se

est en la L se mueve uno hacia atrs. El proceso contina hasta que se encuentra la pgina buscada o hasta que se descubre que la palabra no est en la lista. Una idea similar se aplica en la bsqueda en una lista ordenada. Se sita la lectura en el centro de la lista y se comprueba si la clave coincide con el valor del elemento central. Si no se encuentra el valor de la clave, se sigue la bsqueda uno en la mitad inferior o superior del elemento central de la lista. En general, si los datos de la lista estn ordenados se puede utilizar esa informacin para acortar el tiempo de bsqueda.
Se desea buscar el elemento 225 y ver si se encuentra en el conjunto de datos siguiente: a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] 13 44 75 100 120 275 325 510

El punto central de la lista es el elemento a[3] (100). El valor que se busca es 225, mayor que 100; por consiguiente, la bsqueda contina en la mitad superior del conjunto de datos de la lista, es decir, en la sublista,
a[4] a[5] a[6] a[7] 120 275 325 510

Ahora el elemento mitad de esta sublista a[5] (275). El valor buscado, 225, es menor que 275 y, por consiguiente, la bsqueda contina en la mitad inferior del conjunto de datos de la lista actual; es decir, en la sublista de un nico elemento:
a[4] 120

El elemento mitad de esta sublista es el propio elemento a[4] (120). Al ser 225 mayor que 120, la bsqueda debe continuar en una sublista vaca. Se concluye indicando que no se ha encontrado la clave en la lista.
ALGORITMO DE BUSQUEDA BINARIA Suponiendo que la lista est almacenada como un array, los ndices de la lista son: bajo = 0 y alto = n-1 y n es el nmero de elementos del array, los pasos a seguir: 1. Calcular el ndice del punto central del array central = (bajo + alto)/2 (divisin entera) 2. Comparar el valor de este elemento central con la clave: clave clave clave bajo central alto Clave encontrada superior bajo central alto Bsqueda lista inferior bajo central alto Bsqueda lista

Si a[central] < clave, la nueva sublista de bsqueda tiene por

valores extremos de su rango bajo = central+1..alto. Si clave < a[central], la nueva sublista de bsqueda tiene por valores extremos de su rango bajo..central-1. clave clave |-----------|------------| |-----------|-------------| bajo central 1 = alto bajo = central + 1 alto El algoritmo se termina bien porque se ha encontrado la clave o porque el valor de bajo excede a alto y el algoritmo devuelve el indicador de fallo de 1 (bsqueda no encontrada). CODIGO DE ALGORITMO DE BUSQUEDA
/* bsqueda binaria. devuelve el ndice del elemento buscado, o bien -1 caso de fallo */ int busquedaBin(int lista[], int n, int clave) { int central, bajo, alto; int valorCentral; bajo = 0; alto = n-1; while (bajo <= alto) { central = (bajo + alto)/2; /* ndice de elemento central */ valorCentral = lista[central]; /* valor del ndice central */ if (clave == valorCentral) return central; /* encontrado, devuelve posicin */ else if (clave < valorCentral) alto = central -1; /* ir a sublista inferior */ else bajo = central + 1; /* ir a sublista superior */ } return -1; /* elemento no encontrado ANALISIS DE LA BUSQUEDA BINARIA

El caso mejor se presenta cuando una coincidencia se encuentra en el punto central de la lista. En este caso la complejidad es O(1) dado que slo se realiza una prueba de comparacin de igualdad. La complejidad del caso peor es O(log2 n) que se produce cuando el elemento no est en la lista o el elemento se encuentra en la ltima comparacin. Se puede deducir intuitivamente esta complejidad. El caso peor se produce cuando se debe continuar la bsqueda y llegar a una sublista de longitud de 1. Cada iteracin que falla debe continuar disminuyendo la longitud de la sublista por un factor de 2. El tamao de las sublistas es: n n/2 n/4 n/8 . . . 1 La divisin de sublistas requiere m iteraciones, en cada iteracin el tamao de la sublista se reduce a la mitad. La sucesin de tamaos de las sublistas hasta una sublista de longitud 1:

n n/2 n/2 n/23 n/24 . . . n/2m siendo n/2m = 1. Tomando logaritmos en base 2 en la expresin anterior quedar: n = 2m m = log2 n Por esa razn la complejidad del caso peor es O(log2 n). Cada iteracin requiere una operacin de comparacin: Total comparaciones ] 1 + log2 n 6.3 BUSQUEDA POR FUNCIONES HASH El mtodo llamado por transformacin de claves (hash), permite aumentar la velocidad de bsqueda sin necesidad de tener los elementos ordenados. Cuenta tambin con la ventaja de que el tiempo de bsqueda es prcticamente independiente del nmero de componentes del arreglo. Trabaja basndose en una funcin de transformacin o funcin hash (H) que convierte una clave en una direccin (ndice) dentro del arreglo. direccin H(clave) Cuando se tienen claves que no se corresponden con ndices (p. ejem. por ser alfanumricas), o bien cuando las claves son valores numricos muy grandes, debe utilizarse una funcin hash que permita transformar la clave para obtener una direccin apropiada. Esta funcin hash debe de ser simple de calcular y debe de asignar direcciones de la manera mas uniforme posible. Es decir, dadas dos claves diferentes debe generar posiciones diferentes. Si esto no ocurre (H(K1)=d,H(K2)=d y K1K2), hay una colisin. Se define, entonces, una colisin como la asignacin de una misma direccin a dos o ms claves distintas. Por todo lo mencionado, para trabajar con este mtodo de bsqueda debe elegirse previamente: Una funcin hash que sea fcil de calcular y que distribuya uniformemente las claves. Un mtodo para resolver colisiones. Si estas se presentan se debe contar con algn mtodo que genere posiciones alternativas.

FUNCION POR MODULO(por divisin) Consiste en tomar el residuo de la divisin de la clave entre el numero de componentes del arreglo. La funcin hash queda definida por la siguiente formula: H(K) = (K mod N) + 1 Se recomienda que N sea el numero primo inmediato inferior al numero total de elementos. FUNCION CENTRO DE CUADRADOS

Consiste en elevar al cuadrado la clave y tomar los dgitos centrales como direccin. El numero de dgitos a tomar queda determinado por el rango del ndice. La funcin hash que definida por la sig. formula: H(K) = digitos_centrales (K) + 1 FUNCION PLEGAMIENTO Consiste en dividir la clave en partes de igual numero de dgitos (la ultima puede tener menos dgitos) y operar con ellas, tomando como direccin los dgitos menos significativos. La operacin entre las partes puede hacerse por medio de sumas o multiplicaciones. La funcin hash queda definida por la sig. formula: H(K) = digmensig ((d1...di) + (di + 1...dj) + ... + (d1...dn)) + 1 FUNICON TRUNCAMIENTO Consiste en tomar algunos dgitos de la clave y formar con ellos una direccin. La funcin hash queda definida por la sig. frmula: H(K) = elegirdigitos (d1,d2...dn) + 1 CODIGO DE BUSQUEDA POR FUNCION HASH
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace WindowsApplication1 { public partial class Form1 : Form { private int[] datos = new int[5] {1679, 4567, 8471, 0435, 5033 }; private int[] hash = new int[7]; private int[] enlace = new int[7]; public Form1() { InitializeComponent(); for (int b = 0; b <= 6; b++) { enlace[b] = -9999; } //Reacomodo por hash int r, aux=0; for (int i = 0; i <= 4; i++) { r= datos[i] % 7; if (datos[i] == 0) { hash[r] = datos[i];

} else { for(int s=0;s<=6;s++) { if(hash[s]==0) { aux=s; } } hash[aux]=datos[i]; enlace[r] = aux; } } } private void buscar_Click(object sender, EventArgs e) { int temp,r; temp = int.Parse(textBox1.Text.ToString()); r = temp % 7; if (temp == hash[r]) { MessageBox.Show("Se encuentra en \nel renglon:" + r.ToString(), "Resultado"); } else { while(enlace[r] != -9999) { if (temp == hash[enlace[r]]) { MessageBox.Show("Se encuentra en \nel renglon:" + enlace[r].ToString(), "Resultado"); r = enlace[r]; } } } } } }

CUADRO COMPARATIVO busqueda secuencial: -se explora en secuencia uno al otro -es nesesario recorrer todod lo elementos del vector -compara cada elemento del array con la clave a buscar -es muy probable que el elmento a buscar sea el primero. -funciona mejor con arrays pequeos o no ordenados busqueda binaria: -tiene que estar ordenada lalista para que sea mas eficiente. -nesecita tener la lista ordenada para que se acorte el tiempo de busqueda.}

busqueda hash: -su busqueda es mas velos sin nesecidad de tener el array ordenado. -hace una trasformacion cambiando los elementos del array por un indice. -depende de cada problema y de cada finalidad. -nesecita ser una lista ligada. -no hace falta poner restriciones al tamao del arreglo

Vous aimerez peut-être aussi