SlideShare una empresa de Scribd logo
1 de 49
Descargar para leer sin conexión
Algoritmos de Ordenación y Búsqueda




                 Algoritmos de Ordenación y Búsqueda
                                          una vista ligera


                                         Dr. Arno Formella

                                       Departamento de Informática
                                          Universidad de Vigo


                                      21-22 de Mayo de 2009
Algoritmos de Ordenación y Búsqueda




      Ordenar y buscar I

      1     Introduction

      2     Ordenación

      3     Búsquedas




      Dibujos y animaciones
      Estas transparencias se acompaña con dibujos y animaciones
      de algoritmos en la pizarra en tiempo real.
Algoritmos de Ordenación y Búsqueda
  Introduction
    Presentación


      ¿Quién soy?




                 Arno FORMELLA (alemán)
                 hablo: castellano (cambiamos al inglés? o alemán?)
                 desde 2000: Universidad de Vigo, España
                 Departamento de Informática
                 Escuela Superior de Ingeniería Informática (Ourense)
                 antes: Universität des Saarlandes, Alemania
Algoritmos de Ordenación y Búsqueda
  Introduction
    Motivación


      ¿Qué es ordenar?



                 necesitamos objetos distinguibles
                 con una característica comparable
                 de forma transitiva,
                 por ejemplo: números {1, 2, 3, 4, 5, . . . }, ≤
                 a ≤ b y b ≤ c entonces a ≤ c
                 asumimos una relación total
                 ¿Qué se puede hacer si la relación es parcial?
Algoritmos de Ordenación y Búsqueda
  Introduction
    Motivación


      ¿Por qué ordenamos?




                 para tener un acceso más rápido a los datos, por ejemplo,
                 con búsqueda binaria
                 para encontrar el mediano o la pareja más próxima
                 para identificar casos excepcionales estadísticamente
                 para encontrar duplicados
Algoritmos de Ordenación y Búsqueda
  Introduction
    Motivación


      ¿Dónde se ordena también?




                 algoritmos de informática gráfica
                 algoritmos de bioinformática
                 algoritmos de geometría computacional
                 algoritmos de planificación y optimización
                 algoritmos de simulación y visualización
Algoritmos de Ordenación y Búsqueda
  Introduction
    Motivación


      ¿Ya está hecho todo?



       el mundo cambia continuadamente:
                 los lenguajes de programación
                 las arquitecturas de los ordenadores
                 las aplicaciones de interés

       Consecuencia:
       Se necesita reprogramar y adaptar.
Algoritmos de Ordenación y Búsqueda
  Introduction
    Motivación


      Ley de Moore


       cada 18 meses:
                 se duplica la velocidad de los procesadores
                 se duplica la capacidad de la memoria
                 se duplica el tamaño de las aplicaciones
                 (se duplica el número de procesadores)

       Consecuencia:
       La misma aplicación necesita el doble (o más) del tiempo.
Algoritmos de Ordenación y Búsqueda
  Introduction
    Motivación


      Ley para el ingeniero




       Finalmente:
       Hay que saber los algoritmos fundamentales y sus
       propiedades, porque son el software ultimativamente portable.
Algoritmos de Ordenación y Búsqueda
  Introduction
    Criterios de evaluación


      Notación O



                 decimos una función f (n) es de O(g(n))
                 si existe una constante c y un n0
                 tal que: f (n) ≤ c · g(n) para todos los n > n0
                 decimos una función f (n) es de Ω(g(n))
                 si existe una constante c y un n0
                 tal que: f (n) ≥ c · g(n) para todos los n > n0
