Eficiencia de Los Algoritmos de Ordenamiento y Búsqueda

download Eficiencia de Los Algoritmos de Ordenamiento y Búsqueda

of 19

description

-Descripción de varios algoritmos de busqueda y su eficiencia

Transcript of Eficiencia de Los Algoritmos de Ordenamiento y Búsqueda

UNIVERSIDAD TECNOLGICA DE PANAM

FACULTAD DE INGENIERA DE SISTEMAS COMPUTACIONALES

DESARROLLO DE SOFTWARE

ESTRUCTURA DE DATOS II

Eficiencia de algoritmos de bsqueda y ordenamiento

Profesora: Doris Cueto

IntegrantesFranklin Maestre 8-887-1788Jos Gutirrez 8-872-2166Israel Quintero 8-890-844

Grupo: 1LS121

Fecha: 16-06-2014

ndiceIntroduccin21. Consideraciones de eficiencia de los algoritmos de ordenamiento y bsquedas.Notacin de la Gran O (Big O).32.Comparacin de la eficiencia de los algoritmos de ordenamientos:Seleccin, Insercin y Burbuja.43. Algoritmos de ordenamiento y su eficiencia Quicksort54. Algoritmos de ordenamiento y su eficiencia Heapsort55. Comparacin de la eficiencia de los algoritmos de bsqueda Secuencial y Binaria66. Algoritmo de bsqueda y su eficiencia de cadena Knuth-Morris-Pratt87. Algoritmo deBoyer-Moore, bsqueda de patrones98. Tcnicas de clculo de direcciones y comparaciones Hashing129. MTODOS PARA RESOLVER EL PROBLEMA DE LAS COLISIONES15Conclusin18

IntroduccinUna de las tareas que realizan ms frecuentemente las computadoras en el procesamiento de datos es la ordenacin y bsqueda.El estudio de diferentes mtodos de ordenacin es una tarea intrnsecamente interesante desde un punto de vista terico y, naturalmente, prctico.La ordenacin es una operacin consistente en disponer un conjunto de datos en algn determinado orden con respecto a uno de los campos de elementos del conjunto. La Bsqueda es una operacin que consiste en recuperar un dato deseado.Para estas operaciones existen numeroso algoritmos cada uno creado para una tarea especfica en este trabajo analizaremos los algoritmos de ordenamiento de Seleccin, Burbuja, Insercin, Quicksort y Heapsort y algoritmos de bsqueda Secuencial, Binaria, cadena Knuth-Morris-Pratty cadenaBoyer-Moore

1. Consideraciones de eficiencia de los algoritmos de ordenamiento y bsquedas.Notacin de la Gran O (Big O).A) Algoritmos de ordenamiento: es una operacin consistente en disponer un conjunto estructura de datos en algn determinado orden con respecto a uno de los campos de elementos del conjunto.

Una coleccin de datos (estructura) puede ser almacenada en un archivo, un array (vector o tabla), un array de registros, una lista enlazada o un rbol. Cuando los datos estn almacenados en un array, una lista enlazada o un rbol, se denomina ordenacin interna.

La eficiencia es el factor que mide la calidad y rendimiento de un algoritmo. En el caso de la operacin de ordenacin, dos criterios se suelen seguir a la hora de decidir qu algoritmo de entre los que resuelven la ordenacin es el ms eficiente:

1) tiempo menor de ejecucin en computadora.2) menor nmero de instrucciones.

Sin embargo, no siempre es fcil efectuar estas medidas: puede no disponerse de instrucciones para medida de tiempo aunque no sea ste el caso del lenguaje C, y las instrucciones pueden variar, dependiendo del lenguaje y del propio estilo del programador. Por esta razn, el mejor criterio para medir la eficiencia de un algoritmo es aislar una operacin especfica clave en la ordenacin y contar el nmero de veces que se realiza. As, en el caso de los algoritmos de ordenacin, se utilizar como medida de su eficiencia el nmero de comparaciones entre elementos efectuados. El algoritmo de ordenacin A ser ms eficiente que el B, si requiere menor nmero de comparaciones.

