Búsqueda Binaria - ESTR-ORG

Anuncio
ORDENAMIENTO.
Uno de los procedimientos más comunes y útiles en el procesamiento de datos, es la
clasificación u ordenación de los mismos. Se considera ordenar al proceso de reorganizar un
conjunto dado de objetos en una secuencia determinada. Cuando se analiza un método de
ordenación, hay que determinar cuántas comparaciones e intercambios se realizan para el caso
más favorable, para el caso medio y para el caso más desfavorable.
La colocación en orden de una lista de valores se llama Ordenación. Por ejemplo, se
podría disponer una lista de valores numéricos en orden ascendente o descendente, o bien una
lista de nombres en orden alfabético. La localización de un elemento de una lista se llama
búsqueda.
Tal operación se puede hacer de manera más eficiente después de que la lista ha sido
ordenada.
Existen varios métodos para ordenamiento, clasificados en tres formas:
Intercambio
Selección
Inserción.
En cada familia se distinguen dos versiones: un método simple y directo, fácil de
comprender pero de escasa eficiencia respecto al tiempo de ejecución, y un método rápido, más
sofisticado en su ejecución por la complejidad de las operaciones a realizar, pero mucho más
eficiente en cuanto a tiempo de ejecución. En general, para arreglos con pocos elementos, los
métodos directos son más eficientes (menor tiempo de ejecución) mientras que para grandes
cantidades de datos se deben emplear los llamados métodos rápidos.
Intercambio
El método de intercambio se basa en comparar los elementos del arreglo e intercambiarlos
si su posición actual o inicial es contraria inversa a la deseada. Pertenece a este método el de la
burbuja clasificado como intercambio directo. Aunque no es muy eficiente para ordenar listas
grandes, es fácil de entender y muy adecuado para ordenar una pequeña lista de unos 100
elementos o menos.
Una pasada por la ordenación de burbujeo consiste en un recorrido completo a través del
arreglo, en el que se comparan los contenidos de las casillas adyacentes, y se cambian si no están
en orden. La ordenación por burbujeo completa consiste en una serie de pasadas ("burbujeo") que
termina con una en la que ya no se hacen cambios porque todo está en orden.
Ejemplo:
Supóngase que están almacenados cuatro números en un arreglo con casillas de memoria
de x[1] a x[4]. Se desea disponer esos números en orden creciente. La primera pasada de la
ordenación por burbujeo haría lo siguiente:
Comparar el contenido de x[1] con el de x[2]; si x[1] contiene el mayor de los números, se
intercambian sus contenidos.
Comparar el contenido de x[2] con el de x[3]; e intercambiarlos si fuera necesario.
Comparar el contenido de x[3] con el de x[4]; e intercambiarlos si fuera necesario.
Al final de la primera pasada, el mayor de los números estará en x[4].
Quicksort.
Si bien el método de la burbuja era considerado como el peor método de ordenación simple
o menos eficiente, el método Quicksort basa su estrategia en la idea intuitiva de que es más fácil
ordenar una gran estructura de datos subdividiéndolas en otras más pequeñas introduciendo un
orden relativo entre ellas. En otras palabras, si dividimos el array a ordenar en dos subarrays de
forma que los elementos del subarray inferior sean más pequeños que los del subarray superior, y
aplicamos el método reiteradamente, al final tendremos el array inicial totalmente ordenado.
Existen además otros métodos conocidos, el de ordenación por montículo y el de shell.
Selección.
Los métodos de ordenación por selección se basan en dos principios básicos:
Seleccionar el elemento más pequeño (o más grande) del arreglo.
Colocarlo en la posición más baja (o más alta) del arreglo.
A diferencia del método de la burbuja, en este método el elemento más pequeño (o más
grande) es el que se coloca en la posición final que le corresponde.
Inserción.
El fundamento de este método consiste en insertar los elementos no ordenados del arreglo
en subarreglos del mismo que ya estén ordenados. Dependiendo del método elegido para
encontrar la posición de inserción tendremos distintas versiones del método de inserción.
BÚSQUEDA
Búsqueda Interna
El problema de la búsqueda es un problema de recuperación de la informaciónlo más rápidamente
posible y consiste en localizar un elemento en una lista o secuencia de elementos.
La operación de búsqueda puede llevarse a cabo sobre elementos ordenados o sobre elementos
desordenados.
Búsqueda internasi todos los elementos se encuentran en memoria principal (por ejemplo,
almacenados en arrays, vectores o listas enlazadas)
Búsqueda externasi los elementos se encuentran en memoria secundaria.
Búsqueda Interna
Definición en Java de un array.
//declaración de un
array
de
tipo_elemento
tipo_elemento[] array;
//reserva de espacio para almacenar los datos en
el array
array = newtipo_elemento[n];
Cada algoritmo de búsqueda trata de localizar en un array un elemento X. Una vez finalizada la
búsqueda puede suceder:
que la búsqueda haya tenido éxito, habiendo localizado la posición donde estaba almacenado el
elemento X, o
que la búsqueda no haya tenido éxito, concluyéndose que no existía ningún elemento X.
Búsqueda Lineal
Es la forma más simple de buscar un elemento y consiste en examinar secuencialmente uno a uno
hasta encontrar el buscado o haber revisado todos los elementos sin éxito.
public
static
intbusquedaLineal(intX,
int[] A)
{
inti = 0;
intn = A.length-1;
while (i < n && A[i] != X)
i++;
/* Si se encuentra el elemento se devuelve su posición sino se devuelve -1 (indica
que el elemento no está)*/
if (A[i] == X) return i;
elsereturn-1;
}
Complejidad Búsqueda Lineal
MEJOR CASO:Si tenemos mucha suerte, puede ser que la primera posición examinada contenga
el elemento que buscamos, en cuyo caso el algoritmo informaráque tuvo éxito después de una sola
comparación. Por tanto, su complejidad seráO(1).
PEOR CASO:Sucede cuando encontramos X en la última posición del array. Como se requieren
nejecuciones del bucle mientras, la cantidad de tiempo es proporcional a la longitud del array n,
más un cierto tiempo para realizar las condiciones del bucle mientras y para la llamada al método.
Por lo tanto, la cantidad de tiempo es de la forma an+ bpara ciertas constantes ay b. En notación
O, O(an+b) = O(an) = O(n).
CASO MEDIO:Supongamos que cada elemento almacenado tiene la misma probabilidad de ser
buscado. La media se puede calcular tomando el tiempo total de encontrar todos los elementos y
dividiéndolo por n:
Total = a (1 + 2 + ...+n) + bn= a (n(n+1) / 2) + bn
Media = (Total / n) = a((n+1) / 2) + b que es O(n).
Búsqueda Binaria
Si los elementos sobre los que se realiza la búsqueda están ordenados, entonces podemos utilizar
un algoritmo de búsqueda mucho más rápido que el secuencial, la búsqueda binaria.
Consiste en reducir paulatinamente el ámbito de búsqueda a la mitad de los elementos, basándose
en comparar el elemento a buscar con el elemento que se encuentra en la mitad del intervalo y en
base a esta comparación:
Si el elemento buscado es menorque el elemento medio, entonces sabemos que el elemento
estáen la mitad inferior de la tabla.
Si es mayores porque el elemento estáen la mitad superior.
Si es igualse finaliza con éxito la búsqueda ya que se ha encontrado el elemento.
Código Búsqueda Binaria
public static intbusquedaBinaria(intX, int[] A){
intinicio = 0;
intfin = A.length-1;
intmedio;
while(inicio <= fin)
{
medio=(inicio+fin)/2;
if(A[medio] < X) inicio =
medio+1;
elseif(A[medio] > X) fin = medio -1;
else return medio;
}
return-1;
}
Código recursivo Búsqueda Binaria
publicstaticintbinariaRec(int[] A, intX, intinicio, intfin)
{
intmedio;
if(inicio > fin) return-1;
else
{
medio = (inicio+fin)/2;
if(A[medio] < X) returnbinariaRec(A,X,medio+1,fin);
elseif(A[medio] > X) returnbinariaRec(A,X,inicio,medio-1);
else return medio;
}
}
Complejidad Búsqueda Binaria
CASO ÓPTIMO:La búsqueda binaria requiere sólo una comparación; esto significa que su tiempo
de ejecución óptimo no depende de la cantidad de datos: es constante y por tanto proporcional a 1,
es decir, O(1).
PEOR CASO:En el peor caso sídependen de N. La búsqueda binaria divide el array, requiriendo
sólo un tiempo O(logn).
El algoritmo de búsqueda binaria progresivamente va disminuyendo el número de elementos sobre
el que realizar la búsqueda a la mitad: n, n/2, n/4, ... Así, tras log2ndivisiones se habrálocalizado el
elemento o se tendrála seguridad de que no estaba.
Búsqueda Indexada
Necesita que los elementos sobre los que se realiza la búsqueda estén ordenados de acuerdo a
una determinada clave. El método utiliza un array auxiliar denominado array índice.Cada objeto en
el array índice consta de un valor y la posición que ocupa dicho valor en el correspondiente array
ordenado:
En Java se define como se
muestra a continuación:
class ElemIndice{
private intclave;
private intposicion;
public ElemIndice(intc, intp){
clave=c;
posicion=p;}
public intgetClave(){
return clave;
}
public intgetPosicion(){
return posicion;
}}
Búsqueda Indexada
Mediante cada elemento del array índice se asocian grupos de elementos del array inicial. Los
elementos en el índice y en el array deben estar ordenados. El método consta de dos pasos:
1.Buscar en el array_índiceel intervalo correspondiente al elemento buscado.
2.Restringir la búsqueda a los elementos del intervalo que se localizópreviamente.
La ventaja del método estriba en que la búsqueda se realiza inicialmente en el array de índices,
cuantitativamente más pequeña que el array de elementos. Cuando se ha encontrado el intervalo
correcto, se hace una segunda búsqueda en una parte reducida del array. Estas dos búsquedas
pueden ser secuenciales o binarias y el tiempo de ejecución dependerádel tipo de búsqueda
utilizado en cada uno de los arrays.
Búsqueda Secuencial:
La búsqueda secuencial es la técnica más simple para buscar un elemento en un arreglo.
Consiste en recorrer el arreglo elemento a elemento e ir comparando con el valor buscado (clave).
Se empieza con la primera casilla del arreglo y se observa una casilla tras otra hasta que se
encuentra el elemento buscado o se han visto todas las casillas. El resultado de la búsqueda es un
solo valor, y será la posición del elemento buscado o cero. Dado que el arreglo no está en ningún
orden en particular, existe la misma probabilidad de que el valor se encuentra ya sea en el primer
elemento, como en el último. Por lo tanto, en promedio, el programa tendrá que comparar el valor
buscado con la mitad de los elementos del arreglo.
El método de búsqueda lineal funciona bien con arreglos pequeños o para arreglos no
ordenados. Si el arreglo está ordenado, se puede utilizar la técnica de alta velocidad de búsqueda
binaria, donde se reduce sucesivamente la operación eliminando repetidas veces la mitad de la
lista restante.
Descargar