Chapitre 4. Diviser pour régner. Retour. I Maximum d'un tableau

publicité
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
Téléchargement