
INF4705 Analyse et conception d’algorithmes, Contrôle périodique 3
ii) en déduire l’ordre exact en notation asymptotique ; [1 point]
Solution: Puisque 8=2log28= 21+log24<21+log27, on obtient, avec la formule, T(n)∈
Θ(n1+log27).
iii) comparer les deux résultats en notation asymptotique pour dire lequel vous utiliseriez.
[1 point]
Solution: dans ce cas particulier, le premier résultat devient O(n3log n), ce qui est
meilleur que l’autre (borne sup. asymptotiquement inférieure car 3<1 + log27).
Question 3 : Manipulations de tableaux [6 points]
a) Un tableau dynamique est utile lorsqu’on ne connaît pas à l’avance le nombre d’éléments
qu’on y mettra. Considérez l’implantation suivante :
Un tableau de taille 10 est initialement créé. Lorsqu’on ajoute un n+ 1 ième élément au
tableau de taille net pour éviter un débordement : on crée un nouveau tableau de taille
n+ 10 ; on copie les néléments de l’ancien tableau dans le nouveau ; on ajoute le nouvel
élément ; le nouveau tableau devient notre tableau courant. On passe ainsi d’un tableau de
taille 10 à un autre de taille 20, puis 30, 40, etc. On considère que d’ajouter un élément au
tableau de taille nconsomme une unité de ressource lorsqu’il n’y a pas de débordement et
n+ 1 unités sinon (pour copier les néléments et ajouter le nouveau).
En supposant qu’on démarre avec un tableau vide de taille 10 auquel on ajoute éventuel-
lement néléments, évaluez la consommation amortie d’un ajout d’élément. Détaillez vos
calculs. [2 points]
Solution: Les 10 premiers éléments seront manipulés dn/10efois (ajout initial + co-
pies dues aux débordements) ; les 10 suivants, dn/10e − 1fois ; et ainsi de suite. Au total,
10 Pbn/10c−1
i=0 (dn/10e − i) + nmod 10 = 10 Pbn/10c−1
i=0 dn/10e − 10 Pbn/10c−1
i=0 i+nmod 10 ∼
n2/10 −n2/20 + n/2 + c=n2/20 + n/2 + cDonc une consommation totale dans Θ(n2)pour
néléments, d’où la consommation amortie dans Θ(n).
b) Soit Tun tableau de nentiers. Un élément est dit majoritaire dans Ts’il y apparaît plus
de n
2fois. Donnez un algorithme retournant l’élément majoritaire dans T, s’il existe, et qui
prend un temps et un espace mémoire linéaires en n. [2 points]
Solution: Calculer la médiane des éléments de T en temps linéaire à l’aide de l’algorithme
diviser-pour-régner vu en classe puis compter le nombre d’occurrences de celle-ci dans T.
c) Soit Tun tableau de nentiers distincts et possiblement négatifs, triés en ordre croissant.
Concevez et analysez un algorithme diviser-pour-régner efficace pouvant déterminer
un index i(1 ≤i≤n)tel que T[i] = i, à condition qu’il existe. [2 points]
Solution: Procéder comme pour une fouille dichotomique, en Θ(lg n). Si T[i]> i alors
certainement T[j]> j pour tout j > i, puisque T[j]−T[i]≥j−ipar définition de T. On
peut donc négliger la partie de droite. Idem pour T[i]< i.
Le Professeur: Gilles Pesant (M-3404, tel. 340-4711 ext.4142)