Algoritmos de Ordenación y Búsqueda
  Introduction
    Herramientas de evaluación


      Evaluar lo que es interesante




                 se concentra en la operaciones fundamentales
                 se analiza: caso óptimo, caso medio, caso peor.
                 se dice: algoritmo es óptimo, si orden del límite inferior es
                 igual que el orden del límite superior
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación


      Taxonomía



      Usamos una taxonomía en tres niveles:
          Principio: describe cuál es la idea principal para lograr la
                     ordenación
               Método: describe una idea específica dentro de un
                       principio para lograr la ordenación
         Algoritmo: describe cuáles son los pasos concretos en una
                    implementación de un método de ordenación
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación


      Principios de ordenación




               basados en comparaciones de claves
               basados en contar ocurrencias
               basados en conocimiento sobre los datos
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación


      Métodos de ordenación basados en comparaciones



               extracción aleatorio, inserción en orden
               extracción en orden, inserción directa
               partición de los datos y recursividad
               hay todo un zoo:
               InsertionSort, HeapSort, QuickSort, MergeSort,
               BubbleSort, SelectionSort, IntroSort, FlashSort, BurstSort,
               ShellSort, etc.
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación

      Complejidad de ordenación basados en
      comparaciones




               Se necesita Ω(n log n) comparaciones.
               Argumento: profundidad mínima de un árbol de decisiones.
               hay n! posibles hojas en el árbol
               tenemos para su altura:
               h ≥ log n! ≥ log(n/e)n ≥ n log n − n
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación

      Métodos de ordenación basados en contar
      ocurrencias




               BucketSort
               CountingSort
               RadixSort
               (con estos seguimos mañana)
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación

      Algoritmos de ordenación basados en
      conocimiento




      JordanSort: si se sabe que los datos por ordenar están a lo
                  largo de una curva de Jordan, se puede ordenar
                  en tiempo lineal, O(n).
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación

      Propiedades de interés de algoritmos de
      ordenación


               tiempo de cálculo (dependencia de los datos)
               uso de memoria adicional
               ordenación estable
               número de comparaciones
               número de operaciones de intercambio de datos
               forma de acceso a la memoria
               comportamiento en jerarquía de memory
               paralelizable
               predicible (determinístico)
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Clasificación


      ¿Qué es ordenación estable?



               dos elementos iguales mantienen el orden después de la
               ordenación
               especialmente interesante si se ordena elementos con
               campos diferentes
               por ejemplo:
               primero nombre, después tipo, después tamaño
               no funciona (todavía) en GUIs de sistemas operativos
               (ni Gnome, ni Windows)
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      InsertionSort




               extrae elementos en cualquier orden
               (aquí de izquierda a derecha)
               inserta en estructura ordenada
               (aquí en vector ordenado desde la derecha)
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      InsertionSort


      int InsertionSort(IntArray& A) {
        for(unsigned int i(1); i<A.size(); ++i) {
          const int value(A[i]);
          j=i-1;
          while(j>=0 && A[j]>value) {
            A[j+1]=A[j];
            --j;
          }
          A[j+1]=value;
        }
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      HeapSort




               construye una estructura llamado heap (montón)
               extrae mínimo e inserta en orden
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      HeapSort (C++)




      void HeapSort(IntArray& A) {
        Heap heap(A);
        for(unsigned int k(A.size()-1); k >= 1; --k) {
          A[k]=heap.DeleteMin();
        }
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      HeapSort (C++)


      class Heap {
        IntArray& A;
        unsigned int size;
      public:
        Heap(IntArray& A);
        int DeleteMin(void);
        void FilterDown(unsigned int current);
        unsigned int LeftChild(
          const unsigned int padre
        ) const {
          return 2*padre+1;
        }
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      HeapSort (C++)



      int Heap::Heap(IntArray& A_) :
        A(A_),
        size(A.size())
      {
        unsigned int current((size-2)/2); // ultimo padre
        while(current>=0)
          FilterDown(current);
          --current;
        }
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      HeapSort (C++)




      int Heap::DeleteMin(void) {
        const int min(A[0]);   // guardar
        A[0]=A[size-1]; // copiar ultimo como nueva raiz
        size--;
        FilterDown(0); // reajustar
        return min;
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      HeapSort (C++)

      void Heap::FilterDown(unsigned int current) {
        const int target(A[current]);
        unsigned int child(LeftChild(current));
        while(child<size) {
          const unsigned int right_child(child+1);
          if((right_child<size) &&
             (A[right_child]<=A[child])
          ) child=right_child;
          if(target<=A[child]) break; // ya estan
          A[current]=A[child]; // mover contenido arriba
          current=child;       // bajar en el arbol
          child=LeftChild(current);
        }
        A[current]=target; // copiar a su posicion
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      HeapSort análisis




               FilterDown necesita tiempo proporcional a la altura
               donde comienza
               entonces la construcción se realiza en tiempo lineal
               la ordenación se realiza en tiempo O(n log n)
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      QuickSort




               elige elemento pivote
               particiona los datos con el pivote
               ordena recursivamente
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      QuickSort (Java)


      void QuickSort(Item a[], int left, int right) {
        if(right<=left) return;
        int i=left-1, j=right, Item pivot=a[right];
        for(;;) {
          while(a[++i]<pivot);
          while(pivot<a[--j]) if(j==i) break;
          if(i>=j) break;
          Exchange(a[i],a[j]);
        }
        Exchange(a[i],a[right]);
        QuickSort(a,left,i-1); QuickSort(a,i+1,right);
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      Problemas de QuickSort




               ¿Cómo escoger el pivote?
               mediano de tres: primero, medio, y último
               ¿Qué hacer con elementos iguales?
                       A: ¿Todo en un lado (1962)?
                       B: ¿Dejar donde están?
                       C: ¿Hay algo mejor (1993)?
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      QuickSort mejorado




               establecer la siguiente invariante después de la partición
               hay cuatro partes:
               iguales, más pequeños, más grandes, iguales
               transformar antes de la recursión en
               más pequeños, iguales, más grandes
               se ordena solamente las partes necesarias
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      QuickSort (mejorado)

      void QuickSort(Item a[], int left, int right) {
        if(right<=left) return;
        int i=left-1, j=right, Item pivot=a[right];
        int p=left-1, q=right;
        for(;;) {
          while(a[++i]<pivot);
          while(pivot<a[--j]) if(j==i) break;
          if(i>=j) break;
          Exchange(a[i],a[j]);
          if(a[i]==pivot) Exchange(a[++p],a[i]);
          if(pivot==a[j]) Exchange(a[--q],a[j]);
        }
        Exchange(a[i],a[right]);
        for(int k=1;k<p;)       Exchange(a[k++],a[j--]);
        for(int k=right-1;k>q;) Exchange(a[k--],a[i++]);
        QuickSort(a,left,j); QuickSort(a,i,right);
      }
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      MergeSort




               particiona los datos en partes
               ordena recursivamente
               intercala las partes ordenadas
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      Comparación


        Algoritmo                  media         peor       estable    mem
        InsertionSort              O(n2 )       O(n2 )         si      O(1)
        QuickSort                 O(n log n)    O(n2 )        no      O(log n)
        MergeSort                 O(n log n)   O(n log n)      si      O(n)
        HeapSort                  O(n log n)   O(n log n)     no       O(1)

      Abierto:
      No se conoce ningún algoritmo que es óptimo tanto en tiempo
      como en memoria y al mismo tiempo estable.
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con comparación


      Comparación


        Algoritmo                 paralizable   cache    acceso      listas
        InsertionSort                  ?         (si)     lineal      bien
        QuickSort                     si         bien     lineal       mal
        MergeSort                     si         bien     lineal      bien
        HeapSort                      no         mal    aleatorio   muy mal

      Abierto:
      No se conoce ningún algoritmo paralelo que es óptimo y
      práctico.
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Ordenación con contar ocurrencias


      Contar en vez de comparar


               se cuenta en cubos para cada clave cuantas veces un
               elemento se encuentra en los datos
               se enumeran los datos según contenido de los cubos
               BucketSort
               ¿Y si hay muchas claves?
               se subdivide la clave en partes y se ordena iterativamente
               RadixSort
               desde más significante a menos: MSB RadixSort
               desde menos significante a más: LSB RadixSort
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Aplicaciones


      C++ Standard Template Library




               implementación del unstable sort con IntroSort
               una combinación de
               median–of–3–QuickSort + HeapSort +
               delayed–InsertionSort
               tiempo peor en O(n log n)
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Aplicaciones


      Java ordenación interna (system sort)



               QuickSort mejorado para tipos simples
               MergeSort para objetos

      Ataque:
      Es posible realizar un ataque algoritmico a una servidor en
      Java explotando la posibilidad de obligar a ordenar en tiempo
      en orden O(n2 ).
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Aplicaciones


      Banco de prueba para conjuntos de datos grandes




               banco de prueba: Gray benchmark
               hay que ordenar por lo menos 100 TB (tera byte)
               record 2009: 0.578 TB/min
               por: Hadoop, Owen O’Malley and Arun Murthy, Yahoo Inc.
               en concreto: 100 TB en 173 minutos
               3452 nodos x (2 Quadcore Xeons, 8 GB memory, 4 SATA)
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Aplicaciones


      ¿Qué hacemos con los datos ordenados?


               hay que preguntarse que se hace con los datos ordenados
               a veces basta con algo más simple
               ejemplo: quiero los k valores más pequeños (y ordenados)
               de una lista de n (los top k )
               genera heap en tiempo O(n) y estrae los k mínimos en
               tiempo O(k log n)
               de hecho incluso es posible hacerlo en O(n + k log k ),
               pero con una constante mucho más grande y si
               k < n/ log n no vale la pena
Algoritmos de Ordenación y Búsqueda
  Ordenación
    Aplicaciones


      ¿Dónde se ordenan los datos?




               BurstSort: método específico para ordenar cadenas de
               caracteres explotando bien la estructura del caché del
               ordenador.
               GpuSort: RadixSort paralelizado (y implementado con
               CUDA) para su ejecución en tarjetas gráficas con muchos
               núcleos de procesamiento
Algoritmos de Ordenación y Búsqueda
  Búsquedas
    Principios de búsquedas


      ¿Cómo se puede buscar?



              iterar linealmente sobre los datos hasta que se haya
              encontrado lo buscado
              ordenar primero los datos y buscar con un árbol como
              estructura de datos adicional
              el uso de un árbol requiere acceso por
                      índice, entonces se trabaja con arrays, o
                      puntero, entonces se trabaja con enlaces
              importante: los datos tienen que ser ordenables
Algoritmos de Ordenación y Búsqueda
  Búsquedas
    Principios de búsquedas


      ¿Hay otras formas?




              usar tablas de hash
              acceso a un elemento en tiempo constante
              Cuckoo–hashing como método con todas las operaciones
              (insertar, localizar, borrar) en tiempo constante
              (esperado con alta probabilidad)
Algoritmos de Ordenación y Búsqueda
  Búsquedas
    Búsquedas iterativas y dinámicas


      ¿Qué más se quiere hacer?



      enumerar rangos:
                     funciona con listas y árboles
                     no funciona con tablas de hash
      mantener cola de prioridades:
                      se mantiene un heap adecuado (Fibonacci)
                      que permite insertar y bajar prioridad en
                      tiempo constante
                      DeleteMin y borrar sigue necesitar tiempo
                      logarítmico
Algoritmos de Ordenación y Búsqueda
  Búsquedas
    Búsquedas iterativas y dinámicas


      Colas de prioridad



                                       lista      lista      heap        heap         heap
                                               ordenada     binario    binomial     fibonacci
         insert                    O(1)          O(n)       O(log n)   O(log n)       O(1)
         delete-min                O(n)          O(1)       O(log n)   O(log n)     O(log n)
         decrease-key              O(1)          O(n)       O(log n)   O(log n)       O(1)
         merge                     O(1)          O(n)        O(n)      O(log n)       O(1)
         find-min                   O(n)          O(1)        O(1)        O(1)         O(1)
         delete                    O(1)          O(1)       O(log n)   O(log n)     O(log n)
         increase-key              O(1)          O(n)       O(log n)   O(log n)     O(log n)
         make-queue                O(n)        O(n log n)    O(n)      O(n log n)     O(n)
Algoritmos de Ordenación y Búsqueda
  Búsquedas
    Más dimensiones


      extensión a dos (o más) dimensiones

              subdivisión binaria del espacio
              kd–árboles
              QuadTree
              diagramas de Voronoi
              ordenación y busqueda de intervalos

      Nota:
      Si se aumenta la dimensión, los tiempos de cálculo para
      construir la estructura de datos o la búsqueda suelen tener un
      factor que depende exponencialmente de d − 1, es decir, a
      partir de tres dimensiones, los algoritmos ya no funcionan en
      tiempo logarítmico.
Algoritmos de Ordenación y Búsqueda
  Búsquedas
    Más dimensiones


      Bibliografia I



              Th. Corman, C. Leiserson, R. Rivest. Indroduction to
              algorithms, Mc Graw Hill, 1990.
              D. Knuth. The art of computer programming: Sorting and
              searching, Vol. 3. Addison Wesley, 1973 (o ediciones más
              nuevas)
              material de R. Sedgewick y J. Bentley disponible en la red
              S. Merritt. An inverted taxonomy of sorting algorithms.
              Communications of the ACM, Vol. 28, 1985.
Algoritmos de Ordenación y Búsqueda
  Búsquedas
    Más dimensiones


      Bibliografia II



              N. Satish, M. Harris, M. Garland. Designing efficient
              sorting algorithms for manycore GPUs. IEEE International
              Parallel and Distributed Processing Symposium, 2009.
              K. Fung, T. Nicholl, R. Tarjan, C. Van Wyk. Simplified
              linear-time Jordan sorting and polygon clipping.
              Information Processing Letters 35, 1990.
              http://en.wikipedia.org secciones: sorting
              algorithms, searching algorithms

Más contenido relacionado

Similar a Porto

Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busquedaOsirysRock
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busquedaIrvingMoran4
 
Unidad 1 1
Unidad 1   1Unidad 1   1
Unidad 1 1VivianaG
 
Ordenación y búsqueda orientada a C++
Ordenación y búsqueda orientada a C++Ordenación y búsqueda orientada a C++
Ordenación y búsqueda orientada a C++Carlos Ureña
 
ALP Unidad 3: Tipos de datos estructurados y punteros
ALP Unidad 3: Tipos de datos estructurados y punterosALP Unidad 3: Tipos de datos estructurados y punteros
ALP Unidad 3: Tipos de datos estructurados y punterosFranklin Parrales Bravo
 
Algoritmos de ordeamiento
Algoritmos de ordeamientoAlgoritmos de ordeamiento
Algoritmos de ordeamientoYanahui Bc
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenaciónIgnacio Reyes
 
3 programacion estructurada
3 programacion estructurada3 programacion estructurada
3 programacion estructuradacortezbfajardo
 
Estructura de Datos y Algoritmos I (I Bimestre)
Estructura de Datos y Algoritmos I (I Bimestre)Estructura de Datos y Algoritmos I (I Bimestre)
Estructura de Datos y Algoritmos I (I Bimestre)Videoconferencias UTPL
 
Metodo_ordenamiento_Monticulo
Metodo_ordenamiento_MonticuloMetodo_ordenamiento_Monticulo
Metodo_ordenamiento_MonticuloEdgar Rueda
 
Tema 2 busqueda_ordenacion_grupo_21
Tema 2 busqueda_ordenacion_grupo_21Tema 2 busqueda_ordenacion_grupo_21
Tema 2 busqueda_ordenacion_grupo_21Carlos A. Iglesias
 
02 uni1-estructuras de datos-arreglos
02 uni1-estructuras de datos-arreglos02 uni1-estructuras de datos-arreglos
02 uni1-estructuras de datos-arreglosFranco Guamán
 
Modulo estructura de_datos_2014
Modulo estructura de_datos_2014Modulo estructura de_datos_2014
Modulo estructura de_datos_2014Carlos Morales
 
LinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.pptLinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.pptjlmansilla
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosWilliam Diaz S
 

Similar a Porto (20)

Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busqueda
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busqueda
 
Unidad 1 1
Unidad 1   1Unidad 1   1
Unidad 1 1
 
Ordenación y búsqueda orientada a C++
Ordenación y búsqueda orientada a C++Ordenación y búsqueda orientada a C++
Ordenación y búsqueda orientada a C++
 
concepto de estructuras de datos
concepto de estructuras de datosconcepto de estructuras de datos
concepto de estructuras de datos
 
ALP Unidad 3: Tipos de datos estructurados y punteros
ALP Unidad 3: Tipos de datos estructurados y punterosALP Unidad 3: Tipos de datos estructurados y punteros
ALP Unidad 3: Tipos de datos estructurados y punteros
 
Algoritmos de ordeamiento
Algoritmos de ordeamientoAlgoritmos de ordeamiento
Algoritmos de ordeamiento
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenación
 
3 programacion estructurada
3 programacion estructurada3 programacion estructurada
3 programacion estructurada
 
Complejidad Computacional
Complejidad ComputacionalComplejidad Computacional
Complejidad Computacional
 
Estructura de Datos y Algoritmos I (I Bimestre)
Estructura de Datos y Algoritmos I (I Bimestre)Estructura de Datos y Algoritmos I (I Bimestre)
Estructura de Datos y Algoritmos I (I Bimestre)
 
Metodo_ordenamiento_Monticulo
Metodo_ordenamiento_MonticuloMetodo_ordenamiento_Monticulo
Metodo_ordenamiento_Monticulo
 
Tema 2 busqueda_ordenacion_grupo_21
Tema 2 busqueda_ordenacion_grupo_21Tema 2 busqueda_ordenacion_grupo_21
Tema 2 busqueda_ordenacion_grupo_21
 
02 uni1-estructuras de datos-arreglos
02 uni1-estructuras de datos-arreglos02 uni1-estructuras de datos-arreglos
02 uni1-estructuras de datos-arreglos
 
Algebra morelys lugo2
Algebra morelys lugo2Algebra morelys lugo2
Algebra morelys lugo2
 
Modulo estructura de_datos_2014
Modulo estructura de_datos_2014Modulo estructura de_datos_2014
Modulo estructura de_datos_2014
 
LinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.pptLinearSortOrderSatatistics.ppt
LinearSortOrderSatatistics.ppt
 
Busqueda de datos
Busqueda de datosBusqueda de datos
Busqueda de datos
 
Mètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsquedaMètodos de Ordenaciòn y bùsqueda
Mètodos de Ordenaciòn y bùsqueda
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a Objetos
 

Porto

  • 1. Algoritmos de Ordenación y Búsqueda Algoritmos de Ordenación y Búsqueda una vista ligera Dr. Arno Formella Departamento de Informática Universidad de Vigo 21-22 de Mayo de 2009
  • 2. Algoritmos de Ordenación y Búsqueda Ordenar y buscar I 1 Introduction 2 Ordenación 3 Búsquedas Dibujos y animaciones Estas transparencias se acompaña con dibujos y animaciones de algoritmos en la pizarra en tiempo real.
  • 3. Algoritmos de Ordenación y Búsqueda Introduction Presentación ¿Quién soy? Arno FORMELLA (alemán) hablo: castellano (cambiamos al inglés? o alemán?) desde 2000: Universidad de Vigo, España Departamento de Informática Escuela Superior de Ingeniería Informática (Ourense) antes: Universität des Saarlandes, Alemania
  • 4. Algoritmos de Ordenación y Búsqueda Introduction Motivación ¿Qué es ordenar? necesitamos objetos distinguibles con una característica comparable de forma transitiva, por ejemplo: números {1, 2, 3, 4, 5, . . . }, ≤ a ≤ b y b ≤ c entonces a ≤ c asumimos una relación total ¿Qué se puede hacer si la relación es parcial?
  • 5. Algoritmos de Ordenación y Búsqueda Introduction Motivación ¿Por qué ordenamos? para tener un acceso más rápido a los datos, por ejemplo, con búsqueda binaria para encontrar el mediano o la pareja más próxima para identificar casos excepcionales estadísticamente para encontrar duplicados
  • 6. Algoritmos de Ordenación y Búsqueda Introduction Motivación ¿Dónde se ordena también? algoritmos de informática gráfica algoritmos de bioinformática algoritmos de geometría computacional algoritmos de planificación y optimización algoritmos de simulación y visualización
  • 7. Algoritmos de Ordenación y Búsqueda Introduction Motivación ¿Ya está hecho todo? el mundo cambia continuadamente: los lenguajes de programación las arquitecturas de los ordenadores las aplicaciones de interés Consecuencia: Se necesita reprogramar y adaptar.
  • 8. Algoritmos de Ordenación y Búsqueda Introduction Motivación Ley de Moore cada 18 meses: se duplica la velocidad de los procesadores se duplica la capacidad de la memoria se duplica el tamaño de las aplicaciones (se duplica el número de procesadores) Consecuencia: La misma aplicación necesita el doble (o más) del tiempo.
  • 9. Algoritmos de Ordenación y Búsqueda Introduction Motivación Ley para el ingeniero Finalmente: Hay que saber los algoritmos fundamentales y sus propiedades, porque son el software ultimativamente portable.
  • 10. Algoritmos de Ordenación y Búsqueda Introduction Criterios de evaluación Notación O decimos una función f (n) es de O(g(n)) si existe una constante c y un n0 tal que: f (n) ≤ c · g(n) para todos los n > n0 decimos una función f (n) es de Ω(g(n)) si existe una constante c y un n0 tal que: f (n) ≥ c · g(n) para todos los n > n0
  • 11. Algoritmos de Ordenación y Búsqueda Introduction Herramientas de evaluación Evaluar lo que es interesante se concentra en la operaciones fundamentales se analiza: caso óptimo, caso medio, caso peor. se dice: algoritmo es óptimo, si orden del límite inferior es igual que el orden del límite superior
  • 12. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación Taxonomía Usamos una taxonomía en tres niveles: Principio: describe cuál es la idea principal para lograr la ordenación Método: describe una idea específica dentro de un principio para lograr la ordenación Algoritmo: describe cuáles son los pasos concretos en una implementación de un método de ordenación
  • 13. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación Principios de ordenación basados en comparaciones de claves basados en contar ocurrencias basados en conocimiento sobre los datos
  • 14. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación Métodos de ordenación basados en comparaciones extracción aleatorio, inserción en orden extracción en orden, inserción directa partición de los datos y recursividad hay todo un zoo: InsertionSort, HeapSort, QuickSort, MergeSort, BubbleSort, SelectionSort, IntroSort, FlashSort, BurstSort, ShellSort, etc.
  • 15. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación Complejidad de ordenación basados en comparaciones Se necesita Ω(n log n) comparaciones. Argumento: profundidad mínima de un árbol de decisiones. hay n! posibles hojas en el árbol tenemos para su altura: h ≥ log n! ≥ log(n/e)n ≥ n log n − n
  • 16. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación Métodos de ordenación basados en contar ocurrencias BucketSort CountingSort RadixSort (con estos seguimos mañana)
  • 17. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación Algoritmos de ordenación basados en conocimiento JordanSort: si se sabe que los datos por ordenar están a lo largo de una curva de Jordan, se puede ordenar en tiempo lineal, O(n).
  • 18. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación Propiedades de interés de algoritmos de ordenación tiempo de cálculo (dependencia de los datos) uso de memoria adicional ordenación estable número de comparaciones número de operaciones de intercambio de datos forma de acceso a la memoria comportamiento en jerarquía de memory paralelizable predicible (determinístico)
  • 19. Algoritmos de Ordenación y Búsqueda Ordenación Clasificación ¿Qué es ordenación estable? dos elementos iguales mantienen el orden después de la ordenación especialmente interesante si se ordena elementos con campos diferentes por ejemplo: primero nombre, después tipo, después tamaño no funciona (todavía) en GUIs de sistemas operativos (ni Gnome, ni Windows)
  • 20. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación InsertionSort extrae elementos en cualquier orden (aquí de izquierda a derecha) inserta en estructura ordenada (aquí en vector ordenado desde la derecha)
  • 21. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación InsertionSort int InsertionSort(IntArray& A) { for(unsigned int i(1); i<A.size(); ++i) { const int value(A[i]); j=i-1; while(j>=0 && A[j]>value) { A[j+1]=A[j]; --j; } A[j+1]=value; } }
  • 22. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación HeapSort construye una estructura llamado heap (montón) extrae mínimo e inserta en orden
  • 23. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación HeapSort (C++) void HeapSort(IntArray& A) { Heap heap(A); for(unsigned int k(A.size()-1); k >= 1; --k) { A[k]=heap.DeleteMin(); } }
  • 24. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación HeapSort (C++) class Heap { IntArray& A; unsigned int size; public: Heap(IntArray& A); int DeleteMin(void); void FilterDown(unsigned int current); unsigned int LeftChild( const unsigned int padre ) const { return 2*padre+1; } }
  • 25. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación HeapSort (C++) int Heap::Heap(IntArray& A_) : A(A_), size(A.size()) { unsigned int current((size-2)/2); // ultimo padre while(current>=0) FilterDown(current); --current; } }
  • 26. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación HeapSort (C++) int Heap::DeleteMin(void) { const int min(A[0]); // guardar A[0]=A[size-1]; // copiar ultimo como nueva raiz size--; FilterDown(0); // reajustar return min; }
  • 27. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación HeapSort (C++) void Heap::FilterDown(unsigned int current) { const int target(A[current]); unsigned int child(LeftChild(current)); while(child<size) { const unsigned int right_child(child+1); if((right_child<size) && (A[right_child]<=A[child]) ) child=right_child; if(target<=A[child]) break; // ya estan A[current]=A[child]; // mover contenido arriba current=child; // bajar en el arbol child=LeftChild(current); } A[current]=target; // copiar a su posicion }
  • 28. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación HeapSort análisis FilterDown necesita tiempo proporcional a la altura donde comienza entonces la construcción se realiza en tiempo lineal la ordenación se realiza en tiempo O(n log n)
  • 29. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación QuickSort elige elemento pivote particiona los datos con el pivote ordena recursivamente
  • 30. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación QuickSort (Java) void QuickSort(Item a[], int left, int right) { if(right<=left) return; int i=left-1, j=right, Item pivot=a[right]; for(;;) { while(a[++i]<pivot); while(pivot<a[--j]) if(j==i) break; if(i>=j) break; Exchange(a[i],a[j]); } Exchange(a[i],a[right]); QuickSort(a,left,i-1); QuickSort(a,i+1,right); }
  • 31. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación Problemas de QuickSort ¿Cómo escoger el pivote? mediano de tres: primero, medio, y último ¿Qué hacer con elementos iguales? A: ¿Todo en un lado (1962)? B: ¿Dejar donde están? C: ¿Hay algo mejor (1993)?
  • 32. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación QuickSort mejorado establecer la siguiente invariante después de la partición hay cuatro partes: iguales, más pequeños, más grandes, iguales transformar antes de la recursión en más pequeños, iguales, más grandes se ordena solamente las partes necesarias
  • 33. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación QuickSort (mejorado) void QuickSort(Item a[], int left, int right) { if(right<=left) return; int i=left-1, j=right, Item pivot=a[right]; int p=left-1, q=right; for(;;) { while(a[++i]<pivot); while(pivot<a[--j]) if(j==i) break; if(i>=j) break; Exchange(a[i],a[j]); if(a[i]==pivot) Exchange(a[++p],a[i]); if(pivot==a[j]) Exchange(a[--q],a[j]); } Exchange(a[i],a[right]); for(int k=1;k<p;) Exchange(a[k++],a[j--]); for(int k=right-1;k>q;) Exchange(a[k--],a[i++]); QuickSort(a,left,j); QuickSort(a,i,right); }
  • 34. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación MergeSort particiona los datos en partes ordena recursivamente intercala las partes ordenadas
  • 35. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación Comparación Algoritmo media peor estable mem InsertionSort O(n2 ) O(n2 ) si O(1) QuickSort O(n log n) O(n2 ) no O(log n) MergeSort O(n log n) O(n log n) si O(n) HeapSort O(n log n) O(n log n) no O(1) Abierto: No se conoce ningún algoritmo que es óptimo tanto en tiempo como en memoria y al mismo tiempo estable.
  • 36. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con comparación Comparación Algoritmo paralizable cache acceso listas InsertionSort ? (si) lineal bien QuickSort si bien lineal mal MergeSort si bien lineal bien HeapSort no mal aleatorio muy mal Abierto: No se conoce ningún algoritmo paralelo que es óptimo y práctico.
  • 37. Algoritmos de Ordenación y Búsqueda Ordenación Ordenación con contar ocurrencias Contar en vez de comparar se cuenta en cubos para cada clave cuantas veces un elemento se encuentra en los datos se enumeran los datos según contenido de los cubos BucketSort ¿Y si hay muchas claves? se subdivide la clave en partes y se ordena iterativamente RadixSort desde más significante a menos: MSB RadixSort desde menos significante a más: LSB RadixSort
  • 38. Algoritmos de Ordenación y Búsqueda Ordenación Aplicaciones C++ Standard Template Library implementación del unstable sort con IntroSort una combinación de median–of–3–QuickSort + HeapSort + delayed–InsertionSort tiempo peor en O(n log n)
  • 39. Algoritmos de Ordenación y Búsqueda Ordenación Aplicaciones Java ordenación interna (system sort) QuickSort mejorado para tipos simples MergeSort para objetos Ataque: Es posible realizar un ataque algoritmico a una servidor en Java explotando la posibilidad de obligar a ordenar en tiempo en orden O(n2 ).
  • 40. Algoritmos de Ordenación y Búsqueda Ordenación Aplicaciones Banco de prueba para conjuntos de datos grandes banco de prueba: Gray benchmark hay que ordenar por lo menos 100 TB (tera byte) record 2009: 0.578 TB/min por: Hadoop, Owen O’Malley and Arun Murthy, Yahoo Inc. en concreto: 100 TB en 173 minutos 3452 nodos x (2 Quadcore Xeons, 8 GB memory, 4 SATA)
  • 41. Algoritmos de Ordenación y Búsqueda Ordenación Aplicaciones ¿Qué hacemos con los datos ordenados? hay que preguntarse que se hace con los datos ordenados a veces basta con algo más simple ejemplo: quiero los k valores más pequeños (y ordenados) de una lista de n (los top k ) genera heap en tiempo O(n) y estrae los k mínimos en tiempo O(k log n) de hecho incluso es posible hacerlo en O(n + k log k ), pero con una constante mucho más grande y si k < n/ log n no vale la pena
  • 42. Algoritmos de Ordenación y Búsqueda Ordenación Aplicaciones ¿Dónde se ordenan los datos? BurstSort: método específico para ordenar cadenas de caracteres explotando bien la estructura del caché del ordenador. GpuSort: RadixSort paralelizado (y implementado con CUDA) para su ejecución en tarjetas gráficas con muchos núcleos de procesamiento
  • 43. Algoritmos de Ordenación y Búsqueda Búsquedas Principios de búsquedas ¿Cómo se puede buscar? iterar linealmente sobre los datos hasta que se haya encontrado lo buscado ordenar primero los datos y buscar con un árbol como estructura de datos adicional el uso de un árbol requiere acceso por índice, entonces se trabaja con arrays, o puntero, entonces se trabaja con enlaces importante: los datos tienen que ser ordenables
  • 44. Algoritmos de Ordenación y Búsqueda Búsquedas Principios de búsquedas ¿Hay otras formas? usar tablas de hash acceso a un elemento en tiempo constante Cuckoo–hashing como método con todas las operaciones (insertar, localizar, borrar) en tiempo constante (esperado con alta probabilidad)
  • 45. Algoritmos de Ordenación y Búsqueda Búsquedas Búsquedas iterativas y dinámicas ¿Qué más se quiere hacer? enumerar rangos: funciona con listas y árboles no funciona con tablas de hash mantener cola de prioridades: se mantiene un heap adecuado (Fibonacci) que permite insertar y bajar prioridad en tiempo constante DeleteMin y borrar sigue necesitar tiempo logarítmico
  • 46. Algoritmos de Ordenación y Búsqueda Búsquedas Búsquedas iterativas y dinámicas Colas de prioridad lista lista heap heap heap ordenada binario binomial fibonacci insert O(1) O(n) O(log n) O(log n) O(1) delete-min O(n) O(1) O(log n) O(log n) O(log n) decrease-key O(1) O(n) O(log n) O(log n) O(1) merge O(1) O(n) O(n) O(log n) O(1) find-min O(n) O(1) O(1) O(1) O(1) delete O(1) O(1) O(log n) O(log n) O(log n) increase-key O(1) O(n) O(log n) O(log n) O(log n) make-queue O(n) O(n log n) O(n) O(n log n) O(n)
  • 47. Algoritmos de Ordenación y Búsqueda Búsquedas Más dimensiones extensión a dos (o más) dimensiones subdivisión binaria del espacio kd–árboles QuadTree diagramas de Voronoi ordenación y busqueda de intervalos Nota: Si se aumenta la dimensión, los tiempos de cálculo para construir la estructura de datos o la búsqueda suelen tener un factor que depende exponencialmente de d − 1, es decir, a partir de tres dimensiones, los algoritmos ya no funcionan en tiempo logarítmico.
  • 48. Algoritmos de Ordenación y Búsqueda Búsquedas Más dimensiones Bibliografia I Th. Corman, C. Leiserson, R. Rivest. Indroduction to algorithms, Mc Graw Hill, 1990. D. Knuth. The art of computer programming: Sorting and searching, Vol. 3. Addison Wesley, 1973 (o ediciones más nuevas) material de R. Sedgewick y J. Bentley disponible en la red S. Merritt. An inverted taxonomy of sorting algorithms. Communications of the ACM, Vol. 28, 1985.
  • 49. Algoritmos de Ordenación y Búsqueda Búsquedas Más dimensiones Bibliografia II N. Satish, M. Harris, M. Garland. Designing efficient sorting algorithms for manycore GPUs. IEEE International Parallel and Distributed Processing Symposium, 2009. K. Fung, T. Nicholl, R. Tarjan, C. Van Wyk. Simplified linear-time Jordan sorting and polygon clipping. Information Processing Letters 35, 1990. http://en.wikipedia.org secciones: sorting algorithms, searching algorithms