Los mtodos de ordenacin se suelen dividir en dos grandes grupos: Directos: burbuja, seleccin, insercin. Indirectos: (avanzados) Shell, ordenacin rpida, ordenacin por mezcla, Radixsort.

B) Algoritmo de bsqueda: El proceso de encontrar un elemento especfico de un array se denomina bsqueda. En esta seccin se examinarn dos tcnicas de bsqueda: bsqueda lineal o secuencial, la tcnica ms sencilla, y bsqueda binaria o dicotmica, la tcnica ms eficiente.

Al igual que sucede con las operaciones de ordenacin cuando se realizan operaciones de bsqueda es preciso considerar la eficiencia (complejidad) de los algoritmos empleados en la bsqueda. El grado de eficiencia en una bsqueda ser vital cuando se trata de localizar una informacin en una lista o tabla en memoria, o bien en un archivo de datos.

2.Comparacin de la eficiencia de los algoritmos de ordenamientos:Seleccin, Insercin y Burbuja.

A) Ordenacin por seleccin: El algoritmo se apoya en sucesivas pasadas que intercambian el elemento ms pequeo sucesivamente con el primer elemento de la lista, A[0] en la primera pasada. En sntesis, se busca el elemento ms pequeo de la lista y se intercambia con A[0], primer elemento de la lista.

Los pasos del algoritmo son:1. Seleccionar el elemento ms pequeo de la lista A; intercambiarlo con el primer elemento A[0]. Ahora la entrada ms pequea est en la primera posicin del vector.

2. Considerar las posiciones de la lista A[1], A[2], A[3]..., seleccionar el elemento ms pequeo e intercambiarlo con A[1]. Ahora las dos primeras entradas de A estn en orden.

3. Continuar este proceso encontrado o seleccionando el elemento ms pequeo de los restantes elementos de la lista, intercambindolos adecuadamente.

El anlisis del algoritmo de seleccin es sencillo y claro, ya que requiere un nmero fijo de comparaciones que slo dependen del tamao de la lista o vector (array) y no de la distribucin inicial de los datos.

B) Ordenacin por Insercin: el mtodo de ordenacin por insercin es similar al proceso tpico de ordenar tarjetas de nombres (cartas de una baraja) por orden alfabtico, que consiste en insertar un nombre en su posicin correcta dentro de una lista o archivo que ya est ordenado.

El algoritmo correspondiente a la ordenacin por insercin contempla los siguientes pasos:

1. El primer elemento A[0] se considera ordenado; es decir, la lista inicial consta de un elemento.

2. Se inserta A[1] en la posicin correcta, delante o detrs de A[0], dependiendo de que sea menor o mayor.

3. Por cada bucle o iteracin i(desde i=1 hasta n-1) se explora la sub-lista A[i-1]..A[0] buscando la posicin correcta de insercin; a la vez se mueve hacia abajo(a la derecha en la sub-lista)una posicin todos los elementos mayores que el elemento que el elemento a insertar A[i], para dejar baca esa posicin.

4. Insertar el elemento a la posicin correcta.

El anlisis del algoritmo de insercin se determin que la complejidad del algoritmo es complejidad cuadrtica.

C) Ordenacin por burbuja: es un sencilloalgoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambindolos de posicin si estn en el orden equivocado.

Cul es la eficiencia del algoritmo de ordenacin de la burbuja? Depender de la versin utilizada. En la versin ms simple se hacen n 1 pasadas y n 1 comparaciones en cada pasada. Por consiguiente, el nmero de comparaciones es (n 1) * (n 1) = n2 2n + 1, es decir, la complejidad o(n2).3. Algoritmos de ordenamiento y su eficiencia Quicksort

