fbpx
Wikipedia

Algoritmo de búsqueda

Un algoritmo de búsqueda es un conjunto de instrucciones que están diseñadas para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movimiento en una partida de ajedrez.

La variante más simple del problema es la búsqueda de un número en un vector.

Búsqueda informada vs no informada

Un problema típico de la Inteligencia Artificial consiste en buscar un estado concreto entre un conjunto determinado, al que se le llama espacio de estados. Imaginemos, por ejemplo, una habitación con baldosines en la que hay un libro. Un robot se desea desplazar por la habitación con el fin de llegar a dicho libro. ¿De qué manera lo hará? En este punto es donde entran en juego las estrategias y los algoritmos de búsqueda.

Cuando el sistema agente (en este caso, el robot) posee algún tipo de información del medio, se utilizan técnicas de búsquedas informadas; sin embargo, si carece de conocimiento alguno, se deberán emplear algoritmos de búsqueda no informadas. En nuestro ejemplo, y para este último caso, podemos imaginar un robot que no posea ningún tipo de visión artificial, que únicamente sea capaz de moverse en horizontal o vertical de un baldosín a otro y detectar si en el baldosín se halla el libro.

 

De esta forma, los algoritmos de búsqueda pueden ser:

Búsqueda secuencial

Consiste en ir comparando el elemento a buscar con cada elemento del vector hasta encontrarlo o hasta que se llegue al final, esto hace que la búsqueda sea secuencialmente (de ahí su nombre). La existencia se puede asegurar cuando el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del vector. Se utiliza sin importar si el vector está previamente ordenado o no. A continuación se muestra el pseudocódigo del algoritmo:[1]

Datos de entrada: vec: vector en el que se desea buscar el dato tam: tamaño del vector. Los subíndices válidos van desde 0 hasta tam-1 inclusive. Puede representarse así: vec[0...tam) o vec[0...tam-1]. dato: elemento que se quiere buscar. Variables pos: posición actual en el vector pos = 0 while pos < tam: if vec[pos] == dato: Retorne verdadero y/o pos, else: pos = pos + 1 Fin (while) Retorne falso, 
int busquedaSimple(int vector[n], int n, int dato) {  int i;  for(i=0; i<n; i++){  if(dato==vector[i]) {  return i;  }  }  return -1; } 

Búsqueda dicotómica (binaria)

Se utiliza cuando el vector en el que queremos determinar la existencia de un elemento está previamente ordenado. Este algoritmo reduce el tiempo de búsqueda considerablemente, ya que disminuye exponencialmente el número de iteraciones necesarias. En el peor de los casos el número máximo de comparaciones es  , donde   es el número de los elementos en el vector. Por ejemplo, en uno conteniendo 50.000.000 elementos, el algoritmo realiza como máximo 26 comparaciones.

Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del vector (normalmente el elemento central): si el valor de este es mayor que el del elemento buscado se repite el procedimiento en la parte del vector que va desde el inicio de este hasta el elemento tomado, en caso contrario se toma la parte del vector que va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada vez más pequeños, hasta que se obtenga un intervalo indivisible. Si el elemento no se encuentra dentro de este último entonces se deduce que el elemento buscado no se encuentra en todo el vector.

A continuación se presenta el pseudocódigo del algoritmo, tomando como elemento inicial el elemento central del vector.

Datos de entrada: vec: vector en el que se desea buscar el dato tam: tamaño del vector. Los subíndices válidos van desde 0 hasta tam-1 inclusive. dato: elemento que se quiere buscar. Variables centro: subíndice central del intervalo inf: límite inferior del intervalo sup: límite superior del intervalo inf = 0 sup = tam-1 Mientras inf <= sup: centro = ((sup - inf) / 2) + inf // División entera: se trunca la fracción Si vec[centro] == dato devolver verdadero y/o pos, de lo contrario: Si dato < vec[centro] entonces: sup = centro - 1 En caso contrario: inf = centro + 1 Fin (Mientras) Devolver Falso 
int busquedaBinaria(int vector[], int n, int dato) {  int centro,inf=0,sup=n-1;  while(inf<=sup){  centro=((sup+inf)/2);  if(vector[centro]==dato) return centro;  else if(dato < vector[centro]) sup=centro-1;  else inf=centro+1;  }  return -1; } 
Implementación recursiva en C++
 #include <vector>  bool busqueda_dicotomica(const vector<int> &v, int principio, int fin, int &x){  bool res;  if(principio <= fin){  int m = ((fin - principio)/2) + principio;  if(x < v[m]) res = busqueda_dicotomica(v, principio, m-1, x);  else if(x > v[m]) res = busqueda_dicotomica(v, m+1, fin, x);  else res = true;  }else res = false;  return res;  }  /*{Post: Si se encuentra devuelve true, sino false}*/ 
