Búsquedas
                          Complejidad
                         Ordenamiento




            Curso de Nivelación de Algoritmos
                                     Clase 3


                           Lic. Ernesto Mislej
                          emislej@dc.uba.ar

Maestría y Carrera de Especialización en Explotación de Datos y Descubrimiento
                                de Conocimiento


                          26 de marzo de 2008




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Búsquedas




  Ejemplo
  Decir si un número dado se encuentra en una lista de números.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Búsquedas




  Ejemplo
  Decir si un número dado se encuentra en una lista ordenada de
  números.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                           Complejidad
                          Ordenamiento


Búsquedas



  Ejemplo
  ¿Conocen el juego de adivinen un número?
      El jugador A piensa un número en un rango.
      El jugador B intenta adivinarlo.
      El jugador A solo puede responder mayor, menor o si acertó.
      Después rotan los papeles y gana quién hace menos preguntas.

  Elegir una estrategia para jugar.




                      Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Búsquedas




  Ejemplo
  Dibujen esa estrategia con el esquema que se sientan cómodos,
  para el rango 1..15.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Búsquedas




  ¿En cuántos pasos se resuelve?
  ¿Qué relación tiene con el número 15?


                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                           Complejidad
                          Ordenamiento


Búsquedas




  Ejemplo
  Ahora dibujen esa estrategia para el rango 1..7 ∪ 101..107.




                      Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                         Complejidad
                        Ordenamiento


Búsquedas



  Es posible adivinar cualquier número como máximo en:


                              log2(n)
  de pasos. . .




                    Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Búsquedas



      Esta estructura es bien conocida. Se llama Árbol Binario de
      Búsqueda.
      Es un tipo especial de árbol.
      Permite realizar búsquedas en tiempo logarítmico (de estar
      balanceado).
      Su regla de construcción es: los elementos de la rama izquierda
      son menores a los de la rama derecha.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                           Complejidad
                          Ordenamiento


Búsquedas



  Ejemplo
      ¿Recuerdan las agendas no-electrónicas?
      El acceso es en 2 pasos:
            Primero encuentro la letra inicial.
            Y después busco de manera secuencial.
      Dibujen el diagrama de acceso a los registros.
      Calculen el esfuerzo en encontrar un registro.




                      Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                         Complejidad
                        Ordenamiento


Búsquedas y Complejidad

      Podemos decir que realizar una búsqueda en una lista
      desordenada se realiza en tiempo lineal.
      Una búsqueda en una lista ordenada se realiza en tiempo
      logarítmico.
      Una búsqueda en una lista semi-ordenada, como una agenda
      se realiza entre esos dos tiempos.
      Podemos categorizar a los problemas según su esfuerzo de
      resolución.

                   Esa es la idea de complejidad.



                    Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Complejidad




   Ejemplo
      Piensen otras maneras de medir el esfuerzo de resolución.
      Calcular la complejidad en función de la cantidad de datos de
      entrada, para los ejemplos de la primera y segunda clase.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Ordenamiento



      El proceso de clasificación u ordenamiento de una lista de
      objetos es un proceso fundamental en la computación.
      Existen variados métodos de ordenamiento cada uno
      especialmente diseñado para diferentes datos de entrada

  Ejemplo
  Piensen algún método de ordenamiento.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                               Complejidad
                              Ordenamiento


Ordenamiento

  # Algoritmo de selección
  >>> def seleccion (x):
          a = list (x) #lista nueva a partir de x
          i = 0
          while i < len(a)-2: #selecciona el menor de entre a[i]..a[n]
              j = i + 1
              indicemenor = i
              clavemenor = a[i]

                 while j < len(a):
                     if a[j] < clavemenor:
                         clavemenor = a[j]
                         indicemenor = j
                     j = j + 1

              a[i], a[indicemenor] = a[indicemenor], a[i] #swap!
          i = i + 1

      return a

                          Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                              Complejidad
                             Ordenamiento


Ordenamiento




  >>>   # Algoritmo de selección
  >>>   l = [4, 2, 6, 5, 3, 1]
  >>>   k = seleccion(l)
  [1,   2, 6, 5, 3, 4]
  [1,   2, 6, 5, 3, 4]
  [1,   2, 3, 5, 6, 4]
  [1,   2, 3, 4, 6, 5]
  [1,   2, 3, 4, 5, 6]




                         Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                         Complejidad
                        Ordenamiento


Ordenamiento y Complejidad



      ¿Cuál es el esfuerzo del algoritmo de ordenamiento por
      selección?

                                 n(n − 1) pasos

      Decimos O(n2 )
      ¿Existirá algún método más eficiente?




                    Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Ordenamiento y Complejidad




      Recuerdan el ejercicio ”Intercalar 2 listas ordenadas para
      formar otra lista ordenada”
      ¿Cuánto es el esfuerzo de ese algoritmo?
                      Es un algoritmo de costo lineal.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                           Complejidad
                          Ordenamiento


Ordenamiento y Complejidad



   Reguerdan
       Las listas de 1 sólo elemento ya están ordenadas, ¿verdad?
       ¿Cuánto cuesta?:

                Intercalar 2 listas de 1 elemento.                2 pasos
                Intercalar 2 listas de 2 elementos.               4 pasos
                Intercalar 2 listas de 4 elementos.               8 pasos




                      Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                                 Complejidad
                                Ordenamiento


Ordenamiento y Complejidad

   Ordenar([8, 1, 6, 3, 7, 2, 5, 4]) = ?


       Intercalar([8],   [1])   =   [1, 8]                                   2   pasos
       Intercalar([6],   [3])   =   [3, 6]                                   2   pasos
       Intercalar([7],   [2])   =   [2, 7]                                   2   pasos
       Intercalar([5],   [4])   =   [4 ,5]                                   2   pasos

       Intercalar([1,8], [3,6]) = [1,3,6,8]                                  4 pasos
       Intercalar([2,7], [4,5]) = [2,4,5,7]                                  4 pasos

       Intercalar([1,3,6,8], [2,4,5,7]) = [1,2,3,4,5,6,7,8]                  8 pasos



                          Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Ordenamiento y Complejidad




      Hemos realizado:
          ((2 + 2 + 2 + 2) + (4 + 4) + 8) operaciones
          (3 ∗ 8) operaciones
      ¿Pueden generalizar este método de ordenamiento?
      ¿Cuánto es su costo?




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Ordenamiento y Complejidad


      Este algoritmo es bien conocido y se lo conoce como
      MergeSort.
      El costo de este algoritmo es de:

                                    O(n log(n))

      Existen, además, una serie de algoritmos de costo O(n log(n)),
      entre otros el HeapSort o el QuickSort cada uno con
      diferencias de implementación.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos
Búsquedas
                          Complejidad
                         Ordenamiento


Búsquedas




  Ejemplo
      Hacer un seguimiento de papel para los algoritmos de
      ordenamiento que hemos visto.
      Escribir el algoritmo MergeSort.




                     Lic. Ernesto Mislej   Curso de Nivelación de Algoritmos

