CPGE OUJDA                                                                                                                                                                                                                                                                                             SPE

 

Complexité recherche dichotomique et tour de Hanoi

 

 Recherche par dichotomie dans un tableau trié :

Principe :

on compare l’élément cherché X avec l’élément du milieu de tab . s’il y’a égalité  la recherche est terminée , sinon on poursuit le processus en ne considérant que la moitié inférieure ou la moitié supérieure de tab , selon le résultat de la comparaison.

 

Problème de Hanoï :

Le jeu est constitué d’une plaquette de bois où sont plantées trois tiges numérotées 1,2 et 3. Sur ces tiges sont empilés des disques de diamètres tous différents. Les seules règles du jeu sont que l’on ne peut déplacer qu’un seul disque à la fois, et qu’il est interdit de poser un disque sur un disque plus petit.

Au début, tous les disques sont sur la tige 1 ( celle de gauche), et à la fin ils doivent être sur celle de droite.

 

 

 

 

Solutions

 

def rechercheDichotomique( t, x):
      g = 0

      d = N-1
      while(g <= d):

          m = (g+d)/2
          if(t[m] == x):
              return m;
          elif(t[m] < x):
              d = m-1;
          else:
              g = m+1;
      return -1;
  

Notons que l'on peut écrire cette fonction sous forme récursive :

  // recherche de x dans t[g..d[
  def dichoRec( t, x, g, d) :

      if(g >= d): // l'intervalle est vide
          return -1;
      m = (g+d)/2;
      if(t[m] == x):
          return m;
      elif(t[m] > x):
          return dichoRec(t, x, g, m)
      else:
          return dichoRec(t, x, m+1, d)


  def int rechercheDicho( t, x):
      return dichoRec(t, x, 0, len(t));
  }

 

 

  Algorithme  Hanoi:

Procédure   Hanoi(n, départ, intermédiaire, destination)

            Si n > 0 alors

                        Hanoi(n-1,départ, destination, intermédiaire)

                        Déplacer un disque de départ vers destination

                        Hanoi(n-1,intermédiaire,départ,destination)

            Fin Si

Fin

 

Complexité recherche dichotomique

Le nombre maximal de comparaisons à effectuer pour un tableau de taille n est:

T(n) = 1 + T(n/2).

Pour résoudre cette récurrence, on écrit n = 2t, ce qui conduit à

T(2t) = T(2t-1)+1 = = T(1)+t

d'où un coût en O(t) = O(logn).

 

 

Complexité Tour de Hanoi:

L'évaluation de la complexité de cet algorithme est assez simple. Nous allons chercher à savoir combien de déplacements de disques sont nécessaires pour arriver à nos fins. Très simplement, la fonction calculant ceci peut être définie de la manière suivante  : f(1) = 1; f(n) = 2*f(n-1)+1. On peut démontrer par récurrence que ceci est égal à f(n) = 2^n-1 : On a f(n+1) = 2*f(n)+1. En supposant que f(n) = 2^n-1, on a f(n+1) = 2*(2^n-1)+1. On développe ensuite en f(n+1) = 2*2^n-2+1 ce qui nous donne au final f(n+1) = 2^(n+1)-1. On a ainsi démontré que si c'est vrai pour n, alors c'est vrai pour (n+1). Comme on a f(1) = 2*0+1 = 2^1-1 = 1, c'est vrai pour tous les n supérieurs à 1 et 1. La complexité exacte de l'algorithme présenté ci-dessus est donc en 2^n-1 pour n disques à déplacer de la tour A vers la tour C. Avec la notation de Landau, on dit qu'il s'agit là d'une complexité exponentielle, c'est à dire en O(2^n).