Busquedas en Vectores

11
Gustavo P. Brito S. Jesús A. Lanza G.

description

conceptos, usos y ejemplos de algunos metodos de busquedas en vectores dentro de los lenguajes de programacion

Transcript of Busquedas en Vectores

Page 1: Busquedas en Vectores

Gustavo P. Brito S. Jesús A. Lanza G.

Page 2: Busquedas en Vectores

INDICE CONTENIDO

INTRODUCCION........................................................... i DEFINICION............................................................... 1 BUSQUEDA SECUENCIAL......................................... 2

EJEMPLO.................................................................. 3 BUSQUEDA BINARIA.................................................. 5

EJEMPLO.................................................................. 6 DIFERENCIAS.............................................................. 7 VENTAJAS Y DESVENTAJAS....................................... 7 BUSQUEDA POR TRANSFORMACION DE CLAVE.. 7

RESTAS SUCESIVAS………………………………… 8 EJEMPLO………………………………………….. 8

ARITMETICA MODULAR…………………………… 8 EJEMPLO………………………………………….. 9

MITAD DEL CUADRADO……………………………. 10 EJEMPLO………………………………………….. 10

TRUNCAMIENTO……………………………………… 10 EJEMPLO………………………………………….. 11

PLEGAMIENTO………………………………………… 11 EJEMPLO………………………………………….. 11

VENTAJAS Y DESVENTAJAS…………………………… 12 BUSQUEDA POR INTREPOLACION…………………. 13

VENTAJAS……………………………………………… 14 DESVENTAJAS………………………………………… 15

CONCLUSIONES………………………………………….. 16 BIBLIOGRAFIAS…………………………………………... 17

BIBLIOGRAFIA DE IMÁGENES………………………. 18

INTRODUCCION La búsqueda es una actividad

relevante de la vida, en el mundo que hoy se vive es desarrollado, automatizado, y la información representa un elemento de vital importancia. Es necesario estar informados y, por lo tanto, buscar y recuperar la información son tareas esenciales, se buscan números telefónicos en un directorio, ofertas laborales es un periódico, libros es una biblioteca entre otros.

Un algoritmo de búsqueda es un

algoritmo que acepta un argumento a y trata de encontrar uno o varios elementos particulares de un gran volumen de información previamente almacenada (e.g., buscar un elemento contenido en una lista). La información típicamente está almacenada en registros que contienen una clave y la data. El objetivo de la operación de búsqueda es encontrar todos los registros cuyas claves coincidan con una cierta clave especificada con el propósito de acceder a la información (no sólo a la clave) para su procesamiento. El algoritmo puede dar como resultado el registro entero o, lo que es más común, un apuntador a dicho registro.

Si la búsqueda es infructuosa,

con mucha frecuencia, es deseable agregar un nuevo registro con dicho argumento como llave. Un algoritmo que haga esto se le llama tabla búsqueda o diccionario.

i

Page 3: Busquedas en Vectores

Los métodos de búsqueda nos permiten recuperar información de un vector o un archivo, que contenga una lista de datos. Por ejemplo se puede obtener el nombre y el número telefónico de nuestra agenda de contactos o la nota obtenida por un alumno en la lista de un curso.

Cuando se realizan búsquedas sobre vectores, se desea es encontrar la posición que ocupa el elemento buscado dentro de la lista de elementos que contiene el vector. Para la búsqueda de información en archivos es necesario realizar la búsqueda a partir de un campo clave dentro del archivo.

Una vez que se encuentra el elemento, la identificación de su información correspondiente es un problema menor. Por consiguiente, nos centraremos en el proceso de búsqueda. Supongamos que se desea buscar el vector X [1]… X [n], que tiene componentes numéricos, para ver si contiene o no un número dado.

Si en vez de tratar sobre vectores, se desea buscar información en un archivo; debe realizarse la búsqueda a partir de un determinado campo de información denominado campos claves. Así en el caso de archivos de empleados de una empresa, el campo clave puede ser el número de DNI o los apellidos.