El algoritmoquicksortordena un vectorVeligiendo entre sus elementos un valor clavePque acta como pivote, organiza tres secciones, izquierda-P-derecha, todos los elementos a la izquierda debern ser menores a P, y los de la derecha mayores, los ordena sin tener que hacer ningn tipo de mezcla para combinarlos, cmo elegimos el pivote?.1. Mtodo 1: Lo ideal sera que el pivote fuera la mediana del vector para que las partes izquierda y derecha tuvieran el mismo tamao.2. Mtodo 2: recorremos el vector con un ndiceidesde 0 a n-1, y otro ndice j inversamente y cuando se crucen, es decir, tenga el mismo valor, ese se seleccionara como pivote.Como se puede suponer, la eficiencia del algoritmo depende de la posicin en la que termine el pivote elegido.4. Algoritmos de ordenamiento y su eficiencia HeapsortElordenamiento por montculos(heapsorteningls) es unalgoritmodeordenamientonorecursivo, no estable, con complejidad computacionalEste algoritmo consiste en almacenar todos los elementos del vector a ordenar en unmontculo(heap), y luego extraer el nodo que queda como nodo raz del montculo (cima) en sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los montculos, por la cual, la cima contiene siempre el menor elemento (o el mayor, segn se haya definido el montculo) de todos los almacenados en l. El algoritmo, despus de cada extraccin, recoloca en el nodo raz o cima, la ltima hoja por la derecha del ltimo nivel. Lo cual destruye la propiedad heap del rbol. Pero, a continuacin realiza un proceso de "descenso" del nmero insertado de forma que se elige a cada movimiento el mayor de sus dos hijos, con el que se intercambia. Este intercambio, realizado sucesivamente "hunde" el nodo en el rbol restaurando la propiedad montculo del arbol y dejndo paso a la siguiente extraccin del nodo raz.Algoritmo Lgico. 1. Se construye el montculo inicial a partir del arreglo original.2. Se intercambia la raz con el ltimo elemento del montculo.3. El ltimo elemento queda ordenado.4. El ltimo elemento se saca del montculo, no del arreglo.5. Se restaura el montculo haciendo que el primer elemento baje a laposicin que le corresponde, si sus hijos son menores.6. La raz vuelve a ser el mayor del montculo.7. Se repite el paso 2 hasta que quede un solo elemento en el montculo.

VentajasDesventajas

La principal ventaja es que este mtodo funciona ms efectivamente con datos desordenados

No es estable ya que se comporta de manera ineficaz con datos del mismo valor

Su desempeo es en promedio tan bueno como el Quicksort y se comporta mejor que este en los peores casos

Mtodo ms complejo

No necesita memoria adicional

Con esto concluimos que la eficacia del mtodo de ordenamiento Heapsort depende de la data que se maneja, entre ms diferente y desordenada mejor.

5. Comparacin de la eficiencia de los algoritmos de bsqueda Secuencial y BinariaLos procesos de bsqueda involucran recorrer un arreglo completo con el fin de encontrar algo. Lo ms comn es buscar el menor o mayor elemento (cuando se puede establecer un orden), o buscar el ndice de un elemento determinado. Bsqueda Secuencial: Consiste en ir comparando el elemento que se busca con cada elemento del arreglo hasta cundo se encuentra.

