Lycée Victor Hugo MPSI 2016-2017 Option informatique Chapitre 4. Diviser pour régner. Retour. I Maximum d'un tableau Écrire une fonction maximum selon la méthode diviser pour régner pour obtenir rapidement le maximum d'un tableau. On utilisera l'astuce de la fenêtre évoquée en cours. Préciser sa complexité. II Racine carré entière. √ 1. Écrire une fonction racine de type int -> int , qui calcule b nc, en testant les entiers dans l'ordre croissant jusqu'à trouver le bon entier. Quelle est sa complexité ? 2. Écrire une nouvelle version racineDiv qui utilise la stratégie diviser pour régner. On donnera une version impérative (avec boucles et références) et une version récursive de la fonction. Quelle est la nouvelle complexité ? III Tri rapide Principe : considérons un tableau [| a0 ; a1 ; · · · ; an−1 |] de n éléments. On eectue une permutation du tableau pour obtenir un nouveau tableau [| b0 ; b1 ; · · · ; bn−1 |] tel que bm = a0 et que ∀i < m, bi 6 bm et ∀i > m, bi > bm . On dit qu'on a utiliser le premier élément comme pivot (d'autres choix sont possibles, comme un choix aléatoire par exemple). Il est clair que si les sous-tableaux [| b0 ; b1 ; · · · ; bm−1 |] et [| bm+1 ; b1 ; · · · ; bn−1 |] sont triés, alors on aura classé le tableau initial. On va donc recommencer le processus sur ces soustableaux... 1. Écrire une fonction pivot de type 'a vect -> int -> int -> int qui eectue, pour un tableau t et deux entiers début et fin , la permutation présentée plus haut sur le soustableau t[début,...,fin] et qui renvoie l'entier m . Ceci peut se faire en temps linéaire (cf. wikipedia). 2. Écrire la fonction tri_rapide de type 'a vect -> unit qui trie un tableau avec cette approche. 3. Estimer la complexité de ce tri dans le pire des cas. 4. On suppose que la fonction pivot divise le tableau en deux sous-tableaux de taille équivalente. Estimer la complexité de ce tri dans ce cas. IV Inversion Étant donnée une suite nie d'entiers x = (x1 , ..., xn ), on appelle inversion de x tout couple (i, j ) tel que i < j et xi > xj . Par exemple, (2, 3, 1, 5, 4) possède 3 inversions : les couples (1, 3), (2, 3), (4, 5). On s'intéresse au calcul du nombre d'inversions de x. 1. Rédiger en Caml l'algorithme naïf, et montrer que son coût est un O(n2 ). On représentera les suites nies d'entiers par le type int vect . 2. Adopter une méthode diviser pour régner pour faire mieux (indication : adapter l'algorithme de tri fusion). 1 Lycée Victor Hugo MPSI 2016-2017 V Option informatique Exponentiation hyper-rapide ? On pourrait imaginer remplacer, dans l'algorithme d'exponentiation rapide, la base 2 par la base 3 et utiliser la fonction suivante : 1 let rec puissance x n = match n with 2 | 0 -> 1 3 | 1 -> x 4 | 2 -> x * x 5 | n when n mod 3 = 0 -> puissance (x * x * x) ( n / 3) 6 | n when n mod 3 = 1 -> x * puissance (x * x * x) ( n / 3) 7 | n -> x * x * puissance ( x * x * x ) (n / 3) ;; Déterminer le coût d'un tel algorithme, et le comparer au coût de l'algorithme binaire. 2