La búsqueda por claves para localizar registros es, con frecuencia, una de las acciones de mayor consumo de tiempo conlleva y, por consiguiente, el modo en que los registros están dispuestos y la elección del modo utilizado para la búsqueda pueden redundar en una diferencia sustancial en el rendimiento del programa.

El problema de búsqueda cae naturalmente de los casos típicos ya tratados. Si existen muchos registros, pueden ser necesario almacenarlo en archivos de discos o cintas, externo a la memoria de la computadora. Este caso se llama Búsqueda Externa. En el otro caso los registros que se buscan se almacenan por completo dentro de la memoria de la computadora, este caso se llama Búsqueda Interna.

En la práctica, la búsqueda se refiere a la operación de encontrar la posición de un elemento entre un conjunto de elementos dados: lista, tabla o fichero.

Ejemplos típicos de búsquedas son:

Localizar nombre y apellido de un alumno, localizar número de teléfono de una agenda, etc.

Existen diferentes algoritmos de búsqueda. El algoritmo elegido depende de la forma en que se encuentren organizados los datos.

La operación de búsqueda de un elemento N en un conjunto de elementos consiste en:

Determinar si N pertenece al conjunto y en ese caso indicar su posición en el.

Determinar si N no pertenece al conjunto.

Método de Búsqueda Secuencial

Supongamos que una lista de elementos almacenados en un vector (array unidimensional). El método sencillo de buscar un elemento en un vector es explorar secuencialmente el vector, o dicho entre otras palabras recorrer el vector desde el primer elemento hasta el último. Si se encuentra el elemento buscado visualizar un mensaje similar a „fin de búsqueda‟, en caso contrario visualizar un mensaje similar a „elemento no existe en la lista‟.

1 2

Page 4: Busquedas en Vectores

En otras palabras, la búsqueda secuencial compara cada elemento del vector con el valor deseado, hasta que este se encuentra o se termina de leer el vector completo. La búsqueda secuencial no requiere ningún requisito por parte del vector y, por consiguiente, no necesita estar ordenado. El recorrido del vector se realizará normalmente con estructuras repetitivas.

Este método se usa para buscar un elemento de un vector, es explorar secuencialmente el vector, es decir; recorrer el vector desde el primer elemento hasta el último. Si se encuentra el elemento buscado se debe visualizar un mensaje similar a “Fin de Búsqueda” o “Elemento encontrado” y otro que diga “posición=” en caso contrario, visualizar un mensaje similar a “Elemento no existe en la Lista”.

Ejemplo:

Valor a buscar en el arreglo

A: VALOR = 33

Primera iteración: A[1]=1 <> VALOR A=

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

Segunda iteración: A[2]=11 <> VALOR A=

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

Tercera iteración: A[3]=21 <> VALOR A=

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

Cuarta iteración: A[4]=25 <> VALOR

A=

Quinta iteración: A[5]=26 <> VALOR

A=

Sexta iteración: A[6]=33 = VALOR

A=

Si el valor NO se encuentra en el arreglo, entonces se recorre todo el arreglo, posición a posición hasta agotar los elementos. En este caso, siempre se cumple que A[i] <> VALOR.

Esta técnica de búsqueda es cuando se tiene una base de datos no muy grande en un negocio pequeño donde los registros más usados son llamados con frecuencia , es aquí donde esta técnica es fuerte, ya que se aplica a un patrón de búsqueda pequeño, sencillo y manejable; es decir como si fuera una descripción, es uno tras otro.

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

i=1

i=2

i=3

i=4

i=5

i=6

3 4

Page 5: Busquedas en Vectores

Método de Búsqueda Binaria

La búsqueda binaria utiliza un método de „divide y vencerás‟ para localizar el valor deseado. Con este método se examina primero el elemento central de la lista; si este es el elemento buscado, entonces la búsqueda ha terminado. En caso contrario, se determina si el elemento buscado está en la primera o en la segunda mitad de la lista y a continuación se repite este proceso, utilizando el elemento central de esa sublista.