Curso de Nivelación de Algoritmos - Clase 3

  • 1.
    Búsquedas Complejidad Ordenamiento Curso de Nivelación de Algoritmos Clase 3 Lic. Ernesto Mislej emislej@dc.uba.ar Maestría y Carrera de Especialización en Explotación de Datos y Descubrimiento de Conocimiento 26 de marzo de 2008 Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 2.
    Búsquedas Complejidad Ordenamiento Búsquedas Ejemplo Decir si un número dado se encuentra en una lista de números. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 3.
    Búsquedas Complejidad Ordenamiento Búsquedas Ejemplo Decir si un número dado se encuentra en una lista ordenada de números. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 4.
    Búsquedas Complejidad Ordenamiento Búsquedas Ejemplo ¿Conocen el juego de adivinen un número? El jugador A piensa un número en un rango. El jugador B intenta adivinarlo. El jugador A solo puede responder mayor, menor o si acertó. Después rotan los papeles y gana quién hace menos preguntas. Elegir una estrategia para jugar. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 5.
    Búsquedas Complejidad Ordenamiento Búsquedas Ejemplo Dibujen esa estrategia con el esquema que se sientan cómodos, para el rango 1..15. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 6.
    Búsquedas Complejidad Ordenamiento Búsquedas ¿En cuántos pasos se resuelve? ¿Qué relación tiene con el número 15? Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 7.
    Búsquedas Complejidad Ordenamiento Búsquedas Ejemplo Ahora dibujen esa estrategia para el rango 1..7 ∪ 101..107. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 8.
    Búsquedas Complejidad Ordenamiento Búsquedas Es posible adivinar cualquier número como máximo en: log2(n) de pasos. . . Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 9.
    Búsquedas Complejidad Ordenamiento Búsquedas Esta estructura es bien conocida. Se llama Árbol Binario de Búsqueda. Es un tipo especial de árbol. Permite realizar búsquedas en tiempo logarítmico (de estar balanceado). Su regla de construcción es: los elementos de la rama izquierda son menores a los de la rama derecha. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 10.
    Búsquedas Complejidad Ordenamiento Búsquedas Ejemplo ¿Recuerdan las agendas no-electrónicas? El acceso es en 2 pasos: Primero encuentro la letra inicial. Y después busco de manera secuencial. Dibujen el diagrama de acceso a los registros. Calculen el esfuerzo en encontrar un registro. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 11.
    Búsquedas Complejidad Ordenamiento Búsquedas y Complejidad Podemos decir que realizar una búsqueda en una lista desordenada se realiza en tiempo lineal. Una búsqueda en una lista ordenada se realiza en tiempo logarítmico. Una búsqueda en una lista semi-ordenada, como una agenda se realiza entre esos dos tiempos. Podemos categorizar a los problemas según su esfuerzo de resolución. Esa es la idea de complejidad. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 12.
    Búsquedas Complejidad Ordenamiento Complejidad Ejemplo Piensen otras maneras de medir el esfuerzo de resolución. Calcular la complejidad en función de la cantidad de datos de entrada, para los ejemplos de la primera y segunda clase. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 13.
    Búsquedas Complejidad Ordenamiento Ordenamiento El proceso de clasificación u ordenamiento de una lista de objetos es un proceso fundamental en la computación. Existen variados métodos de ordenamiento cada uno especialmente diseñado para diferentes datos de entrada Ejemplo Piensen algún método de ordenamiento. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 14.
    Búsquedas Complejidad Ordenamiento Ordenamiento # Algoritmo de selección >>> def seleccion (x): a = list (x) #lista nueva a partir de x i = 0 while i < len(a)-2: #selecciona el menor de entre a[i]..a[n] j = i + 1 indicemenor = i clavemenor = a[i] while j < len(a): if a[j] < clavemenor: clavemenor = a[j] indicemenor = j j = j + 1 a[i], a[indicemenor] = a[indicemenor], a[i] #swap! i = i + 1 return a Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 15.
    Búsquedas Complejidad Ordenamiento Ordenamiento >>> # Algoritmo de selección >>> l = [4, 2, 6, 5, 3, 1] >>> k = seleccion(l) [1, 2, 6, 5, 3, 4] [1, 2, 6, 5, 3, 4] [1, 2, 3, 5, 6, 4] [1, 2, 3, 4, 6, 5] [1, 2, 3, 4, 5, 6] Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 16.
    Búsquedas Complejidad Ordenamiento Ordenamiento y Complejidad ¿Cuál es el esfuerzo del algoritmo de ordenamiento por selección? n(n − 1) pasos Decimos O(n2 ) ¿Existirá algún método más eficiente? Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 17.
    Búsquedas Complejidad Ordenamiento Ordenamiento y Complejidad Recuerdan el ejercicio ”Intercalar 2 listas ordenadas para formar otra lista ordenada” ¿Cuánto es el esfuerzo de ese algoritmo? Es un algoritmo de costo lineal. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 18.
    Búsquedas Complejidad Ordenamiento Ordenamiento y Complejidad Reguerdan Las listas de 1 sólo elemento ya están ordenadas, ¿verdad? ¿Cuánto cuesta?: Intercalar 2 listas de 1 elemento. 2 pasos Intercalar 2 listas de 2 elementos. 4 pasos Intercalar 2 listas de 4 elementos. 8 pasos Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 19.
    Búsquedas Complejidad Ordenamiento Ordenamiento y Complejidad Ordenar([8, 1, 6, 3, 7, 2, 5, 4]) = ? Intercalar([8], [1]) = [1, 8] 2 pasos Intercalar([6], [3]) = [3, 6] 2 pasos Intercalar([7], [2]) = [2, 7] 2 pasos Intercalar([5], [4]) = [4 ,5] 2 pasos Intercalar([1,8], [3,6]) = [1,3,6,8] 4 pasos Intercalar([2,7], [4,5]) = [2,4,5,7] 4 pasos Intercalar([1,3,6,8], [2,4,5,7]) = [1,2,3,4,5,6,7,8] 8 pasos Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 20.
    Búsquedas Complejidad Ordenamiento Ordenamiento y Complejidad Hemos realizado: ((2 + 2 + 2 + 2) + (4 + 4) + 8) operaciones (3 ∗ 8) operaciones ¿Pueden generalizar este método de ordenamiento? ¿Cuánto es su costo? Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 21.
    Búsquedas Complejidad Ordenamiento Ordenamiento y Complejidad Este algoritmo es bien conocido y se lo conoce como MergeSort. El costo de este algoritmo es de: O(n log(n)) Existen, además, una serie de algoritmos de costo O(n log(n)), entre otros el HeapSort o el QuickSort cada uno con diferencias de implementación. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos
  • 22.
    Búsquedas Complejidad Ordenamiento Búsquedas Ejemplo Hacer un seguimiento de papel para los algoritmos de ordenamiento que hemos visto. Escribir el algoritmo MergeSort. Lic. Ernesto Mislej Curso de Nivelación de Algoritmos