Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Algoritmo de Ordenamiento y Busqueda

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 5

Algoritmo de Ordenamiento:

Es un algoritmo que pone elementos de una lista o un vector en una secuencia dada por una
relación de orden, es decir, el resultado de salida ha de ser una permutación o reordenamiento
de la entrada que satisfaga la relación de orden dada.
Las relaciones de orden más usadas son el orden numérico y el orden lexicográfico (es una
relación de orden definida sobre el producto cartesiano de conjuntos ordenados).
Ordenamientos eficientes son importantes para optimizar el uso de otros algoritmos (como los
de búsqueda y fusión) que requieren listas ordenadas para una ejecución rápida.

Los algoritmos de ordenamiento se pueden clasificar en las siguientes maneras:

La más común es clasificar según el lugar donde se realice la ordenación


 Algoritmos de ordenamiento interno: en la memoria del ordenador.
 Algoritmos de ordenamiento externo: en un lugar externo como un disco duro.

Por el tiempo que tardan en realizar la ordenación, dadas entradas ya ordenadas o


inversamente ordenadas:
 Algoritmos de ordenación natural: Tarda lo mínimo posible cuando la entrada está
ordenada.
 Algoritmos de ordenación no natural: Tarda lo mínimo posible cuando la entrada está
inversamente ordenada.

Por estabilidad: un ordenamiento estable mantiene el orden relativo que tenían originalmente
los elementos con claves iguales. Cuando los elementos son indistinguibles la estabilidad no
interesa, los algoritmos de ordenamiento que no son estables se pueden implementar para
que sí lo sean, una manera de hacer esto es modificar artificialmente la clave de ordenamiento
de modo que la posición original en la lista participe del ordenamiento en caso de
coincidencia.

Algoritmos 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, ejemplo: Ubicar el registro correspondiente a
cierta persona en una base de datos.

Algoritmo de 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, la búsqueda binaria. El algoritmo
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 menor que el elemento medio, entonces sabemos que el
elemento está en la mitad inferior de la tabla.
 Si es mayor es porque el elemento está en la mitad superior.
 Si es igual se finaliza con éxito la búsqueda ya que se ha encontrado el elemento.
Se puede aplicar tanto a datos en listas lineales (Matrices) como en árboles binarios de
búsqueda. Los prerrequisitos principales para la búsqueda binaria son:

 La lista debe estar ordenada en un orden específico de acuerdo al valor de la llave.


 Debe conocerse el número de registros.

La búsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays más
pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda se termina.
Por ejemplo, para buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarían los
siguientes pasos:

Se toma el elemento central y se divide el array 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 subarray:
{1,2,3,4}

Se vuelve a dividir el array en dos:

{1}-2-{3,4}

Como el elemento buscado es mayor que el central, debe estar en el segundo subarray: {3,4}

Se vuelve a dividir en dos:

{}-3-{4}

Como el elemento buscado coincide con el central, lo hemos encontrado.


Si al final de la búsqueda todavía no lo hemos encontrado, y el subarray a dividir está vacio {},
el elemento no se encuentra en el array.

Algoritmo de Búsqueda Secuencial:

Consiste en recorrer y examinar cada uno de los elementos del array hasta encontrar el o los
elementos buscados, o hasta que se han mirado todos los elementos del array.
Este es el método de búsqueda más lento, pero si nuestra información se encuentra
completamente desordenada es el único que nos podrá ayudar a encontrar el dato que
buscamos.

El siguiente algoritmo ilustra un esquema de implementación del algoritmo de búsqueda


secuencial:
for(i=j=0;i<N;i++)
   if(array[i]==elemento)
   {
     solucion[j]=i;
     j++;
   }
Este algoritmo se puede optimizar cuando el array está ordenado, en cuyo caso la condición de
salida cambiaría a:
for(i=j=0;array[i]<=elemento;i++)

O cuando sólo interesa conocer la primera ocurrencia del elemento en el array:


for(i=0;i<N;i++)
  if(array[i]==elemento)
    break;

En este último caso, cuando sólo interesa la primera posición, se puede utilizar un centinela,
esto es, dar a la posición siguiente al último elemento de array el valor del elemento, para
estar seguro de que se encuentra el elemento, y no tener que comprobar a cada paso si
seguimos buscando dentro de los límites del array:
array[N]=elemento;
for(i=0;;i++)
  if(array[i]==elemento)
    break;

Si al acabar el bucle, i vale N esto indica que no se encontró el elemento. El número medio de
comparaciones que hay que hacer antes de encontrar el elemento buscado es de (N+1)/2.

Complejidad de la Búsqueda Lineal:

 Mejor caso: El algoritmo de búsqueda lineal termina tan pronto como encuentra el
elemento buscado en el array. Si tenemos 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.
 Peor caso: Sucede cuando encontramos X en la última posición del array. Como se
requieren n ejecuciones del bucle mientras, la cantidad de tiempo es proporcional a la
longitud del array n, más un cierto tiempo para realizar las instrucciones del bucle
mientras y para la llamada al método.
 Caso medio: Supongamos que cada elemento almacenado en el array es igualmente
probable de ser buscado.
La media puede calcularse 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, a representa el costo constante
asociado a la ejecución del ciclo y b el costo constante asociado a la evaluación de la
condición. 1, 2 , ..n, representan el costo de encontrar el elemento en la primera,
segunda, ..., enesima posición dentro del arreglo.

Algoritmo de Búsqueda mediante Transformación de Claves (hash):

Hasta ahora las técnicas de localización de registros vistas, emplean un proceso de búsqueda
que implica cierto tiempo y esfuerzo. El método de transformación de claves nos permite
encontrar directamente el registro buscado en tablas o archivos que no se encuentran
necesariamente ordenados, en un tiempo independiente de la cantidad de datos.
Utilizar el método de Hashing nos permite manejar aplicaciones de búsqueda donde no
tenemos claves con características tan limitadas. El resultado es un método de búsqueda
completamente diferente a los métodos basados en comparaciones, ahora en vez de navegar
por las estructuras comparando palabras clave con las claves en los items, tratamos de
referenciar items en una tabla directamente haciendo operaciones aritméticas para
transformar claves en direcciones de la tabla. Esto último se logra implementando una Función
Hash, que se va a encargar de dicha transformación.
Idealmente, todas las claves deberían corresponder con direcciones diferentes, pero es muy
frecuente que dos o más claves diferentes sean transformadas a la misma dirección, cuando
esto pasa, se dice que se presenta una Colisión. Es por eso que también se debe implementar
algún proceso de resolución de Colisiones, que se va a encargar de tratar tales situaciones.
Uno de los métodos de resolución de colisiones que existen usa Listas enlazadas y se lo
denomina “encadenamiento directo” o “Hashing abierto” el cual es muy útil en situaciones
dinámicas, donde el número de elementos es difícil de predecir por adelantado.
En líneas generales podemos decir, que es razonable esperar búsquedas (Search), borrados
(Delete) e inserciones (Insert) en tiempo constante, independientemente del tamaño de la
tabla. Es ideal para aplicaciones que realicen mayoritariamente este tipo de operaciones, por
el otro lado, Hashing no provee implementaciones eficientes para otras operaciones como por
ejemplo Ordenamiento (Sort) o Selección (Select).

También podría gustarte