El proceso de búsqueda debe terminar normalmente conociendo si la búsqueda ha tenido éxito (se ha encontrado el elemento o bien no ha tenido éxito) no se ha encontrado el elemento, normalmente se deberá devolver la posición del elemento buscado dentro del vector.

La búsqueda binaria permite buscar valores más eficientemente que la búsqueda secuencial, sin embargo, el método requiere que la información sobre la cual se va a buscar este ordenada.

El método se basa en el conocimiento de la información. Al estar ésta ordenada puede descartarse la mitad que se sabe no es posible que este la información.

Ejemplo:

Valor a buscar en el arreglo A: VALOR = 48

Primera iteración: A[m]=59 <> VALOR

A=

VALOR < A[m] se descarta la segunda

mitad

Segunda iteración: A[m]=38 <> VALOR

A=

VALOR > A[m] se descarta la primera

mitad

Tercera iteración: A[m]=50 <> VALOR A=

VALOR < A[m] se descarta la segunda

mitad

Cuarta iteración: A[m]=48 = VALOR A=

Termina la búsqueda, VALOR se encuentra

en posición: m

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

1 11 21 25 26 33 38 40 42 48 50 56 59 60 62 64 67 72 76 77 86 88 92 94 97

i=1 m=13 j=25

i=1 m=7 j=12

j=12 m=11 i=8

i=8

m=10

j=10

5 6

Page 6: Busquedas en Vectores

Diferencias fundamentales

Secuencial Binaria

El vector debe estar ordenado. No requiere ningún requisito por parte del vector.

Compara cada elemento del vector con el que se desea encontrar.

Divide el espacio ocupado por el vector en sucesivas mitades, hasta encontrar el elemento deseado.

Se examina el primer vector partiendo del primer elemento hasta llegar al último.

Se examina el vector partiendo desde el elemento central de la lista.

Consume excesivo tiempo en la localización del elemento designado, por ello es recomendable para vectores de pocos datos.

Eficiente con relación al tiempo, si el vector esta ordenado por ello, por ello es recomendable para conjunto de grandes datos.

Ventajas y desventajas

Secuencial Binaria

Consumo excesivo de tiempo en la localización del elemento a encontrar si el vector contiene grandes cantidades de elementos, ya que recorre todo el vector.

No es necesario que el vector este ordenado.

No es factible para vectores con grandes números de elementos.

Divide el espacio ocupado por el vector en sucesivas mitades, hasta encontrar el elemento buscado.

Recorre todo el vector, desde el primero hasta el último elemento.

Se examina primero el elemento central de la lista o sublista.

Es necesario que el vector este ordenado.

Factible para vectores con grandes cantidades de elementos.

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

Este método permite aumentar la velocidad de búsqueda sin necesidad de tener los elementos ordenados. Consiste en asignar el índice a cada elemento mediante una transformación del elemento, esto se hace mediante una función de conversión llamada función hash. Hay

diferentes funciones para transformar el elemento y el número obtenido es el índice del elemento.

La principal forma de transformar el

elemento es asignarlo directamente, es decir al 0 le corresponde el índice 0, al 1 el 1, y así sucesivamente pero cuando los elementos son muy grandes se desperdicia mucho espacio ya que necesitamos arreglo grandes para almacenarlos y estos quedan con muchos espacios libres, para utilizar mejor el espacio se utilizan funciones más complejas.

La función de hash ideal debería ser biyectiva, esto es, que a cada elemento le corresponda un índice, y que a cada índice le corresponda un elemento, pero no siempre es fácil encontrar esa función, e incluso a veces es inútil, ya que puedes no saber el número de elementos a almacenar. La función de hash depende de cada problema y de cada finalidad, y se pueden utilizar con números o cadenas, pero las más utilizadas son:

