Bonjour a tous,
J'ai prochainement un exam d'algo. Je me suis procuré le sujet de l'an dernier. Mais j'ai un exo sur la stratégie "Diviser Pour Régner" qui me pose un sérieux souci.
Voici l'énoncé:
Donc pour la question a) aucun problème, j'utilise une double boucle du style:Soit une séquence de nombres entiers positifs S=<s1,s2,s3,...,sn> où on suppose que tous les si sont différents 2 à 2. On dit qu'une paire (i,j) est une inversion de S si i<j et que si>sj.
Exemple: La séquence S <2,6,3,1,5> a 5 inversions: (1,4), (2,3), (2,4) ,(2,5) et (3,4).
a) Donnez un algorithme naïf pour déterminer le nombre d'inversions d'une séquence S. Son temps d’exécution est O(n^2)
b)Donnez un algorithme qui utilise la stratégie Diviser Pour Régner pour déterminer le nombre d'inversion d'une séquence S.Temps d’exécution O(n^2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Pour i = 1 à S.length-1{ Pour j = i à S.Length{ ... next j} next i}
Maintenant pour la question b) c'est la que cela se complique.
Donc est-ce que quelqu'un verrait-il une solution réalisable en un temps < à O(n^2)?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 INVERSION (S,i,j){ si(i=j){ retourner vide //pas d'inversion }sinon{ k=(i+j)/2 TabInversion = vide G=INVERSION(S,i,k) D=INVERSION(S,k+1,j) TabInversion = G U D //Je concatène les Inversions des 2 sous-problèmes /*Ici il faut que je gère le cas dit "à cheval" *Mais je ne vois pas du tout comment le faire sans obtenir un temps d'execution en O(n^2) * J'ai tenté de m'inspirer du tri-fusion (O(n log n)) mais cela ne fonctionne pas, vu que j'obtiens 2 sous-ensembles triés, certaines inversions sont annulées */ fsi}
Merci d'avance
Partager