Implementación recursiva en Python
def busquedaBinaria (numeros, inicio, fin, elemento): if (inicio == fin): return numeros [inicio] == elemento centro = ((fin - inicio) // 2) + inicio if (elemento < numeros [centro]): return busquedaBinaria (numeros, inicio, centro - 1, elemento) elif (elemento > numeros [centro]): return busquedaBinaria (numeros, centro + 1, fin, elemento) else: return True def busqueda (numeros, elemento): if (numeros == None) or (numeros == []): return False else: return busquedaBinaria (numeros, 0, len (numeros) - 1, elemento) 
Implementación recursiva en Python3
def bin(a,x,low,hi): ans = -1 if low==hi: ans = -1 else: mid = (low+((hi-low)//2)) if x < a[mid]: ans = bin(a,x,low,mid) elif x > a[mid]: ans = bin(a,x,mid+1,hi) else: ans = mid return ans # Así se hace el llamado: print(bin(Lista, numero_a_buscar, 0, len(Lista))) # Retorna el índice que coincide con 'numero_a_buscar', si no está retorna -1 # Tiempo: (log n) 
Implementación iterativa en Python3
def bin(a, c): ans = -1 if a[0] >= c: ans = -1 else: low, hi = 0, len(a) while low+1 != hi: mid = low + ((hi-low)//2) if a[mid] < c: low = mid else: hi = mid ans = low return ans # Así se hace el llamado: print(bin(lista(), numero_a_buscar)) # Retorna el índice que coincide con 'numero_a_buscar', si no está retorna -1 # Tiempo: (log n) 

Referencias

  1. Mezzadri, Daniels. «¿Que es un algoritmo?». Consultado el 29 de mayo de 2017. 

Enlaces externos

    •   Datos: Q755673
    •   Multimedia: Search algorithms

    algoritmo, búsqueda, para, otros, usos, este, término, véase, búsqueda, algoritmo, búsqueda, conjunto, instrucciones, están, diseñadas, para, localizar, elemento, ciertas, propiedades, dentro, estructura, datos, ejemplo, ubicar, registro, correspondiente, cier. Para otros usos de este termino vease Busqueda Un algoritmo de busqueda es un conjunto de instrucciones que estan disenadas para localizar un elemento con ciertas propiedades dentro de una estructura de datos por ejemplo ubicar el registro correspondiente a cierta persona en una base de datos o el mejor movimiento en una partida de ajedrez La variante mas simple del problema es la busqueda de un numero en un vector Indice 1 Busqueda informada vs no informada 2 Busqueda secuencial 3 Busqueda dicotomica binaria 4 Referencias 5 Enlaces externosBusqueda informada vs no informada EditarUn problema tipico de la Inteligencia Artificial consiste en buscar un estado concreto entre un conjunto determinado al que se le llama espacio de estados Imaginemos por ejemplo una habitacion con baldosines en la que hay un libro Un robot se desea desplazar por la habitacion con el fin de llegar a dicho libro De que manera lo hara En este punto es donde entran en juego las estrategias y los algoritmos de busqueda Cuando el sistema agente en este caso el robot posee algun tipo de informacion del medio se utilizan tecnicas de busquedas informadas sin embargo si carece de conocimiento alguno se deberan emplear algoritmos de busqueda no informadas En nuestro ejemplo y para este ultimo caso podemos imaginar un robot que no posea ningun tipo de vision artificial que unicamente sea capaz de moverse en horizontal o vertical de un baldosin a otro y detectar si en el baldosin se halla el libro De esta forma los algoritmos de busqueda pueden ser Algoritmos no informados o ciegos en general mas ineficientes en tiempo y memoria que otros metodos Algoritmos informados Algoritmos heuristicos destacan las Busquedas Primero el Mejor Algoritmo voraz o Greedy y Algoritmo de busqueda A y de Mejora Iterativa Algoritmo Escalada Simple Hill Climbing y Escalada por Maxima Pendiente Algoritmos de Busqueda con adversario destacan el Minimax y el Poda alfa beta Busqueda secuencial EditarConsiste en ir comparando el elemento a buscar con cada elemento del vector hasta encontrarlo o hasta que se llegue al final esto hace que la busqueda sea secuencialmente de ahi su nombre La existencia se puede asegurar cuando el elemento es localizado pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del vector Se utiliza sin importar si el vector esta previamente ordenado o no A continuacion se muestra el pseudocodigo del algoritmo 1 Datos de entrada vec vector en el que se desea buscar el dato tam tamano del vector Los subindices validos van desde 0 hasta tam 1 inclusive Puede representarse asi vec 0 tam o vec 0 tam 1 dato elemento que se quiere buscar Variables pos posicion actual en el vector pos 0 while pos lt tam if vec pos dato Retorne verdadero y o pos else pos pos 1 Fin while Retorne falso Cint busquedaSimple int vector n int n int dato int i for i 0 i lt n i if dato vector i return i return 1 Busqueda dicotomica binaria EditarSe utiliza cuando el vector en el que queremos determinar la existencia de un elemento esta previamente ordenado Este algoritmo reduce el tiempo de busqueda considerablemente ya que disminuye exponencialmente el numero de iteraciones necesarias En el peor de los casos el numero maximo de comparaciones es log 2 n 1 textstyle lfloor log 2 n 1 rfloor donde n displaystyle n es el numero de los elementos en el vector Por ejemplo en uno conteniendo 50 000 000 elementos el algoritmo realiza como maximo 26 comparaciones Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del vector normalmente el elemento central si el valor de este es mayor que el del elemento buscado se repite el procedimiento en la parte del vector que va desde el inicio de este hasta el elemento tomado en caso contrario se toma la parte del vector que va desde el elemento tomado hasta el final De esta manera obtenemos intervalos cada vez mas pequenos hasta que se obtenga un intervalo indivisible Si el elemento no se encuentra dentro de este ultimo entonces se deduce que el elemento buscado no se encuentra en todo el vector A continuacion se presenta el pseudocodigo del algoritmo tomando como elemento inicial el elemento central del vector Datos de entrada vec vector en el que se desea buscar el dato tam tamano del vector Los subindices validos van desde 0 hasta tam 1 inclusive dato elemento que se quiere buscar Variables centro subindice central del intervalo inf limite inferior del intervalo sup limite superior del intervalo inf 0 sup tam 1 Mientras inf lt sup centro sup inf 2 inf Division entera se trunca la fraccion Si vec centro dato devolver verdadero y o pos de lo contrario Si dato lt vec centro entonces sup centro 1 En caso contrario inf centro 1 Fin Mientras Devolver Falso Cint busquedaBinaria int vector int n int dato int centro inf 0 sup n 1 while inf lt sup centro sup inf 2 if vector centro dato return centro else if dato lt vector centro sup centro 1 else inf centro 1 return 1 Implementacion recursiva en C C include lt vector gt bool busqueda dicotomica const vector lt int gt amp v int principio int fin int amp x bool res if principio lt fin int m fin principio 2 principio if x lt v m res busqueda dicotomica v principio m 1 x else if x gt v m res busqueda dicotomica v m 1 fin x else res true else res false return res Post Si se encuentra devuelve true sino false Implementacion recursiva en PythonPythondef busquedaBinaria numeros inicio fin elemento if inicio fin return numeros inicio elemento centro fin inicio 2 inicio if elemento lt numeros centro return busquedaBinaria numeros inicio centro 1 elemento elif elemento gt numeros centro return busquedaBinaria numeros centro 1 fin elemento else return True def busqueda numeros elemento if numeros None or numeros return False else return busquedaBinaria numeros 0 len numeros 1 elemento Implementacion recursiva en Python3Pythondef bin a x low hi ans 1 if low hi ans 1 else mid low hi low 2 if x lt a mid ans bin a x low mid elif x gt a mid ans bin a x mid 1 hi else ans mid return ans Asi se hace el llamado print bin Lista numero a buscar 0 len Lista Retorna el indice que coincide con numero a buscar si no esta retorna 1 Tiempo log n Implementacion iterativa en Python3Pythondef bin a c ans 1 if a 0 gt c ans 1 else low hi 0 len a while low 1 hi mid low hi low 2 if a mid lt c low mid else hi mid ans low return ans Asi se hace el llamado print bin lista numero a buscar Retorna el indice que coincide con numero a buscar si no esta retorna 1 Tiempo log n Referencias Editar Mezzadri Daniels Que es un algoritmo Consultado el 29 de mayo de 2017 Enlaces externos EditarALT Algorithm Learning Tool Herramienta de apoyo a la ensenanza de algoritmos que muestra graficamente su funcionamiento Permite implementar algoritmos propios y realizar una ejecucion dinamica e interactiva Datos Q755673 Multimedia Search algorithms Obtenido de https es wikipedia org w index php title Algoritmo de busqueda amp oldid 135304599, wikipedia, wiki, leyendo, leer, libro, biblioteca,

    español

    , española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos