Introducción ALGORITMO DE ORDENACIÓN Un algoritmo eficiente siempre tiene que ser mejor que otro que no lo es, aun en el caso de que el segundo se ejecute en un sistema claramente superior. Un análisis de coste puede efectuarse en cualquiera de los ámbitos de su uso. Los dos más frecuentes son: El análisis de coste computacional, que mide la eficiencia de coste temporal de los algoritmos. El análisis de consumo de memoria, que mide la cantidad de memoria consumida por un algoritmo. Un buen algoritmo no debe depender del sistema en el que se ejecuta. Cuando hablamos del sistema informático en el entorno de análisis del coste computacional (o de otros recursos), englobamos en la expresión cualquier característica peculiar: Sistema operativo Hardware Lenguaje de programación RAM Velocidad de CPU, etc. Métodos De Ordenación Los métodos de ordenación conocidos son: Inserción Directa: Para x=2 hasta n (+) Y x-1 Sw 0 Mientras (y<>0) y (sw=0) Si A[y-1]>A[y] AuxA[y-1] A[y-1]A[y] A[y]Aux De lo contrario Sw1 Yy-1 Selección directa: ANÁLISIS Y DISEÑO DE ALGORITMOS Patricia Calapi Página 1
Para x=1 hasta n-1 (+) Menorx Para y=x+1 hasta n (+) Si A[y] <A [menor] Menory Si menor<>x AuxA[x] A[x] A[menor] A[menor] Aux Método De La Burbuja: Para i=1 hasta n-1 Para j=i+1 hasta n Si A[i]>A[j] AuxA[i] A[i]A[j] A[j]Aux Método de la burbuja mejorado: Sw1 Mientras sw=1 Sw 0 Para i=1 hasta n-1 (+) Si A[i] >A[i+1] AuxA[i] A[i]A[i+1] A[i+1]Aux COMPARACION DE COMPLEJIDADES: ORDEN DE COMPLEJIDAD INSERCION DIRECTA SELECCION DIRECTA (MEJORADO) MEJOR CASO O(N) O(N2) O(N2) O(N) CASO PROMEDIO O(N2) O(N2) O(N2) O(N2) PEOR CASO O(N2) O(N2) O(N2) O(N log N) ORDEN EXACTO DE COMPLEJIDAD INSERCION DIRECTA SELECCIÓN DIRECTA MEJORADO O(N2) O (N2) O (N2) O (N2) TIEMPO EN COMPARACIONES Y ASIGNACIONES: INSERCION DIRECTA SELECCIÓN DIRECTA MEJORADO ANÁLISIS Y DISEÑO DE ALGORITMOS Patricia Calapi Página 2
COM n-1 n-1 MEJOR CASO ASIG 0 0 0 0 PROMEDIO COM DEPENDE ASIG PEOR CASO COM ASIG n-1 Cuál es el algoritmo de ordenación más óptimo en cuanto a tiempo y espacio? El algoritmo de ordenación QuickSort (se basa en la técnica divide y vencerás) para grandes conjuntos de datos es el más eficiente. Si hacemos una comparación con el algoritmo de ordenación por burbuja (BubbleSort), independientemente del sistema informático que se use para ejecutarlos. A pesar de ello suele ser el algoritmo más utilizado, y se demuestra que su tiempo promedio es menor, en una cantidad constante, al de todos los algoritmos de ordenación de complejidad O(n log n). En todo esto es importante hacer notar, como hemos indicado antes, la relevancia que toma una buena elección del pivote, pues de su elección depende considerablemente el tiempo de ejecución del algoritmo. La técnica divide y vencerás consiste en: Descomponer un problema en un conjunto de subproblemas más pequeños. Se resuelven estos subproblemas. Se combinan las soluciones para obtener la solución para el problema original. Algoritmo: PROCEDURE Quicksort(VAR a:vector;prim,ult:cardinal); VAR l:cardinal; BEGIN IF prim<ult THEN ANÁLISIS Y DISEÑO DE ALGORITMOS Patricia Calapi Página 3
l:=pivote(a,a[prim],prim,ult); Quicksort(a,prim,l-1); Quicksort(a,l+1,ult) END END Quicksort; ********************************************************************************** PROCEDURE Pivote(VAR a:vector;p:integer;prim,ult:cardinal) :CARDINAL; (* permuta los elementos de a[prim..ult] y devuelve una posicion l tal que prim<=l<=ult, a[i]<=p si prim<=i<l, a[l]=p, y a[i]>p si l<i<=ult, donde p es el valor inicial de a[prim] *) VAR i,l:cardinal; BEGIN i:=prim; l:=ult+1; REPEAT INC(i) UNTIL (a[i]>p) OR (i>=ult); REPEAT DEC(l) UNTIL (a[l]<=p); WHILE i<l DO Intercambia(a,i,l); REPEAT INC(i) UNTIL (a[i]>p); REPEAT DEC(l) UNTIL (a[l]<=p) END; Intercambia(a,prim,l); RETURN l END Pivote; El tiempo utilizado por los dos algoritmos para ordenar un vector de 1000000 de elementos es el siguiente: PC AMD Athlon XP2800+ 2.08 GHz 512 RAM usando el algoritmo de ordenación QuickSort: Tiempo de ejecución 8 segundos. IBM Star usando el algoritmo de ordenación de la burbuja: Tiempo de ejecución 6 minutos. Teniendo en cuenta que el IBM Star es 160 veces más rápido que el PC en cuestión se puede apreciar que la eficiencia del Quicksort frente a la burbuja, con un tamaño de datos considerable, no depende del sistema informático. ANÁLISIS Y DISEÑO DE ALGORITMOS Patricia Calapi Página 4
LUCENE Introducción Cualquier motor de búsqueda tiene dos elementos clave: la indexación y la búsqueda. Primero hay que definir sobre qué se quiere buscar y cómo, y luego buscar. La parte de indexación es mucho más compleja que la de búsqueda, y es en la que más tiempo nos pasaremos pensando. Lo bueno de Lucene, es que tanto la indexación como la búsqueda giran entorno a lo mismo: el Documento, que es sin duda uno de los elementos más importantes. Usaremos paralelismos con base de datos, con la premisa de que sólo sirven para hacernos a una idea: La "tabla" de la base de datos tiene su analogía en Lucene con el "index". Un "index" acaba siendo un directorio con varios archivos determinados, de los cuales no queremos saber nada. Sólo nos interesa saber su nombre y que todo el directorio debe tener permisos de lectura y escritura. La "estructura de la tabla" de la base de datos es el "Document". El Document no se define de forma fija desde un principio. Lo vamos a generar en código, "al vuelo". Los "campos de la tabla" son los "Fields" del Document. Igual que en una base de datos definiríamos el tipo de datos del "Field" o si es Nullable o no, los Fields de Lucene requieren una serie de definiciones que veremos en artículos posteriores. Qué es Lucene?, y que aplicaciones prácticas se le podría dar? Lucene es un api para la recuperación de información, Information Retrieval (IR), distribuido bajo la Apache Software License. Encaja perfectamente en el concepto de gestión documental (DMS) e incluso en la gestión de contenidos (CMS), puesto que un sistema de gestión documental requiere de la extracción del contenido de los documentos, la indexación de los mismos en un repositorio y la posibilidad de recuperarlos realizando búsquedas por su contenido textual. ANÁLISIS Y DISEÑO DE ALGORITMOS Patricia Calapi Página 5
Como ya especifique es útil para cualquier aplicación que requiera indexado y búsqueda a texto completo; tanto la indexación como la búsqueda gira entorno a lo mismo: el Document, que es sin duda uno de los elementos más importante. Expresándolo en pseudocódigo: Indexación Función Indexar(parámetros) { Indice = AbrirIndice(); Document doc = new Document(); doc.añadirfield(new Field(parametros1)); doc.añadirfield(new Field(parametros2)); Indice.AñadirDocument(doc); Búsqueda Función Buscar(parámetros) { Indice = AbrirIndice(); DocumentCollection docs = Indice.Buscar(parámetros); Indice.Cerrar(); } Indice.Cerrar(); } Toda la información con la que trabaja lucene, es de tipo string, por tanto, si queremos guardar números, y lo que es más importante, hacer busquedas sobre estos de tipo BETWEEN hemos de tener en cuenta la longitud de las cadenas a comparar. Lucene tiene versiones para otros lenguajes como Delphi, Perl, C#, C++, Python, Ruby y PHP y se encuentran en desarrollo versiones para lenguajes de programación como: Lucene4c - C CLucene - C++ MUTIS - Delphi NLucene -.NET Lucene.Net -.NET Plucene - Perl Pylucene - Python Ferret y RubyLucene - Ruby Zend Framework (búsquedas) - PHP Nutch - Java (Buscador web, tipo Google) Montezuma Lisp ANÁLISIS Y DISEÑO DE ALGORITMOS Patricia Calapi Página 6