Adloun

algorithmique (école d'ingénieur) · Chapitre 13 · Application directe du cours

Compter les inversions

Diviser pour régner · niveau 2

Énoncé

Une inversion de est un couple tel que et .

  • Combien a-t-il d'inversions ? Quel est le nombre maximum d'inversions d'un tableau de valeurs ?
  • Compter les inversions en en modifiant le tri par fusion : pendant la fusion de et , quand une valeur de la moitié droite passe devant, combien d'inversions révèle-t-elle ?

Corrigé

  • On compte, pour chaque valeur, les valeurs plus petites situées à sa droite : (), , , , , , , . Total : inversions. Un tableau strictement décroissant a le maximum d'inversions : tous les couples, soit .
  • Les inversions de sont celles de la moitié gauche, celles de la moitié droite, et les couples « à cheval » ( à gauche, à droite, ). Ces dernières ne dépendent pas de l'ordre à l'intérieur des moitiés : on peut les compter pendant la fusion des deux moitiés triées. Quand (à droite) passe devant , c'est que , donc toutes les valeurs restantes de , qui sont , forment une inversion avec : il y en a .

nom : T
valeurs : 1 3 4 7 2 5 6 8
griser : 0
colorier : 4
fleches : 4->1:+3
pointeurs : a=1 k=4 b=4
zone : 1..3 3 inversions
legende : fusion finale : 1 est déjà copié, 2 passe devant T[a:k] = [3, 4, 7]

static long inversions(int[] T, int i, int j, int[] B) { // trie T[i:j]
    if (j - i <= 1) return 0;
    int k = (i + j) / 2;
    long n = inversions(T, i, k, B) + inversions(T, k, j, B);
    int a = i, b = k, c = i;
    while (a < k && b < j) {
        if (T[a] <= T[b]) B[c++] = T[a++];
        else { n += k - a; B[c++] = T[b++]; } // T[b] passe devant T[a:k]
    }
    while (a < k) B[c++] = T[a++];
    while (b < j) B[c++] = T[b++];
    System.arraycopy(B, i, T, i, j - i);
    return n;
}

13.6 : inversions de [4, 7, 1, 3, 8, 2, 6, 5] = 13 (naif 13)
13.6 : 300 tests aleatoires : true

Le comptage ajoute un temps constant par pas de fusion : la complexité est celle du tri par fusion, , contre pour le comptage naïf des couples. Le test « » est essentiel : deux valeurs égales ne forment pas une inversion.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →