
4) Nombre d’éléments supérieurs et inférieurs en tableau trié
Données : On considère un tableau trié d’entiers distincts L[1… n], et un entier x.
Exercice : L’algorithme retourne le couple (a, b) où a est le nombre d’entiers inférieurs ou égaux à x, et b
le nombre d’entiers strictement plus grands que x.
Solution :
Ce tableau est trié et on cherche simplement l’indice de l’élément. On fait une recherche par dichotomie pour
trouver l’indice i. L’indice a de l’énoncé est donc égal à la position où on a trouvé l’élément. L’indice b est égal à ce
qu’il reste entre cette position et la fin n du tableau.
En complexité, la recherche par dichotomie coûte O(log n) en temps et O(1) en espace (pas de pile).
Initialisation : LG(L, 1, n, x)
1. g ≤ d ^ L[(g+d)/2] ≥ x → LG(L, g, d, x) = LG(L, (g+d)/2 + 1, d, x)
2. g ≤ d ^ L[(g+d)/2] < x → LG(L, g, d, x) = LG(L, g, (g+d)/2 – 1, x)
3. g > d → LG(L, g, d, x) = (g – 1, n – g + 1)
Cette dichotomie recherche la borne supérieure. A la fin, pour avoir l’indice a on doit donc descendre de 1. Pour
avoir le reste, on fait (n – a) = (n – (g – 1)) = (n – g + 1).
5) Nombres heureux
Données : une liste L d’entiers 1, 2, …, n.
Exercice : A partir de L, chaque second nombre est supprimé pour produire une nouvelle liste L2. On
supprime ensuite chaque 3ème nombre de la liste L2, puis chaque 4ème nombre de la liste résultante, etc.
Les nombres qui restent après ce processus sont appelés les nombres heureux. Trouver ces nombres.
Exemple : LUC({1, 2, 3, 4, 5, 6, 7, 8, 9}) = {1, 3, 7}
En supprimant les seconds il reste {1, 3, 5, 7, 9}.
En supprimant les troisièmes il reste {1, 3, 7, 9}.
En supprimant les quatrièmes il reste {1, 3, 7}. On ne peut pas supprimer de cinquième, fin.
Solution :
On ne voit pas d’autre solution que d’implémenter tel quel l’énoncé de l’exercice est de rendre son résultat.
Initialisation : LUC(L, K) = LUC(L, 2) } K est l’intervalle entre les nombres à supprimer
1. K ≤ |L| → LUC(L, K) = LUC(sup(L, K, 1), K+1) } Soit la liste où on a fait la suppression, on passe à K+1
2. K > |L|→ LUC(L, K) = L } Si on ne peut plus supprimer, on rend la liste résultante
i = k → sup(c.L, K, i) = sup(L, K , 1)
i ≠ k → sup(c.L, K, i) = c.sup(L, K , i+1)
sup(Ø, K, i) = Ø
Complexité en temps de l’algorithme :
Tsup(n) = Tsup(n-1) + O(1) = O(n).
Donc T(n) = T(n-1) + Tsup = T(n-1) + O(n) = O(n²)
Pour l’es
ace,
as besoin de
ile, on est en O
1
.
6) Quantité de parties à r éléments d’un ensemble S
Données : Un large ensemble S = {x1, x2, …, xn} d’objets.
Exercice : On veut connaître le nombre de sous-ensembles de S de cardinalité r, avec r ≤ |S|.
Solution :
C’est de la combinatoire : on cherche le nombre de façon de prendre n éléments parmi r. La réponse est le coefficient binomial Cr|S|.
Pour le calcul, on peut utiliser le fait que Cr|S| = Cr-1|S|-1 + Cr|S|-1, mais c’est assez lent (on peut optimiser en programmation dynamique
mais au prix d’un sacrifice en complexité spatiale). D’autres façons existent (avec un vecteur et le triangle de Pascal). Donnons la 1ère :
Initialisation : NBS(S, r) = combi(|S|, r)
1. p = 0 v p = n → combi(n, p) = 1
2. p ≠ 0 ^ p ≠ n → combi(p, n) = combi(n-1, p-1) + combi(n-1, p)
Philippe Giabbanelli et Julien Rosati - 40 -