DATOPEDIA V O L U M E N
I
N O V I E M B R E ,
1
D E
2 0 1 0
PAGINA
2
01 Noviembre 2010
datopedia
4 Métodos de
Búsqueda
4
Búsqueda 5 Búsqueda Binaria Edición y Diseño Editor: Fabianna Molinares, Alejandro Uzcátegui. Diseño: Fabianna Molinares, Alejandro Uzcátegui. Universidad Fermín Toro, Cabudare, Venezuela.
DATOPEDIA
5 Buscando
en Vectores 6 Hash 7 Arboles de búsqueda
VOLUMEN
I
PAGINA
Sitios web recomendados
3
PAGINA
4
Entrando en la búsqueda
U
na de las operaciones más importantes en el procesamiento de información es la búsqueda. Esta operación se utiliza básicamente para recuperar datos que se había almacenado con anticipación.
La búsqueda ocupa una parte importante en nuestras vidas. Prácticamente todo el tiempo estamos buscando algo. El mundo en que se vive hoy día, es desarrollado, automatizado y la información representa un elemento de vital
importancia. La búsqueda se realiza, generalmente, sobre elementos que están ordenados; sin embargo, puede suceder que la búsqueda se realice sobre una colección de elementos no ordenados.
Métodos de Búsqueda “Prácticamente todo el tiempo estamos buscando algo.”
Los métodos de búsqueda nos permiten recuperar información de un vector o un archivo, que contenga una lista de datos. 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. Los métodos de búsqueda se pueden clasificar en internos y externos, según la ubicación de los datos sobre los cuales se realizara la búsqueda. Cuando todos los elementos se encuentran en la memoria principal de la computadora, se realiza una
DATOPEDIA
búsqueda interna; si los elementos están en memoria secundaria; es decir, su hubiese archivos en dispositivos y como cintas y discos magnéticos.
VOLUMEN
I
PAGINA
5
Buscando en Vectores Los vectores o arreglos son estructuras de datos estáticas que se encuentran almacenadas en la memoria principal de la máquina, lo que implica que la búsqueda a realizar es una búsqueda interna. Existen diferentes tipos de búsqueda interna y dependiendo de la cantidad u
orden de los elementos que existan en un vector se selecciona el método mas conveniente.
Secuencial o lineal, binario, por transformación de claves, árboles de búsqueda .
Entre los métodos de búsqueda interna más importantes se encuentran:
“Esta búsqueda
Búsqueda Binaria Es un método que se basa en la división sucesiva del espacio ocupado por el vector mitades, hasta encontrar el elemento buscado; o cuando el intervalo de búsqueda se anula, es vacío. Esta búsqueda utiliza un técnica de divide y vencerás para localizar el valor deseado. Con este procedimiento 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 segunda mitad de la lista y a continuación se repite el proceso anterior, utilizando el elemento central de esta sub-lista. Con cada iteración del método el espacio de búsqueda se reduce a la mitad; por lo tanto el número de comparaciones a realizar disminuye notable-
utiliza un técnica de mente. Esta disminución resulta significativa cuanto mas grande sea el tamaño del arreglo. Este tipo de búsqueda se utiliza en vectores ordenados. Esta es una técnica eficaz para realizar búsquedas en vectores o archivos que contengan un mayor número de datos.
divide y vencerás .”
PAGINA
6
Búsqueda Secuencial El método consiste que se encuenen explorar secuencial- tre el elemento mente un vector. o se llegue al final del vector. La búsqueda secuencial recorre el vector desde el primer elemento hasta el ultimo, comparando cada elemento del vector con el valor buscado, hasta
Este método es recomendado para realizar búsquedas con pocos datos.
Transformación de Claves La búsqueda por transformación de claves también conocido como Hash, permite aumentar la velocidad de búsqueda sin necesidad de tener los elementos ordenados. Cuenta con la ventaja de que el tiempo de búsqueda es independiente del número de componentes del arreglo. Cuando se tiene una colección de datos, cada uno de ellos identificados por una clave, es claro que resulta atractivo tener acceso a ellos de manera directa; es decir sin recorrer algunos datos antes de localizar el buscado. El método por transformación de claves permite realizar justamente esta actividad;
DATOPEDIA
es decir, localizar el dato de forma directa. El método trabaja utilizando una función que convierte una clave dada en una dirección (índice) dentro de un arreglo.
VOLUMEN
I
PAGINA
Árboles de Búsqueda Los árboles tienen una variante llamada Trie. Un trie es una estructura similar a un árbol con N raíces, con la particularidad de que cada nodo del árbol puede ser nuevamente un trie. Un trie puede representar una estructura sumamente útil para búsqueda. Las raíces del árbol tiene como objetivo dirigir el camino de búsqueda hacia la meta. La profundidad de una estructura de este tipo depende de la discriminación en la clave de búsqueda que realice el usuario; de esta forma se localiza la información buscada directamente en el nodo terminal, sin tener que realizar búsqueda secuencial.
Con el propósito de instrumentar esta estructura en un lenguaje de alto nivel, podemos representar un trie como un bosque. Posteriormente aplicando las reglas necesarias se debe convertir esta estructura en árbol binario.
Concluyendo
E
xisten diversos métodos de realizar la búsqueda en vectores, dando al usuario la posibilidad de escoger la que le sea de más utilidad y que le facilite más el trabajo.
Para mayor información consulta: Estructuras de Datos (Cairó, Osvaldo; Guardati Silvia)
O visita: http://www.monografias.com/trabajos55/ metodo-de-la-burbuja/metodo-de-laburbuja2.shtml
7
PAGINA
8
EJEMPLOS Busqueda Binaria En arreglo Ordenado:
Buscar el elemento 3 en el array {1,2, 3, 4, 5, 6, 7, 8,9}
Se toma el elemento central y se divide el arreglo en dos: {1,2,3,4}-5{6,7,8,9}.
Como el elemento buscado (3) es menor que el central (5), debe estar en el primer sub arreglo: {1,2,3,4}
Se vuelve a dividir el arreglo en dos: {1}-2-{3,4}
Como el elemento buscado es mayor que el central, debe estar en el segundo sub arreglo: {3,4} Se vuelve a dividir en dos: {}-3-{4} Como el elemento buscado coincide con el central, lo hemos encontrado. Observación Importante Si al final de la búsqueda todavía no lo hemos encontrado, y el sub arreglo a dividir está vacío {}, el elemento no se encuentra en el arreglo.
DATOPEDIA
VOLUMEN
I
El código en C para implementar la búsqueda binaria en arreglos en un programa es:
int desde, hasta, medio, elemento, posicion; // desde y hasta indican los límites del arreglo que se está mirando. int array[N]; for(desde=0;hasta=N-1;desde<=hasta) { if(desde==hasta) { if(array[desde]==elemento) posicion=desde; else posicion=−1; break; } medio=(desde+hasta)/2; if(array[medio]==elemento) { posicion=medio; break; } else if(array[medio]>elemento) hasta=medio-1; else desde=medio+1; }
PAGINA
9
PAGINA
10
EJEMPLOS Transformación de Claves 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: Restas sucesivas: esta función se emplea con claves numéricas entre las que existen huecos de tamaño conocido, obteniéndose direcciones consecutivas. Por ejemplo, si el número de expediente de un alumno universitario está formado por el año de entrada en la universidad, seguido de un número identificativo de tres cifras, y suponiendo que entran un máximo de 400 alumnos al año, se le asignarían las claves: 1998-000 --> 0 = 1998000-1998000 1998-001 --> 1 = 1998001-1998000 1998-002 --> 2 = 1998002-1998000 ... 1998-399 --> 399 = 1998399-1998000 1999-000 --> 400 = 1999000-1998000+400 ... yyyy-nnn --> N = yyyynnn-1998000+(400*(yyyy-1998))
DATOPEDIA
VOLUMEN
I
Aritmética modular: el índice de un número es resto de la división de ese número entre un número N 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 cuando hay N+1 elementos, al menos un índice es señalado por dos elementos (teorema del palomar). A este fenómeno se le llama colisión, y es tratado más adelante. Si el número N es el 13, los números siguientes quedan transformados en: 13000000 --> 0 12345678 --> 7 13602499 --> 1 71140205 --> 6 73062138 --> 6 Truncamiento: consiste en ignorar parte del número y utilizar los elementos restantes como índice. También se produce colisión. Por ejemplo, si un número de 8 cifras se debe ordenar en un arreglo de 1000 elementos, se pueden coger la primer, la tercer y la última cifras para formar un nuevo número: 13000000 --> 100 12345678 --> 138 13602499 --> 169 71140205 --> 715 73162135 --> 715
PAGINA
11
PAGINA
12
EJEMPLOS Árboles de Búsqueda Ejemplo de un Árbol Binario de Búsqueda:
Operaciones básicas sobre árboles binarios de búsqueda - Búsqueda Código para realizar la búsqueda en el árbol. boolean buscar(tarbol *a, int elem) { if (a == NULL) return FALSE; else if (a->clave < elem) return buscar(a->der, elem); else if (a->clave > elem) return buscar(a->izq, elem); else return TRUE; }
DATOPEDIA
VOLUMEN
I
- Inserciรณn Cรณdigo para insertar un elemento en el รกrbol. void insertar(tarbol **a, int elem) { if (*a == NULL) { *a = (arbol *) malloc(sizeof(arbol)); (*a)->clave = elem; (*a)->izq = (*a)->der = NULL; } else if ((*a)->clave < elem) insertar(&(*a)->der, elem); else if ((*a)->clave > elem) I nsertar(&(*a)->izq, elem); }
- Borrado Cรณdigo para eliminar un elemento en el รกrbol. void borrar(tarbol **a, int elem) { void sustituir(tarbol **a, tarbol **aux); tarbol *aux;
}
if (*a == NULL) return; if ((*a)->clave < elem) borrar(&(*a)->der, elem); else ff ((*a)->clave > elem) borrar(&(*a)->izq, elem); else if ((*a)->clave == elem) { aux = *a; if ((*a)->izq == NULL) *a = (*a)->der; else if ((*a)->der == NULL) *a = (*a)->izq; else sustituir(&(*a)->izq, &aux); free(aux); }
PAGINA
13
DATOPEDIA ConsĂguela todos los meses en www.issuu.com