1. Restas sucesivas: Esta función se emplea con claves numéricas entre las que existen huecos de tamaño conocido, obteniéndose direcciones consecutivas. Ejemplo Los alumnos de ingeniería en sistemas que entraron en el año 2005 sus números de control son consecutivos y está definido el número de alumnos.

05210800 −05210800>>>> 0 05210801 −05210800>>>> 1 05210802 −05210800>>>> 2

… 05210899 −05210800>>>> 99

2. Aritmética modular: El índice de un

número es resto de la división de ese número entre un número N

7 8

Page 7: Busquedas en Vectores

prefijado, preferentemente primo. Los números se guardarán en las direcciones de memoria de 0 a N-1. Este método tiene el problema de que dos o más elementos pueden producir el mismo residuo y un índice puede ser señalado por varios elementos. A este fenómeno se le llama colisión. Si el número N es el 7, los números siguientes quedan transformados en:

1679 >>> 6 4567 >>> 3 8471 >>> 1 0435 >>> 1 5033 >>> 0

Mientras más grande sea número de elementos es mejor escoger un número primo mayor para seccionar el arreglo en más partes. El número elegido da el número de partes en que se secciona el arreglo, y las cada sección está compuesta por todos los elementos que arrojen el mismo residuo, y mientras más pequeñas sean las secciones la búsqueda se agilizara mas que es lo que nos interesa. Ejemplo Sean N= 100 el tamaño del arreglo, y sean sus direcciones los números entre 1 y 100. Sean K1= 7259 y K2= 9359 dos claves a las que deban asignarse posiciones en el arreglo. Se aplica la formula H(k)= (K mod N) + 1, con N= 100 para calcular las direcciones de K1, y K2. El resultado queda:

H(K1)= (7259 mod 100) + 1= 60 H(K2)= (9359 mod 100) + 1= 60

Como H(K1) es igual a H(K2) y K1 es distinto de K2, se está ante una colisión. Se aplica la misma fórmula H(k)= (K mod N) + 1, con N igual a

un valor primo en vez de utilizar N= 100. Con N= 97

El resultado queda:

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

Se he eliminado la colisión.

3. Mitad del cuadrado: Consiste en

elevar al cuadrado la clave y coger las cifras centrales. Este método también presenta problemas de colisión:

709^2=502681 → 26 456^2=207936 → 79 105^2=11025 → 10

879^2=772641 → 26 619^2=383161 → 31

Ejemplo Sean N= 100 el tamaño del arreglo, y sean sus direcciones los números entre 1 y 100. Sean K1= 7259 y K2= 9359 dos claves a las que deban asignarse posiciones en el arreglo. Se aplica la formula H(k)= dígitos_centrales (K2) + 1, para calcular las direcciones de K1, y K2. El resultado queda:

K12= 52693081

K22= 87590881

H(K1)= dígitos_centrales (52693081) + 1= 94 H(K2)= dígitos_centrales (8 590881) + 1= 91

Como el rango de índices del ejemplo caria entre 1 a 100, se toman solamente los dos dígitos centrales del cuadrado de la claves.

Nota: en caso de que la cifra resultante sea impar se toma el valor número y el anterior.

4. Truncamiento: Consiste en ignorar parte del número y utilizar los elementos restantes como índice.

9 10

Page 8: Busquedas en Vectores

También se produce colisión. Por ejemplo, si un número de 7 cifras se debe ordenar en un arreglo de elementos, se pueden tomar el segundo, el cuarto y el sexto para formar un nuevo número:

5700931 >>> 703 3498610 >>> 481 0056241 >>> 064 9134720 >>> 142 5174829 >>> 142

Ejemplo Sean N= 100 el tamaño del arreglo, y sean sus direcciones los números entre 1 y 100. Sean K1= 7259 y K2= 9359 dos claves a las que deban asignarse posiciones en el arreglo. Se aplica la formula H(k)= elegirdígitos (d1, d2, d3… dn) + 1, para calcular las direcciones de K1, y K2. El resultado queda:

H(K1)= elegirdígitos (7259) + 1= 76 H(K2)= elegirdígitos (9359) + 1= 96 En este ejemplo se toma el primer y tercer número de la clave y se unen de izquierda a derecha.

5. Plegamiento: Consiste en dividir el

número en diferentes partes, y operar con ellas (normalmente con suma o multiplicación). También se produce colisión. Por ejemplo, si dividimos el número de 7 cifras en 2, 2 y 3 cifras y se suman, dará otro número de tres cifras (y si no, se toman las tres últimas cifras):

5700931 >>> 57 + 00 + 931 = 988 3498610 >>> 34 + 98 + 610 = 742 0056241 >>> 00 + 56 + 241 = 297 9134720 >>> 91 + 34 + 720 = 845

5174929 >>> 51 + 74 + 929 = 1054 Ejemplo Sean N= 100 el tamaño del arreglo, y sean sus direcciones los números entre 1 y 100. Sean K1= 7259 y K2=

9359 dos claves a las que deban asignarse posiciones en el arreglo. Se aplica la formula H(k)= dígmensig (d1 …di) + (di+1 …dj) +… + (d1 …dn) + 1, para calcular las direcciones de K1, y K2. El resultado queda:

H(K1)= dígmensig (72 + 59) + 1= dígmensig (131) + 1= 32 H(K2)= dígmensig (93 + 59) + 1= dígmensig (152) + 1= 53

Del resultado de la suma se toman solamente dos dígitos porque los índices de arreglo varían de 1 a 100.

Ventajas

1. Se pueden usar los valores naturales de la llave, puesto que se traducen internamente a direcciones fáciles de localizar.

2. Se logra independencia lógica y física, debido a que los valores de las llaves son independientes del espacio de direcciones.

3. No se requiere almacenamiento

adicional para los índices. Desventajas

1. No pueden usarse registros de longitud variable.

2. El archivo no está clasificado.

3. No permite llaves repetidas.

4. Solo permite acceso por una sola llave

11 12

Page 9: Busquedas en Vectores

Método de Búsqueda por Interpolación

Se trata de llegar al elemento buscado por medio de la interpolación lineal. El procedimiento es recursivo; como en el caso de la búsqueda binaria, en cada paso se van modificando los límites, disminuyendo el intervalo, hasta llegar al elemento buscado.

Si se determina que la clave buscada XX se encuentra dentro del intervalo INTABLA de la tabla, y que la variación en ese intervalo de la clave es INCLAVE, la siguiente posición a probar es:

PX = PI + ENTERO ((XX-XI)

(INTABLA / INCLAVE))

El algoritmo es similar al de búsqueda binaria, la diferencia está en que en vez de dividir el área en mitades, se delimita por medio de los valores resultantes de la interpolación.

En búsqueda binaria el espacio se corta siempre adentro a medias, las garantías de lo que desea el funcionamiento logarítmico. Sin embargo, durante la búsqueda encontramos un valor que esté muy cerca del número z de la búsqueda, parece más razonable continuar la búsqueda en esa área en vez de ocultar e ir a la media punta siguiente.

En detalle, si z es muy pequeño, debemos comenzar la búsqueda en alguna parte en el principio de la secuencia en vez de la punta intermedia Considere la manera que abrimos un libro cuando estamos buscando para cierta página. Diga que la página es 200 y el libro parece de 800 páginas. La paginación 200 es así alrededor de la marca de un cuarto, y nosotros utilizamos este conocimiento como indicación de donde abrir el libro. No golpearemos probablemente la paginación 200 en el primer intento; suponga que conseguimos la paginación 250 en lugar de otro. Ahora cortamos la búsqueda a un

rango de 250 páginas, y la paginación deseada está en alrededor la marca de 80 por ciento entre la paginación 1 y 250. Ahora intentamos ir detrás de un quinto de la manera corta. Podemos continuar este proceso hasta que conseguimos bastante cercanos a la paginación 200, de que que podemos mover de un tirón una página al mismo tiempo. Ésta es exactamente la idea detrás de la búsqueda de la interpolación. En vez de cortar el espacio de la búsqueda por una mitad fija, la cortamos por una cantidad que se parezca la más probable tener éxito.