Ejemplos de algoritmos:Bsqueda del menorBsqueda de elementoencontrado=-1;for (i=0;i BF: 341 millis (777391 comparisons)

10000 tests --> BM: 2424 millis (1877086 comparisons)10000 tests --> BF: 2872 millis (8021317 comparisons)

100000 tests --> BM: 22760 millis (18809679 comparisons)100000 tests --> BF: 34268 millis (79647647 comparisons)

8. Tcnicas de clculo de direcciones y comparaciones HashingDefinicin:Hasta ahora las tcnicas de localizacin de registros vistas, emplean un proceso de bsqueda que implica cierto tiempo y esfuerzo. El siguiente mtodo nos permite encontrar directamente el registro buscado.La idea bsica de este mtodo consiste en aplicar una funcin que traduce un conjunto de posibles valores llave en un rango de direcciones relativas. Un problema potencial encontrado en este proceso, es que tal funcin no puede ser uno a uno; las direcciones calculadas pueden no ser todas nicas, cuando R(k1)= R(k2)Pero: K1diferente de K2decimos que hay unacolisin. A dos llaves diferentes que les corresponda la misma direccin relativa se les llamasinnimos.A las tcnicas de clculo de direcciones tambin se les conoce como: Tcnicas de almacenamiento disperso Tcnicas aleatorias Mtodos de transformacin de llave - a- direccin Tcnicas de direccionamiento directo Mtodos de tabla Hash Mtodos de Hashing

Pero el trmino ms usado es el de hashing. Al clculo que se realiza para obtener una direccin a partir de una llave se le conoce como funcin hash.

Ventaja1. Se pueden usar los valores naturales de la llave, puesto que se traducen internamente a direcciones fciles de localizar2. Se logra independencia lgica y fsica, debido a que los valores de las llaves son independientes del espacio de direcciones3. No se requiere almacenamiento adicional para los ndices.Desventajas1. No pueden usarse registros de longitud variable2. El archivo no est clasificado3. No permite llaves repetidas4. Solo permite acceso por una sola llaveCostos Tiempo de procesamiento requerido para la aplicacin de la funcin hash Tiempo de procesamiento y los accesos E/S requeridos para solucionar las colisiones.

La eficiencia de una funcin hash depende de:1. La distribucin de los valores de llave que realmente se usan2. El nmero de valores de llave que realmente estn en uso con respecto al tamao del espacio de direcciones3. El nmero de registros que pueden almacenarse en una direccin dad sin causar una colisin4. La tcnica usada para resolver el problema de las colisiones

Las funciones hash ms comunes son: Residuo de la divisin Medio del cuadrado Pliegue

HASHING POR RESIDUO DE LA DIVISINLa idea de este mtodo es la de dividir el valor de la llave entre un numero apropiado, y despus utilizar el residuo de la divisin como direccin relativa para el registro (direccin = llave mdulo divisor).Mientras que el valor calculado real de una direccin relativa, dados tanto un valor de llave como el divisor, es directo; la eleccin del divisor apropiado puede no ser tan simple. Existen varios factores que deben considerarse para seleccionar el divisor:1. El rango de valores que resultan de la operacin llave % divisor, va desde cero hasta el divisor 1. Luego, el divisor determina el tamao del espacio de direcciones relativas. Si se sabe que el archivo va a contener por lo menos n registros, entonces tendremos que hacer que divisor > n, suponiendo que solamente un registro puede ser almacenado en una direccin relativa dada.2. El divisor deber seleccionarse de tal forma que la probabilidad de colisin sea minimizada. Cmo escoger este nmero? Mediante investigaciones se ha demostrado que los divisores que son nmeros pares tienden a comportase pobremente, especialmente con los conjuntos de valores de llave que son predominantemente impares. Algunas investigaciones sugieren que el divisor deber ser un nmero primo. Sin embargo, otras sugieren que los divisores no primos trabajan tambin como los divisores primos, siempre y cuando los divisores no primos no contengan ningn factor primo menor de 20. Lo ms comn es elegir el nmero primo ms prximo al total de direcciones.

Independientemente de que tan bueno sea el divisor, cuando el espacio de direcciones de un archivo est completamente lleno, la probabilidad de colisin crece dramticamente. La saturacin de archivo de mide mediante su factor de carga, el cual se define como la relacin del nmero de registros en el archivo contra el nmero de registros que el archivo podra contener si estuviese completamente lleno.

Todas las funciones hash comienzan a trabajar probablemente cuando el archivo esta casi lleno. Por lo general el mximo factor de carga que puede tolerarse en un archivo para un rendimiento razonable es de entre el 70 % y 80 %.HASHING POR MEDIO DEL CUADRADOEn esta tcnica, la llave es elevada al cuadrado, despus algunos dgitos especficos se extraen de la mitad del resultado para constituir la direccin relativa. Si se desea una direccin de n dgitos, entonces los dgitos se truncan en ambos extremos de la llave elevada al cuadrado, tomando n dgitos intermedios. Las mismas posiciones de n dgitos deben extraerse para cada llave.Utilizando esta funcin hashing el tamao del archivo resultante es de 10ndonde n es el nmero de dgitos extrados de los valores de la llave elevada al cuadrado.

HASHING POR PLIEGUEEn esta tcnica el valor de la llave es particionada en varias partes, cada una de las cuales(Excepto la ltima) tiene el mismo nmero de dgitos que tiene la direccin relativa objetivo. Estas particiones son despus plegadas una sobre otra y sumadas. El resultado, es la direccin relativa. Igual que para el mtodo del medio del cuadrado, el tamao del espacio de direcciones relativas es una potencia de 10.

COMPARACIN ENTRE LAS FUNCIONES HASHAunque alguna otra tcnica pueda desempearse mejor en situaciones particulares, la tcnica del residuo de la divisin proporciona el mejor desempeo. Ninguna funcin hash se desempea siempre mejor que las otras. El mtodo del medio del cuadrado puede aplicarse en archivos con factores de cargas bastantes bajas para dar generalmente un buen desempeo. El mtodo de pliegues puede ser la tcnica ms fcil de calcular pero produce resultados bastante errticos, a menos que la longitud de la llave se aproximadamente igual a la longitud de la direccin.Si la distribucin de los valores de llaves no es conocida, entonces el mtodo del residuo de la divisin es preferible. Note que el hashing puede ser aplicado a llaves no numricas. Las posiciones de ordenamiento de secuencia de los caracteres en un valor de llave pueden ser utilizadas como sus equivalentes numricos. Alternativamente, el algoritmo hash acta sobre las representaciones binarias de los caracteres.Todas las funciones hash presentadas tienen destinado un espacio de tamao fijo. Aumentar el tamao del archivo relativo creado al usar una de estas funciones, implica cambiar la funcin hash, para que se refiera a un espacio mayor y volver a cargar el nuevo archivo.9. MTODOS PARA RESOLVER EL PROBLEMA DE LAS COLISIONESConsidere las llaves K1y K2que son sinnimas para la funcin hash R. Si K1es almacenada primero en el archivo y su direccin es R(K1), entonces se dice que K1esta almacenado en su direccin de origen.

Existen dos mtodos bsicos para determinar dnde debe ser alojado K2: Direccionamiento abierto.- Se encuentra entre direccin de origen para K2dentro del archivo. Separacin de desborde (rea de desborde).-Se encuentra una direccin para K2fuera del rea principal del archivo, en un rea especial de desborde, que es utilizada exclusivamente para almacenar registro que no pueden ser asignados en su direccin de origen

Los mtodos ms conocidos para resolver colisiones son:

Sondeo linealQue es una tcnica de direccionamiento abierto. Este es un proceso de bsqueda secuencial desde la direccin de origen para encontrar la siguiente localidad vaca. Esta tcnica es tambin conocida como mtodo de desbordamiento consecutivo.Para almacenar un registro por hashing con sondeo lineal, la direccin no debe caer fuera del lmite del archivo, En lugar de terminar cuando el lmite del espacio de direccin se alcanza, se regresa al inicio del espacio y sondeamos desde ah. Por lo que debe ser posible detectar si la direccin base ha sido encontrada de nuevo, lo cual indica que el archivo est lleno y no hay espacio para la llave.Para la bsqueda de un registro por hashing con sondeo lineal, los valores de llave de los registros encontrados en la direccin de origen, y en las direcciones alcanzadas con el sondeo lineal, deber compararse con el valor de la llave buscada, para determinar si el registro objetivo ha sido localizado o no.

El sondeo lineal puede usarse para cualquier tcnica de hashing. Si se emplea sondeo lineal para almacenar registros, tambin deber emplearse para recuperarlos.

Doble hashingEn esta tcnica se aplica una segunda funcin hash para combinar la llave original con el resultado del primer hash. El resultado del segundo hash puede situarse dentro del mismo archivo o en un archivo de sobreflujo independiente; de cualquier modo, ser necesario algn mtodo de solucin si ocurren colisiones durante el segundo hash.La ventaja del mtodo de separacin de desborde es que reduce la situacin de una doble colisin, la cual puede ocurrir con el mtodo de direccionamiento abierto, en el cual un registro que no est almacenado en su direccin de origen desplazara a otro registro, el que despus buscar su direccin de origen. Esto puede evitarse con direccionamiento abierto, simplemente moviendo el registro extrao a otra localidad y almacenando al nuevo registro en la direccin de origen ahora vaca.Puede ser aplicado como cualquier direccionamiento abierto o tcnica de separacin de desborde.Para ambas mtodos para la solucin de colisiones existen tcnicas para mejorar su desempeo como:1.- Encadenamiento de sinnimosUna buena manera de mejorar la eficiencia de un archivo que utiliza el clculo de direcciones, sin directorio auxiliar para guiar la recuperacin de registros, es el encadenamiento de sinnimos. Mantener una lista ligada de registros, con la misma direccin de origen, no reduce el nmero de colisiones, pero reduce los tiempos de acceso para recuperar los registros que no se encuentran en su localidad de origen. El encadenamiento de sinnimos puede emplearse con cualquier tcnica de solucin de colisiones.Cuando un registro debe ser recuperado del archivo, solo los sinnimos de la llave objetivo son accesados.2.- Direccionamiento por cubetasOtro enfoque para resolver el problema de las colisiones es asignar bloques de espacio (cubetas), que pueden acomodar ocurrencias mltiples de registros, en lugar de asignar celdas individuales a registros. Cuando una cubeta es desbordada, alguna nueva localizacin deber ser encontrada para el registro. Los mtodos para el problema de sobrecupo son bsicamente el mismo que los mtodos para resolver colisiones.COMPARACIN ENTRE SONDEO LINEAL Y DOBLE HASHINGDe ambos mtodos resultan distribuciones diferentes de sinnimos en un archivo relativo. Para aquellos casos en que el factor de carga es bajo (< 0.5), el sondeo lineal tiende a agrupar los sinnimos, mientras que el doble hashing tiende a dispersar los sinnimos ms ampliamente a travs del espacio de direcciones.El doble hashing tiende a comportarse casi tambin como el sondeo lineal con factores de carga pequeos (< 0.5), pero acta un poco mejor para factores de carga mayores. Con un factor de carga > 80 %, el sondeo lineal por lo general resulta tener un comportamiento terrible, mientras que el doble hashing es bastante tolerable para bsquedas exitosas pero no as en bsquedas no exitosas.

Conclusin-Algunas veces la eficiencia de un programa es algo transparente para los usuarios y a veces para el desarrollador joven, pues la diferencia en tiempo de ejecucin entre un programa eficiente y uno no eficiente y la cantidad de recursos que utilizan suelen ser irrelevantes por el tipo de aplicaciones que se programan. Pero es ciertamente es un tema de mucha importancia en especial en niveles ms altos de programacin, cuando la lgica y el cdigo se domine solo queda optimizar. Es muy interesante investigar diferentes algoritmos con particularidades diferentes aunque cuenten con el mismo fin como por ejemplo la bsqueda secuencial y Binaria, las 2 hacen los mismo pero tienen sus beneficios e inconvenientes, pues la bsqueda binaria requiere que se ordenen los elementos a analizar lo que requiere programacin extra, la bsqueda secuencial es ms sencilla y no requiere que se ordenen los elementos pero en el peor de los casos comparar todos los elementos presentes. Entonces cae en el programador decidir que algoritmo le beneficia a su aplicacin.