El funcionamiento de la búsqueda de la interpolación depende no solamente de la talla de la secuencia, pero también de la entrada de información misma. Hay entradas de información para los chequeos de la búsqueda de interpolación del deseado en cada número en la secuencia. Sin embargo, la búsqueda de la interpolación es muy eficiente para las entradas de información que consisten en elementos relativamente uniformemente distribuidos (las paginaciones de un libro, por supuesto, se distribuyen uniformemente). Puede ser mostrado que el número medio de comparaciones se realizó por la búsqueda de interpolación, donde el promedio asume el control todas las secuencias posibles, es 0 (login del registro). Aunque éste se parece ser un orden de la mejora magnitud concluida de el funcionamiento de la búsqueda binaria (debido al logaritmo adicional).

Ventajas

La búsqueda de interpolación, es una búsqueda mucho mejor que la binaria en la práctica porque, a menos que no sea muy grande, el valor de log2n es bastante pequeño que el logaritmo de él no es mucho más pequeño.

Incluso a pesar de que el cálculo es de algún modo más complejo, una búsqueda con interpolación puede

13 14

Page 10: Busquedas en Vectores

proporcionar una mejoría importante a nuestra búsqueda binaria en grandes conjuntos de datos con claves distribuidas de modo uniforme.

Desventajas

La búsqueda de la interpolación requiere una aritmética más elaborada, a parte que los cálculos que se necesitan para esta búsqueda son muy lentos.

Para lograr esta búsqueda se requieren llaves, multiplicaciones y divisiones complejas, es decir, cálculos de nivel alto.

CONCLUSIONES

Podemos decir que ningún tipo de búsqueda es mala y a la vez ninguna es buena, ya que depende el uso dado, así es como se demuestra en qué casos es mejor una que otra.

Como la búsqueda binaria que es la más rápida, pero que a su vez no sirve si los elementos del arreglo no están acomodados en orden ascendente al contrario de la Secuencial que a pesar de que es más lenta trabaja aunque los elementos estén revueltos.

Deben tomarse en cuenta muchos detalles al momento de decidir que algoritmo de búsqueda se utilizará con una estructura, entre los detalles que se deben tomar en cuenta podemos contar el tamaño de la estructura, si ésta está ordenada o no, con qué frecuencia se hacen cambios en la estructura, si el costo de un ordenamiento no sobrepasa al de hacer una búsqueda, el periodo de vida de la estructura y la forma en que se adapta cada estructura a cada algoritmo.

15 16

Page 11: Busquedas en Vectores

BIBLIOGRAFIAS

Cairó Osvaldo. Estructura de Datos México: McGRAW-HILL, 2001.

http://www.monografias.com/trabajos42/diagrama-de-flujo/diagrama-de-flujo2.shtml

http://www.monografias.com/trabajos55/metodo-de-la-burbuja/metodo-de-la-burbuja2.shtml

http://macabremoon0.tripod.com/id2.html

http://www.aves.edu.co/ovaunicor/recursos/1/index_metodos_busqueda.pdf

http://isa.umh.es/asignaturas/ia/temas/t2.pdf

http://dptocomp.ing.uc.edu.ve/rfernand/GuiasCean/teoriabusqueda.pdf

BIBLIOGRAFIAS IMÁGENES

Fuente imagen 01: http://fceucsf.blogspot.com/2009/09/busqueda-de-informacion-cientifica.html

Fuente imagen 02: http://portal.educ.ar/debates/educacionytic/2008/04/

Fuente imagen 03: http://www.cuatro.com/la-busqueda/el-programa/

Fuente imagen 04:

http://www.edisantplanet.com/Jose-santillan-ciencia-tecnologia-y-

ambiente.html Fuente imagen 05:

http://www.edisantplanet.com/Jose-santillan-ciencia-tecnologia-y-

ambiente.html

17 18