Null 1
Null 1
Exercices 2.1
1. Pour chacun des algorithmes suivants, indiquez (i) une métrique de taille naturelle pour
ses entrées, (ii) son fonctionnement de base, et (iii) si le fonctionnement de base
count peut être différent pour des entrées de même taille :
b. informatique m!
e. crible d'Eratosthène
F. algorithme stylo et crayon pour multiplier deux nombres entiers décimaux à n chiffres
2. a. Considérez l'algorithme basé sur la définition pour ajouter deux matrices n×n.
Quel est son fonctionnement de base ? Combien de fois est-il exécuté en fonction
de l'ordre matriciel n? En fonction du nombre total d'éléments dans
les matrices d'entrée ?
b. Répondez aux mêmes questions pour l'algorithme basé sur la définition pour la matrice
multiplication.
3. Considérez une variante de la recherche séquentielle qui parcourt une liste pour renvoyer le
nombre d'occurrences d'une clé de recherche donnée dans la liste. Est-ce que son efficacité
diffèrent de l'efficacité de la recherche séquentielle classique ?
1
Page 2
5. a.> Démontrer la formule (2.1) pour le nombre de bits dans la représentation binaire
d'un entier positif.
b = dlog 2 (n + 1)e.
ré. Expliquez pourquoi, dans le cadre d'analyse accepté, cela n'a pas d'importance
ter si nous utilisons des chiffres binaires ou décimaux pour mesurer la taille de n.
6. Suggérez comment n'importe quel algorithme de tri peut être augmenté de manière à
le nombre dans le meilleur des cas de ses comparaisons clés égal à juste n−1 (n est la valeur d'une liste
taille, bien sûr). Pensez-vous que ce serait un ajout intéressant à tout
algorithme de tri ?
une. Combien de temps devriez-vous vous attendre à ce que l'élimination gaussienne fonctionne
sur un système de 1000 équations versus un système de 500 équations ?
Page 3
une. n(n + 1) et 2000n 2 b. 100n 2 et 0,01n 3
e. 2 nL1 et 2 n F. (n − 1) ! et n!
10. Invention des échecs a. Selon une légende bien connue, le jeu de
les échecs ont été inventés il y a plusieurs siècles dans le nord-ouest de l'Inde par un certain
sauge. Quand il a apporté son invention à son roi, le roi a tellement aimé le jeu
beaucoup qu'il a offert à l'inventeur toute récompense qu'il voulait. L'inventeur
demandé qu'on obtienne du grain comme suit : juste un seul grain de blé
devait être placé sur la première case de l'échiquier, deux sur la seconde,
quatre le troisième, huit le quatrième, et ainsi de suite, jusqu'à ce que les 64 cases aient
été rempli. S'il ne fallait qu'une seconde pour compter chaque grain, combien de temps faudrait-il
faut-il compter tout le grain qui lui est dû ?
Page 4
2. a. La somme de deux matrices est définie comme la matrice dont les éléments sont
les sommes des éléments correspondants des matrices données.
4. a. Les gants ne sont pas des chaussettes : ils peuvent être droitiers et gauchers.
5. a. Tout d'abord, prouvez d'abord que si un entier décimal positif n a b chiffres dans son
représentation binaire, alors
2 bL1 n < 2 b .
9. Si nécessaire, simplifiez les fonctions en question pour distinguer les termes définissant
leurs ordres de croissance à un multiple constant près. (Nous discuterons
méthodes formelles pour répondre à ces questions dans la section suivante; pourtant,
ces questions peuvent être répondues sans connaissance de ces méthodes.)
m
10. a. Utilisez la formule P
i=0 2 i = 2 n+1 − 1.
Page 5
ré. (i) soit l'amplitude du plus grand de deux nombres d'entrée, soit le
l'amplitude du plus petit des deux nombres d'entrée, ou la somme des
études de deux nombres d'entrée ; (ii) division modulo; (iii) oui
e. (i) la grandeur de n, c'est-à-dire le nombre de bits dans sa représentation binaire
tation; (ii) élimination d'un numéro de la liste des candidats restants
être premier; (iii) non
2. a. Addition de deux nombres. Il est exécuté n 2 fois (une fois pour chacun des
n 2 éléments dans la matrice en cours de calcul). .Comme le nombre total de
éléments dans deux matrices données est N = 2n 2 , le nombre total d'additions
peut également être exprimé comme n 2 = N/2.
b. Puisque sur la plupart des ordinateurs la multiplication prend plus de temps que l'addition,
la multiplication est un meilleur choix pour être considérée comme l'opération de base
de l'algorithme standard de multiplication matricielle. Chacun des n 2 éléments
du produit de deux matrices n par n est calculé comme le scalaire (point)
produit de deux vecteurs de taille n, ce qui nécessite n multiplications. le
le nombre total de multiplications est n · n 2 = n 3 = (N/2) 3/2 .
3. Cet algorithme fera toujours n comparaisons clés sur chaque entrée de taille
n, alors que ce nombre peut varier entre n et 1 pour la version classique
de recherche séquentielle.
4. a. Le nombre dans le meilleur des cas est, évidemment, deux. Le nombre le plus défavorable est
douze : un de plus que le nombre de gants d'une seule main.
b. Il n'y a que deux issues possibles ici : les deux chaussettes manquantes
faire une paire (le meilleur des cas) et les deux stocks manquants ne font pas un
paire (le pire des cas). Le nombre total de résultats différents (les moyens
Page 6
5. a. Le plus petit entier positif qui a b chiffres binaires dans son binaire
l'expansion est |{z}
de 10...0
, qui est 2 bL1 ; le plus grand entier positif qui a b
bL1
2 b − 1. Ainsi,
2 bL1 n < 2 b .
D'où
log 2 2 bL1 log 2 n < log 2 2 b
ou
b − 1 log 2 n < b.
Ces inégalités impliquent que b − 1 est le plus grand entier ne dépassant pas
log 2 n. En d'autres termes, en utilisant la définition de la fonction de plancher, nous con-
comprendre que
b − 1 = blog 2 nc ou b = blog 2 nc + 1.
b. Si n > 0 a b bits dans sa représentation binaire, alors, comme indiqué dans
partie a,
2 bL1 n < 2 b .
D'où
2 bL1 < n + 1 ≤ 2 b
et donc
log 2 2 bL1 < log 2 (n + 1) ≤ log 2 2 b
ou
b − 1 < log 2 (n + 1) b.
Ces inégalités impliquent que b est le plus petit entier non inférieur à
log 2 (n + 1). En d'autres termes, en utilisant la définition de la fonction plafond,
nous concluons que
b = dlog 2 (n + 1)e.
Page 7
blog 10 nc + 1. C'est-à-dire que les deux mesures de taille sont à peu près égales à
multiple constant pour les grandes valeurs de n.
1
T (2n) c
(2n)
7. a. 3
1
3
= 8, où c m est le temps d'une multiplication.
T (n) ≈ c
3 n3
b. On peut estimer le temps d'exécution pour résoudre des systèmes d'ordre n sur
l'ancien calculateur et celui d'ordre N sur le nouveau calculateur comme T oid (n) ≈
1 1
c m 3 n 3 et T nouveau (N) ≈ 10 L3 c m 3 N 3 , respectivement, où c m est le temps de
une multiplication sur l'ancien ordinateur. Remplacement du T oid (n) et du T nouveau (N)
1
par ces estimations dans l'équation T oid (n) = T nouveau (N) donne c m 3n 3 ≈
1
10 L3 c m 3 N 3 ou N
n 10.
b. n = 2.
c. 4nm = 4.
(4n) 2
ré. n2 =42.
(4n) 3
e. n3 =43.
F. 2 2
4 = 2 3n = (2 n ) 3 .
c. Puisque changer la base d'un logarithme peut être fait par la formule
toutes les fonctions logarithmiques ont le même ordre de croissance à une con-
multiple permanent.
sept
Page 8
ré. journal 2
2 n = log 2 nlog 2 n et log 2 n 2 = 2 log n. D'où log 2 2 n a une valeur supérieure
ordre de croissance que log 2 n 2 .
X64 X63
2 iL1 = 2 j = 2 64 − 1 1,8 · 10 19 .
i=1 j=0
(C'est plusieurs fois plus que ce que l'on peut obtenir en plantant avec du grain tout le
surface de la planète Terre.) S'il ne fallait qu'une seconde pour compter chaque grain,
le temps total nécessaire pour compter tous ces grains est d'environ
585 milliards d'années, plus de 100 fois plus que l'âge estimé de notre planète.
1+3+ ... + (2 · 64 − 1) = 64 2 .
Page 9
Exercices 2.2
1. Utilisez la notation la plus appropriée parmi O, θ et pour indiquer le
classe d'efficacité temporelle de la recherche séquentielle (voir Section 2.1)
e. blog 2 nc
4. a. Le tableau 2.1 contient les valeurs de plusieurs fonctions qui surviennent souvent dans l'analyse
d'algorithmes. Ces valeurs suggèrent certainement que les fonctions
log n, n, nlog n, n 2 , n 3 , 2 n , n !
sont classés par ordre croissant de leur ordre de croissance. Est-ce que ces valeurs
prouver ce fait avec une certitude mathématique ?
b. Montrer que les fonctions sont bien classées par ordre croissant de leur
ordre de croissance.
b. Montrer que les fonctions exponentielles a n ont des ordres de croissance différents
pour différentes valeurs de base a > 0.
9
Page 10
7. Prouver (en utilisant les définitions des notations impliquées) ou réfuter (en
donnant un contre-exemple spécifique) les affirmations suivantes.
d.> Pour deux fonctions non négatives t(n) et g(n) définies sur l'ensemble des
entiers non négatifs, soit t(n) O(g(n)), soit t(n) ∈ Ω(g(n)), ou les deux.
une. notation.
b. notation.
9. Nous avons mentionné dans cette section que l'on peut vérifier si tous les éléments d'un
array sont distincts par un algorithme en deux parties basé sur le tri préalable du tableau.
10. L'étendue d'un ensemble fini non vide de n nombres réels S est définie comme
différence entre le plus grand et le plus petit élément de S. Pour chaque représentation
sation de S donnée ci-dessous, décrivez en anglais un algorithme pour calculer
la gamme. Indiquer les classes d'efficacité temporelle de ces algorithmes en utilisant
la notation la plus appropriée (O, θ ou Ω).
b. Un tableau trié
11. Plus léger ou plus lourd ? Vous avez n > 2 pièces d'apparence identique et un
balance panoramique sans poids. L'une des pièces est un faux, mais vous le faites
sait pas si elle est plus légère ou plus lourde que les pièces authentiques, que toutes
peser le même. Concevoir un algorithme θ(1) pour déterminer si le faux
pièce est plus légère ou plus lourde que les autres.
dix
Page 11
12. > Porte dans un mur Vous êtes face à un mur qui s'étend à l'infini dans les deux
directions. Il y a une porte dans le mur, mais tu ne sais ni jusqu'où
loin ni dans quelle direction. Vous ne pouvez voir la porte que lorsque vous êtes
juste à côté. Concevoir un algorithme qui vous permet d'atteindre la porte
en marchant au plus O(n) pas où n est le nombre (inconnu de vous)
d'étapes entre votre position initiale et la porte. [Par95]
11
Page 12
3. Simplifier les fonctions données pour singulariser les termes définissant leurs ordres
de croissance.
5. Simplifiez d'abord certaines des fonctions. Ensuite, utilisez la liste des fonctions
dans le tableau 2.2 pour « ancrer » chacune des fonctions données. Prouvez leur finale
placement en calculant des limites appropriées.
6. a. Vous pouvez prouver cette affirmation soit en calculant une limite appropriée
ou en appliquant l'induction mathématique.
b. Limite de calcul un n
n→o 1 /un2 n
.
8. La preuve de la partie (a) est similaire à celle donnée pour l'assertion du théorème
dans la section 2.2. Bien sûr, différentes inégalités doivent être utilisées pour borner
la somme d'en bas.
9. Suivez le plan d'analyse utilisé dans le texte lorsque l'algorithme a été men-
tionné pour la première fois.
10. Vous pouvez utiliser des algorithmes simples pour les quatre questions posées.
Utilisez la notation O pour la classe d'efficacité temporelle de l'un d'eux, et le θ
notation pour les trois autres.
12. Vous devez marcher par intermittence à gauche et à droite à partir de votre position initiale
jusqu'à ce que la porte soit atteinte.
12
Page 13
c. n(n + 1)/2 (n 3 ) est faux. ré. n(n + 1)/2 (n) est vrai.
Donc (n 2 + 1) 10 θ(n 20 ).
Remarque : Une preuve alternative peut être basée sur la formule binomiale et
l'assertion de l'exercice 6a.
10n 2 = √10n ∈ θ(n). Officiellement,
b. Informellement, √10n 2 + 7n + 3 ≈
√10n 2 +7n+3
blog 2 nc ≤ log 2 n
13
Page 14
m 1
limite
n→o
n log 2 n = limite
n→o
log 2 n = 0.
n log 2 n log 2 n
limite
n→o
n2 = limite
n→o
m = (voir la première limite de cet exercice) = 0.
n2 1
limite m = 0.
n→o n3 = limite
n→o
n3 (n 3 ) 0 3n 2 n2 (n 2 ) 0
limite (2 ) 0 = limite 2 ln 2 = 3 en 2 n→o
limite limite
en 2 n→o (2 )0
n→o 2 = limn→o n→o 2 =3
2n m (n) 0
= 3 en 2 limite
2 ln 2 = 6 en 2 n→o limite limite
n→o
2
= 6 en
2
2 2 n→o (2 )0
1 1
= 6 en limite 2 ln 2 = 6 dans limite
2 = 0.
2 2 n→o 3 2n→o
2
limite
n→o
n! = (voir l'exemple 3 dans la section) 0.
5. (n−2) ! ∈ θ((n−2)!), 5 lg(n+100) 10 = 50 lg(n+100) ∈ θ(log n), 2 2n =
dans
3
(2 2 ) n θ(4 n ), 0,001n 4 + 3n 3 + 1 θ(n 4 ), ln 2 n ∈ θ(log 2 n),
1
??
(n ), 3 n θ(3 n ). La liste de ces fonctions classées par ordre croissant
3
p(n) a n +a ^1 n ^1 +...+a 0 un ^1
6. a. limite n =n→o
limite n = limite (un k + m + ... + un 0
n→o n→o n )
= un k > 0.
D'où p(n) (n k ).
b.
0 si un 1 < un 2 un n
un
1 n 1 ∈ o(un2n)
limite = limite = 1 si un 1 = un 2 un n
n→o
un
2 n n→o µa 1 un 2 ¶ n ??
1∈ θ(un n2 )
si a 1 > a 2 un n
2 ∈ o(un 1n)
14
Page 15
implique
1
(
c)t(n) g(n) pour tout n n 0 .
b. L'assertion selon laquelle θ(ag(n)) = θ(g(n)) devrait être vraie car ag(n)
et g(n) ne diffèrent que par un multiple constant positif et, par conséquent, par le
définition de , doit avoir le même ordre de croissance. La preuve formelle
doit montrer que θ(ag(n)) ⊆ θ(g(n)) et θ(g(n)) ⊆ θ(ag(n)). Laisser
f(n) ∈ θ(ag(n)); nous allons montrer que f(n) θ(g(n)). En effet,
Soit maintenant f(n) θ(g(n)); nous allons montrer que f(n) ∈ θ(ag(n)) pour a > 0.
En effet, si f(n) θ(g(n)),
et donc
c c
f(n) une
ag(n) = c 1 ag(n) pour tout n ≥ n 0 (où c 1 = une
> 0),
c'est-à-dire f(n) θ(ag(n)).
15
Page 16
8. a. Nous devons prouver que si t 1 (n) Ω(g 1 (n)) et t 2 (n) ∈ Ω(g 2 (n)), alors
t 1 (n) + t 2 (n) Ω(max{g 1 (n), g 2 (n)}).
9. a. Étant donné que le temps d'exécution de la partie de tri de l'algorithme sera toujours
dominer le temps de course du second, c'est le premier qui va dissuader
exploiter l'efficacité du temps de l'ensemble de l'algorithme. Formellement, il résulte de
égalité
(nlog n) + O(n) = θ(nlog n),
dont la validité est facile à prouver de la même manière que celle de la section
théorème.
b. Étant
la classedonné que la
d'efficacité deuxième
spatiale serapartie de l'algorithme
déterminée par celle n'utilisera pas d'espace
de la première supplémentaire,
partie (de tri). le
Ce sera donc (n).
10. a. Scannez le tableau pour trouver les valeurs maximales et minimales parmi ses
éléments, puis calculez la différence entre eux. L'algorithme
l'efficacité du temps est θ(n). Remarque : bien que l'on puisse trouver à la fois le maximum
et valeurs minimales dans un tableau à n éléments avec environ 1,5n comparaisons
16
Page 17
(voir les solutions au problème 5 dans les exercices en 2.3 et au problème 2 dans Ex-
ercises 5.1), cela ne change pas la classe d'efficacité linéaire, bien sûr.
c. Le plus petit élément est dans le premier nœud de la liste et donc son
les valeurs peuvent être obtenues en temps constant. L'élément le plus important se trouve dans le
dernier nœud accessible uniquement par le parcours de toute la liste, ce qui nécessite
temps linéaire. Calculer la différence entre les deux valeurs nécessite
temps constant. Par conséquent, la classe d'efficacité temporelle est θ(n).
ré. Le plus petit (le plus grand) élément d'un arbre de recherche binaire se trouve à gauche
nœud le plus (le plus à droite). Pour l'atteindre, il faut commencer par la racine et
suivre la chaîne de pointeurs gauche-enfant (droit-enfant) jusqu'à ce qu'un nœud avec le
le pointeur null enfant gauche (enfant droit) est atteint. Selon la structure
de l'arbre, cette chaîne de nœuds peut avoir une longueur comprise entre 1 et n nœuds. D'où,
le temps d'atteindre son dernier nœud sera en O(n). Le temps d'exécution du
tout l'algorithme sera également linéaire : O(n) + O(n) + (1) = O(n).
11. Le puzzle peut être résolu en deux pesées comme suit. Commencez par prendre
de côté une pièce si n est impair et deux pièces si n est pair. Après cela, divisez le
nombre pair de pièces restantes en deux groupes de taille égale et les mettre
sur les plateaux opposés de la balance. S'ils pèsent le même poids, toutes ces pièces
sont authentiques et la fausse pièce fait partie des pièces mises de côté. Afin que nous puissions
peser le groupe mis de côté d'une ou deux pièces contre le même nombre de
pièces authentiques : si la première pèse moins, la fausse pièce est plus légère, sinon,
c'est plus lourd. Si la première pesée n'aboutit pas à une balance, prenez le
groupe plus léger et, si le nombre de pièces qu'il contient est impair, ajoutez-y l'une des
pièces initialement mises de côté (qui doivent être authentiques). Divisez toutes ces pièces
en deux groupes de taille égale et les peser. S'ils pèsent le même poids, tous
ces pièces sont authentiques et donc la fausse pièce est plus lourde ; autrement,
ils contiennent le faux, qui est plus léger.
Remarque : le puzzle fournit un exemple très rare d'un problème qui peut
être résolu en le même nombre d'opérations de base (à savoir, deux pesées)
quelle que soit la taille de l'instance du problème (ici, le nombre de pièces)
est. Bien sûr, si nous avions envisagé de mettre une pièce sur la balance comme
l'opération de base de l'algorithme, l'efficacité de l'algorithme aurait été en
(n) au lieu de θ(1).
12. L'idée clé ici est de marcher par intermittence à droite et à gauche à chaque fois
exponentiellement plus loin de la position initiale. Une mise en œuvre simple
de cette idée est de faire ce qui suit jusqu'à ce que la porte soit atteinte : Pour i = 0,1,...,
faire 2 i pas vers la droite, revenir à la position initiale, faire 2 i pas pour
la gauche et revenez à la position initiale. Soit 2 kL1 < n 2 k . le
17
Page 18
le nombre d'étapes dont cet algorithme aura besoin pour trouver la porte peut être estimé
ci-dessus comme suit :
kL1
X
4 · 2 i + 3 · 2 k = 4(2 k − 1) + 3 · 2 k < 7 · 2 k = 14 · 2 kL1 < 14n.
i=0
18
Page 19
Exercices 2.3
1. Calculez les sommes suivantes.
i=1 x 2 je − (P i=1 x i ) 2 /n .
n−1
Trouvez et comparez le nombre de divisions, de multiplications et d'additions.
tions/soustractions (les additions et les soustractions sont généralement regroupées en
ensemble) qui sont nécessaires pour calculer la variance selon chacun des
ces formules.
Algorithme Mystère(n)
//Entrée : Un entier non négatif n
S0
pour i 1 à n faire
SS+ii
Retour
19
Page 20
ré. Quelle est la classe d'efficacité de cet algorithme ?
9. Démontrer la formule
Xm n(n+1)
i =1+2+ ··· + n =
i=1
2
20
Page 21
10. Calcul mental Une table 10×10 est remplie de nombres répétés sur sa
diagonales comme indiqué ci-dessous. Calculer la somme totale des nombres du tableau
dans ta tête. (après [Cra07, Question 1.33])
12 3 9 dix
2 3 9 dix 11
3 9 dix 11
9 dix 11
9 dix 11
9 dix 11
9 dix 11
9 dix 11 17
9 dix 11 17 18
dix 11 17 18 19
11. Considérons la version suivante d'un algorithme important que nous allons
étudier plus tard dans le livre.
21
Page 22
13. Numérotation des pages Trouvez le nombre total de chiffres décimaux nécessaires pour
bering pages dans un livre de 1000 pages. Supposons que les pages sont num-
béré consécutivement en commençant par 1.
22
Page 23
4. a. Traçage de l'algorithme pour obtenir sa sortie pour quelques petites valeurs de n (par exemple,
n = 1, 2 et 3) devrait vous aider si vous en avez besoin.
b. Nous avons été confrontés à la même question pour les exemples abordés dans le texte.
L'un d'eux est particulièrement pertinent ici.
b. Nous avons été confrontés à la même question pour les exemples discutés dans la section
tion. L'un d'eux est particulièrement pertinent ici.
23
Page 24
7. Le calcul d'une somme de n nombres peut être fait avec n − 1 additions. Comment
l'algorithme en fait beaucoup dans le calcul de chaque élément du produit
matrice?
8. Mettre en place une somme pour le nombre de fois toutes les portes et basculées et trouver
son ordre de croissance asymptotique en utilisant certaines propriétés de l'annexe
UNE.
10. Il existe au moins deux manières différentes de résoudre ce problème, qui vient
à partir d'une série de questions d'entretien à Wall Street.
11. a. L'établissement d'une somme ne devrait pas poser de difficultés. En utilisant la somme standard
les formules et les règles de mation demanderont plus d'efforts que dans le précédent
exemples, cependant.
12. Établir une somme pour le nombre de carrés après n itérations de l'algorithme
puis simplifiez-le pour obtenir une réponse fermée.
13. Pour dériver une formule exprimant le nombre total de chiffres en fonction de
le nombre de pages n, où 1 n ≤ 1000, il est pratique de partitionner
le domaine de la fonction en plusieurs intervalles naturels.
24
25
P 500
250 000.
Soit en utilisant la formule de la somme de la progression arithmétique avec
(a + a ) n (1+999)500 1
un 1 = 1, un n = 999 et n = 500 : 2 = 2 = 250 000.)
Pdix Pdix
b. 2+4+8+16+...+1 024 = 2 je = 2 i −1 = (2 11 −1)−1=2 046.
i=1 i=0
P
n+1
c.
1=(n + 1) − 3+1= n − 1.
i=3
P
n+1
P
n+1
P2 (n+1)(n+2)
ré. je = je = 2 − 3 = n +3nL42 . 2
i=3 i=0
i=0 i −
P
nL1
P
nL1
P
nL1
P
nL1
(n 2 L1)n
= 3 .
Pm Pm Pm
F. 3 j+1 = 3 3j=3[ 3 j − 1] = 3[ 3 +1 L1
3L1 − 1] = 3 +2 L9 2 .
j=1 j=1 j=0
Pm
Pm Pm
Pm Pm n(n+1) n(n+1) Pm n(n+1) n(n+1)
g. ij = je j= je 2 = 2 je = 2 2
i=1 j=1 i=1 j=1 i=1 i=1
n 2 (n+1) 2
= 4 .
m m
h. P i+1 )
i=1 1/i(i + 1) = P i=1 ( 1 je − 1
=(1 2 )+( 1 3 ) + ... + ( 1 m )+( 1 n+1 = n n+1 .
1-1 2−1 nL1 − 1 n − 1 n+1 )=1 − 1
(Il s'agit d'un cas particulier de la série dite télescopique - voir Annexe
vous
A–P ) = un u − un iL1.)
i=i (a i − a iL1
P
nL1
P
nL1
P
nL1
P
nL1
P
nL1
2. a. (je 2 + 1) 2 = (i 4 + 2i 2 + 1) = je 4 + 2 je 2 + 1
i=0 i=0 i=0 i=0 i=0
nL1
P P
nL1
P
nL1
P
nL1 nL1
P Pm
b. i=2 log 2 je 2 = i=2 2 log 2 i = 2 i=2 log 2 i = 2 i=1
log 2 i − 2 log 2 n
∈ 2θ(nlog n) − θ(log n) = θ(nlog n).
25
Page 26
Pm Pm Pm Pm P
nL1
Pm
Pm
P
nL1
P
iL1
P
nL1 iL1
P P
iL1
P
nL1
P
nL1
=32 je 2 − 21
i=0
i=0 i ∈ θ(n 3 ) − θ(n 2 ) = θ(n 3 ).
Pm
4. a. Calcule S(n) = je 2 .
i=1
Pm
c. C(n) = 1 = n.
i=1
Pm n(n+1)(2n+1)
e. Utilisez la formule je 2 = 6 pour calculer la somme dans θ(1)
i=1
temps (qui suppose que le temps des opérations arithmétiques reste constant
quelle que soit la taille des opérandes des opérations).
P
nL1
c. C(n) =
i=1 2 = 2(n − 1).
ré. (n).
e. Une amélioration évidente pour certaines entrées (mais pas pour le pire des cas)
consiste à remplacer les deux instructions if par la suivante :
26
27
P
nL2
P
nL1
P
nL2
c. C pire (n) = 1=
i=0 j=i+1
i=0 [(n − 1) − (i + 1) + 1)
P
nL2
(nL1)n
= 2 .
i=0 (n − 1 − i)=(n − 1) + (n − 2) + ... +1=
ré. Quadratique : C pire (n) ∈ θ(n 2 ) (ou C(n) ∈ O(n 2 )).
8. Soit T(n) le nombre total de fois où toutes les portes sont basculées. le
l'énoncé du problème implique que
Xm
T(n) = bn/ic.
i=1
m
Puisque x − 1 < bxc x et P
i=1 1/i lnn + 7, où 7 = 0,5772...( voir
27
Page 28
Annexe A),
Xm Xm
T(n) n/je = n 1/i n(lnn + 7) ∈ θ(nlog n).
i=1 i=1
De la même manière,
Xm Xm Xm
T(n) > (n/i − 1) = n 1/i − 1 ≈ n(lnn + 7) − n ∈ θ(nlog n).
i=1 i=1 i=1
Remarque : Alternativement, nous pourrions utiliser la formule pour approximer les sommes
par des intégrales définies (voir Annexe A) :
m m
X X m
1
T(n) n/i = n(1+
i=1 1 xdx) = n(1+lnn) ∈ θ(nlog n)
i=2 1/i) n(1+Z
et
m m m
X X X n+1
1
T(n) > (n/i−1) = n 1/je−
i=1 i=1
1 xdx−n= nln(n+1)−n θ(nlog n).
i=1 1 nZ
Pm n(n+1)
9. Voici une preuve par induction mathématique que je = 2 pour chaque
i=1
entier positif n.
Pm P1 ??
n(n+1) ?? 1(1+1)
(i) Pas de base : Pour n = 1, je = je = 1 et 2 ¯ n=1 = 2 = 1.
i=1 i=1
Pm n(n+1)
(ii) Étape inductive : supposons que je = 2 pour un entier positif n.
i=1
P
n+1
(n+1)(n+2)
Il faut montrer qu'alors je = 2 . Ceci est obtenu comme suit :
i=1
P
n+1
Pm
n(n+1) n(n+1)+2(n+1) (n+1)(n+2)
je = i + (n + 1) = 2 + (n + 1) = 2 = 2 .
i=1 i=1
en remarquant qu'il peut être calculé comme la somme de 50 paires, chacune avec le
somme 101 :
1 + 100 = 2 + 99 = ... = 50 + 51 = 101.
Par conséquent, la somme totale est égale à 50·101 = 5 050. (Le célèbre historique
l'anecdote prétend que son professeur a donné cette tâche à une classe pour garder
28
Page 29
obtenir
n(n+1)
2S(n)=(n + 1)n et donc S(n) = .
2
10. Le but ici est de calculer (dans sa tête) la somme des nombres dans
Le tableau ci-dessous:
12 3 9 dix
2 3 9 dix 11
3 9 dix 11
9 dix 11
9 dix 11
9 dix 11
9 dix 11
9 dix 11 17
9 dix 11 17 18
dix 11 17 18 19
La première méthode est basée sur l'observation que la somme de deux nombres
bres dans les carrés symétriques par rapport à la diagonale reliant les
les coins inférieur gauche et supérieur droit sont égaux à 20 : 1+19, 2+18, 2+18 et
bientôt. Donc, puisqu'il y a (10·10-10)/2 = 45 de telles paires (nous avons soustrait
le nombre de carrés sur cette diagonale du nombre total de
carrés), la somme des nombres en dehors de cette diagonale est égale à 20,45
= 900. Avec 10·10 = 100 sur la diagonale, la somme totale est égale à 900
+ 100 = 1000.
La deuxième méthode calcule la somme ligne par ligne (ou colonne par colonne).
La somme de la première ligne est égale à 10·11/2 = 55 selon la formule
(S2). La somme des nombres de la deuxième rangée est 55 + 10 puisque chacun des
nombres est plus grand de 1 que leurs homologues de la rangée ci-dessus. le
il en est de même pour toutes les autres lignes. Donc la somme totale est égale
à 55 + (55+10) + (55+20) + ...+ (55+90) = 55·10 + (10+20+...+90) =
29
30
Notez que la première méthode utilise la même astuce Carl Gauss vraisemblablement
utilisé pour trouver la somme des cent premiers entiers (problème 9 dans les exercices
2.3). Nous avons également utilisé cette formule (deux fois, en fait) dans la deuxième solution pour
le problème.
1
=n(n − 1)(2n + 5) ?? n 3 θ(n 3 ).
6 3
12. La réponse peut être obtenue par une évaluation directe de la somme
m
X
2 (2i − 1) + (2n +1)=2n 2 + 2n + 1.
i=1
30
31
(On peut également obtenir la réponse fermée en notant que les cellules sur l'al-
diagonales ternantes du voisinage de von Neumann de rang n composent
deux carrés de tailles n + 1 et n, respectivement.)
13. Soit D(n) le nombre total de chiffres décimaux dans le premier n positif
entiers (pages de livre). Les neuf premiers nombres sont à un chiffre, donc
D(n) = n pour 1 n ≤ 9. Les 90 prochains nombres de 10 à 99 inclus sont
à deux chiffres. D'où
La valeur maximale de D(n) pour cette plage est D(99) = 189. De plus, il
sont 900 décimales à trois chiffres, ce qui conduit à la formule
La valeur maximale de D(n) pour cette plage est D(999) = 2889. En additionnant quatre
chiffres pour la page 1000, on obtient D(1000) = 2893.
31
Page 32
Exercices 2.4
1. Résolvez les relations de récurrence suivantes.
2. Établir et résoudre une relation de récurrence pour le nombre d'appels passés par
F(n), l'algorithme récursif pour le calcul de n!.
Algorithme S(n)
//Entrée : Un entier positif n
//Sortie : La somme des n premiers cubes
si n = 1 renvoie 1
sinon renvoie S(n − 1) + n ∗ n ∗ n
une. Établir et résoudre une relation de récurrence pour le nombre de fois que le
l'opération de base de l'algorithme est exécutée.
Algorithme Q(n)
//Entrée : Un entier positif n
si n = 1 renvoie 1
sinon renvoie Q(n − 1) + 2 ∗ n − 1
une. Mettre en place une relation de récurrence pour les valeurs de cette fonction et la résoudre
pour déterminer ce que cet algorithme calcule.
32
Page 33
b. Combien de coups sont effectués par le ième plus grand disque (1 ≤ i ≤ n) dans
cet algorithme ?
7. > une. Montrer que le nombre exact d'additions faites par la récursive
algorithme BinRec(n) pour un entier positif arbitraire n est blog 2 nc.
33
Page 34
10. Considérez l'algorithme suivant pour vérifier si un graphe défini par son
la matrice de contiguïté est terminée.
//Entrée : Matrice d'adjacence A[0..n − 1,0..n − 1]) d'un graphe non orienté G
avec n 1 sommets
//Sortie : 1 (vrai) si G est complet et 0 (faux) sinon
si n = 1 renvoie 1 //le graphe à un sommet est complet par définition
autre
sinon GraphComplete(A[0..n − 2,0..n − 2]) renvoie 0
sinon pour j 0 à n − 2 do
si A[n − 1,j]=0 renvoie 0
retour 1
noté detA, peut être défini comme un 00 pour n = 1 et, pour n > 1, par le
formule récursive
nL1
X
detA = s j a 0 j detA j ,
j=0
a.> Mettre en place une relation de récurrence pour le nombre de multiplications effectuées
par l'algorithme implémentant cette définition récursive.
34
Page 35
13. Faire frire des hamburgers Il y a n hamburgers à faire frire sur un petit grill
qui ne peut contenir que deux hamburgers à la fois. Chaque hamburger doit être
frit des deux côtés; faire frire un côté d'un hamburger prend une minute, re-
indépendamment du fait qu'un ou deux hamburgers soient frits en même temps.
Considérez l'algorithme récursif suivant pour exécuter cette tâche. Si
n ≤ 2, faire revenir le hamburger (ou les deux hamburgers ensemble si n = 2)
de chaque côté. Si n > 2, faites frire deux hamburgers ensemble de chaque côté puis
faire frire les n − 2 hamburgers restants par le même algorithme.
b. Expliquez pourquoi cet algorithme ne fait pas frire les hamburgers dans le mini-
durée minimale pour tout n > 0.
14. > Problème de célébrité Une célébrité parmi un groupe de n personnes est une personne
qui ne connaît personne mais est connu de tout le monde. La tâche est de
identifier une célébrité en ne posant des questions qu'aux personnes de la forme :
tu le connais ?" Concevoir un algorithme efficace pour identifier une célébrité
ou déterminer que le groupe n'a pas une telle personne. Combien de questions
votre algorithme a-t-il besoin dans le pire des cas ? [Homme89]
35
Page 36
4. a. Notez que vous êtes interrogé ici sur une récurrence pour la fonction
valeurs, pas sur une récurrence pour le nombre de fois que son opération est
réalisé. Suivez simplement le pseudocode pour le configurer. Il est plus facile de résoudre ce
récurrence par substitutions en avant (voir Annexe B).
b. Cette question est très similaire à celle que nous avons déjà discutée.
b. Résoudre le problème pour 3 disques pour enquêter sur le nombre de déplacements effectués
par chacun des disques. Puis généraliser les observations et prouver leur
validité pour le cas général de n disques.
7. a. Considérez séparément les cas des valeurs paires et impaires de n et montrez que
pour les deux blog 2 nc satisfait la relation de récurrence et sa valeur initiale
état.
ré. Une mauvaise classe d'efficacité d'un algorithme en soi ne signifie pas que
36
Page 37
l'algorithme est mauvais. Par exemple, l'algorithme classique de la Tour de
Le puzzle de Hanoi est optimal malgré son efficacité en temps exponentiel. Donc,
une affirmation selon laquelle un algorithme particulier n'est pas bon nécessite une référence à un
le meilleur.
11. a. Utilisez la formule de la définition pour obtenir la relation de récurrence pour le nombre
bre de multiplications faites par l'algorithme.
13. Le temps minimum nécessaire pour faire frire trois hamburgers est plus petit
plus de quatre minutes.
14. Résolvez d'abord une version plus simple dans laquelle une célébrité doit être présente.
37
Page 38
x(n) = x(n − 1) + 5
= [x(n − 2) + 5] + 5 = x(n − 2) + 5 · 2
= [x(n − 3) + 5] + 5 · 2 = x(n − 3) + 5 · 3
= ...
= x(n − i)+5 · i
= ...
= x(1) + 5 · (n − 1) = 5(n − 1).
x(n) = 3x(n − 1)
= 3[3x(n − 2)] = 3 2 x(n − 2)
= 3 2 [3x(n − 3)] = 3 3 x(n − 3)
= ...
= 3 i x(n − i)
= ...
= 3 nL1 x(1) = 4 · 3 nL1 .
x(n) = x(n − 1) + n
= [x(n − 2) + (n − 1)] + n = x(n − 2) + (n − 1) + n
= [x(n − 3) + (n − 2)] + (n − 1) + n = x(n − 3) + (n − 2) + (n − 1) + n
= ...
= x(n − i)+(n − i +1)+(n − i + 2) + ··· + n
= ...
n(n+1)
= x(0) + 1 + 2 + ··· + n = .
2
38
Page 39
x (2 k ) = x (2 KL1 ) 2 k
= [x(2 kL2 )+2 kL1 ]+2 k = x(2 kL2 )+2 kL1 + 2 k
= [x(2 kL3 )+2 kL2 ]+2 kL1 + 2 k = x(2 kL3 )+2 kL2 + 2 kL1 + 2 k
= ...
= x(2 kLi )+2 kLi+1 + 2 kLi+2 + ··· + 2 k
= ...
= x(2 kLk )+2 1 + 2 2 + ··· + 2 k =1+2 1 + 2 2 + ··· + 2 k
= 2 k+1 − 1=2 · 2 k − 1=2n − 1.
39
Page 40
M(n) = M(n − 1) + 2
= [M(n − 2) + 2] + 2 = M(n − 2)+2+2
= [M(n − 3) + 2] + 2 + 2 = M(n − 3)+2+2+2
= ...
= M(n−i)+2i
= ...
= M(1) + 2(n − 1) = 2(n − 1).
Algorithme NonrecS(n)
// Calcule la somme des n premiers cubes de manière non récursive
//Entrée : Un entier positif n
//Sortie : La somme des n premiers cubes.
S1
pour i 2 à n faire
S←S+ii∗i
Retour
Xm Xm
2=2 1 = 2(n − 1).
i=2 i=2
C'est exactement le même nombre que dans la version récursive, mais le non-re-
la version cursive ne supporte pas les frais généraux de temps et d'espace associés à
la pile de la récursivité.
Q(n − 1) + 2n − 1=(n − 1) 2 + 2n − 1 = n 2 .
40
Page 41
Remarque : Si nous n'incluons pas dans le décompte les soustractions nécessaires pour dé-
pli n, la récurrence sera C(n) = C(n − 1) + 2 pour n > 1, C(1) = 0.
Sa solution est C(n) = 2(n − 1).
2 64 − 1
≈ 3,5 · 10 13 ans
60 · 24 · 365
b. Observez que pour chaque mouvement du ième disque, l'algorithme se déplace d'abord
la tour de tous les disques plus petits qu'elle à une autre cheville (cela nécessite un
déplacement du (i + 1)er disque) puis, après le déplacement du ième disque, ce
la plus petite tour est déplacée au sommet (cela nécessite à nouveau un déplacement de
le (i + 1)er disque). Ainsi, pour chaque mouvement du ième disque, l'algorithme
déplace le (i + 1)er disque exactement deux fois. Puisque pour i = 1, le nombre de
coups est égal à 1, on a la récurrence suivante pour le nombre de
mouvements effectués par le ième disque :
Sa solution est m(i)=2 iL1 pour i = 1,2,...,n. (Le moyen le plus simple d'obtenir
cette formule Notez
progression.) consiste
queà utiliser la formule
la réponse dubien
s'accorde terme générique
avec d'un
la formule pour le
nombre total de coups :
m m
X X
M(n) = m(i) = 2 iL1 =1+2+ ··· + 2 nL1 = 2 n − 1.
i=1 i=1
41
Page 42
Il peut être résolu par des substitutions vers l'arrière comme suit
M(n) = 3M(n − 1) + 2
= 3[3M(n − 2) + 2] + 2 = 3 2 M(n − 2) + 3 · 2+2
= 3 2 [3M(n − 3) + 2] + 3 · 2+2=3 3 M(n − 3) + 3 2 · 2+3 · 2+2
= ...
= 3 i M(n − i) + 2(3 iL1 + 3 iL2 + ··· +1)=3 i M(n − i)+3 i − 1
= ...
= 3 nL1 M(1) + 3 nL1 − 1=3 nL1 · 2+3 nL1 − 1=3 n − 1.
42
Page 43
b. A(n)=2A(n − 1) + 1, A(0) = 0.
A(n) = 2A(n − 1) + 1
= 2[2A(n − 2) + 1] + 1 = 2 2 A(n − 2)+2+1
= 2 2 [2A(n − 3) + 1] + 2 + 1 = 2 3 A(n − 3) + 2 2 +2+1
= ...
= 2 i A(n − i)+2 iL1 + 2 iL2 + ··· + 1
= ...
= 2 n A(0) + 2 nL1 + 2 nL2 + ··· +1=2 nL1 + 2 nL2 + ··· +1=2 n − 1.
n- 1 n- 1
n -2 n -2 n -2 n -2
1
... 1
... 1
... 1
0 0 0 0 0 0 0 0
Notez qu'il a un niveau supplémentaire par rapport à l'arbre similaire pour la Tour
du puzzle de Hanoï.
ré. C'est un très mauvais algorithme car il est largement inférieur à l'algo-
rithm qui multiplie simplement un accumulateur par 2 n fois, sans parler
algorithmes beaucoup plus efficaces discutés plus loin dans le livre. Même si seulement
les ajouts sont autorisés, ajouter deux fois 2 nL1 est meilleur que cet algorithme.
43
Page 44
10. Soit C w (n) le nombre de fois où l'élément de la matrice d'adjacence est vérifié
dans le pire des cas (le graphique est complet). On a la récurrence suivante
pour C w (n)
C w (n) = C w (n − 1) + n − 1
= [C w (n − 2) + n − 2] + n − 1
= [C w (n − 3) + n − 3] + n − 2 + n − 1
= ...
= C w (n − i)+(n − i)+(n − i + 1) + ··· + (n − 1)
= ...
= C w (1) + 1 + 2 + ··· + (n − 1)=0+(n − 1)n/2=(n − 1)n/2.
Ce résultat pourrait aussi être obtenu directement en observant que dans le pire des cas
cas, l'algorithme vérifie chaque élément en dessous de la diagonale principale du
matrice d'adjacence d'un graphe donné.
c'est à dire,
M(n) = n(M(n − 1) + 1) pour n > 1 et M(1) = 0.
44
Page 45
12. Le nombre de carrés ajoutés à la nième itération à chacun des quatre
côtés symétriques du voisinage de von Neumann est égal à n. D'où
on obtient la récurrence suivante pour S(n), le nombre total de carrés
dans le voisinage après la nième itération :
S(n) = S(n − 1) + 4n
= [S(n − 2) + 4(n − 1)] + 4n = S(n − 2) + 4(n − 1) + 4n
= [S(n − 3) + 4(n − 2)] + 4(n − 1) + 4n = S(n − 3) + 4(n − 2) + 4(n − 1) + 4n
= ...
= S(n − i) + 4(n − i + 1) + 4(n − i + 2) + ··· + 4n
= ...
= S(0) + 4 · 1+4 · 2 + ··· + 4n = 1 + 4(1 + 2 + ··· + n)
= 1+4n(n + 1)/2=2n 2 + 2n + 1.
13. a. Soit T(n) le nombre de minutes nécessaires pour faire frire n hamburgers par le
algorithme donné. On a alors la récurrence suivante pour T(n) :
Sa solution est T(n) = n pour tout n pair > 0 et T(n) = n + 1 pour tout
n impair > 0 peut être obtenu soit par substitutions en arrière, soit par application-
la formule du terme générique d'une progression arithmétique.
Pour chaque n > 1, cet algorithme nécessite n minutes pour faire le travail. C'est
le minimum de temps possible car n crêpes ont 2n faces à faire frire
45
Page 46
et n'importe quel algorithme ne peut pas faire frire plus de deux côtés en une minute. le
algorithme est aussi évidemment optimal pour le cas trivial de n = 1, nécessitant
deux minutes pour faire frire un seul hamburger des deux côtés.
14. Le problème peut être résolu par un algorithme récursif. En effet, en demandant
juste une question, nous pouvons éliminer le nombre de personnes qui peuvent être un
célébrité par 1, résoudre le problème pour le groupe restant de n − 1 personnes
récursivement, puis vérifiez la solution renvoyée en ne demandant pas plus de
deux questions. Voici une description plus détaillée de cet algorithme :
La récurrence pour Q(n), le nombre de questions nécessaires dans le pire des cas,
est comme suit:
Remarque : Une discussion sur ce problème, y compris une mise en œuvre de cet al-
gorithm dans un pseudo-code de type Pascal, peut être trouvé dans l'introduction d'Udi Manber
aux algorithmes : une approche créative. Addison-Wesley, 1989.
46
47
Exercices 2.5
1. Trouver un site Web dédié aux applications des nombres de Fibonacci et
l'étudier.
2. Le problème des lapins de Fibonacci Un homme a mis une paire de lapins dans un endroit sur-
arrondi par un mur. Combien y aura-t-il de couples de lapins par an si le
la paire initiale de lapins (mâle et femelle) est nouveau-née, et toutes les paires de lapins
ne sont pas fertiles au cours de leur premier mois de vie mais donnent ensuite naissance à
un nouveau couple mâle/femelle à la fin de chaque mois ?
6. Les valeurs maximales des types primitifs Java int et long sont 2 31 -1
et 2 63 -1, respectivement. Trouver le plus petit n pour lequel le nième de Fibonacci
nombre ne va pas tenir dans une mémoire allouée pour
une. le type int. b. le type long.
8. Améliorer l'algorithme Fib du texte afin qu'il ne nécessite que θ(1) espace.
9. Prouver l'égalité
F(n − 1) m
F(n) 01
pour n 1.
F(n) F(n + 1) = ∙ 11
10. > Combien de divisions modulo sont faites par l'algorithme d'Euclide sur deux
nombres de Fibonacci consécutifs F(n) et F(n − 1) comme
mettre?
11. Disséquer un rectangle de Fibonacci Étant donné un rectangle dont les côtés sont deux
nombres de Fibonacci consécutifs, concevez un algorithme pour le disséquer en
les carrés dont au plus deux des carrés sont de la même taille. Quoi
est la classe d'efficacité temporelle de votre algorithme ?
47
Page 48
49
6. Utilisez une formule approximative pour F(n) pour trouver les plus petites valeurs de n à
dépasser les nombres donnés.
7. Établir les relations de récurrence pour C(n) et Z(n), avec les initiales appropriées
conditions, bien sûr.
8. Toutes les informations nécessaires à chaque itération de l'algorithme sont les valeurs
des deux derniers nombres de Fibonacci consécutifs. Modifier l'algorithme pour
profiter de ce fait.
12. Les k derniers chiffres d'un entier N peuvent être obtenus en calculant N mod 10 k .
Réaliser toutes les opérations de vos algorithmes modulo 10 k (voir Annexe
A) vous permettra de contourner la croissance exponentielle du Fibonacci
[Link]
l'analyse Notez également que la section 2.6 est consacrée à une discussion générale de
des algorithmes.
49
50
Le tableau suivant donne les valeurs des treize premiers termes de la sé-
séquence, appelée les nombres de Fibonacci, définie par cette relation de récurrence :
Résoudre cette récurrence soit « à partir de zéro » ou, mieux encore, en remarquant que
la solution a une longueur d'avance sur la séquence canonique de Fibonacci F(n),
on obtient W(n) = F(n + 1) pour n 1.
50
51
6. a. La question est de trouver la plus petite valeur de n telle que F(n) > 2 31 -1.
En utilisant la formule F(n) = √5
1 ф n arrondi à l'entier le plus proche, on obtient
1
√5ф n > 2 31 − 1 ou ф n > √5(2 31 − 1).
Après avoir pris les logarithmes naturels des deux côtés, on obtient
ln(√5(2 31 − 1))
n> § 46.3.
lnф
b. De même, nous devons trouver la plus petite valeur de n telle que F(n) >
2 63 − 1. Ainsi,
1
√5ф n > 2 63 − 1, ou ф n > √5(2 63 − 1)
ou, après avoir pris les logarithmes naturels des deux côtés,
ln(√5(2 63 − 1))
n> § 92.4.
lnф
pour C(n) et Z(n), respectivement. Par conséquent, étant donné que la récurrence
l'équation et les conditions initiales pour C(n) et F(n) sont les mêmes, C(n) =
51
52
F(n). Quant à l'affirmation selon laquelle Z(n) = F(n − 1), il est facile de voir qu'elle
devrait être le cas puisque la séquence Z(n) ressemble à ceci :
c'est-à-dire que c'est la même chose que les nombres de Fibonacci déplacés d'une position vers le
à droite. Ceci peut être formellement prouvé en vérifiant que la suite F(n−1)
(où F(−1) est défini comme 1) satisfait la relation de récurrence
Il peut également être prouvé soit par induction mathématique, soit en dérivant un
formule explicite pour Z(n) et montrant que cette formule est la même que la
valeur de la formule explicite pour F(n) avec n remplacé par n − 1.
8. Algorithme Fib2(n)
// Calcule le n-ième nombre de Fibonacci en utilisant seulement deux variables
//Entrée : Un entier non négatif n
//Sortie : le n-ième nombre de Fibonacci
u 0 ; v 1
pour i 2 à n faire
v←v+u
u←v−u
si n = 0 retourne 0
sinon retourner v
En effet,
01 n+1 m
01 01
=
11 11 11
01 F(n − 1) F(n) F(n) F(n+1)
= .
11 F(n) F(n+1) = ∙ F(n+1) F(n+2)
52
53
10. L'observation principale ici est le fait que l'algorithme d'Euclide remplace
deux nombres de Fibonacci consécutifs comme entrée par une autre paire de
nombres de Fibonacci utifs, à savoir :
(On peut aussi facilement trouver directement que D(2) = 1 et D(1) = 0.)
11. Étant donné un rectangle de côtés F(n) et F(n + 1), le problème peut être
résolu par l'algorithme récursif suivant. Si n = 1, le problème est
déjà résolu car le rectangle est un carré 1 × 1. Si n > 1, disséquer
le rectangle dans le carré F(n) × F(n) et le rectangle avec des côtés
F(n−1) et F(n) puis disséquer cette dernière par le même algorithme. le
L'algorithme est illustré ci-dessous pour le carré 8 × 13.
× × 11
11
2×
2
3×3
8×8
5×5
53
54
12. s.o.
54
Page 55
Exercices 2.6
1. Considérons l'algorithme de tri bien connu suivant (nous l'étudierons
plus près plus loin dans le livre) avec un compteur inséré pour compter le nombre
bre de comparaisons clés.
Le compteur de comparaison est-il inséré au bon endroit ? Si vous croyez que c'est le cas,
prouve le; si vous pensez que ce n'est pas le cas, apportez une correction appropriée.
b. Analyser les données obtenues pour former une hypothèse sur l'algorithme
efficacité moyenne.
4. Faire l'hypothèse d'une classe d'efficacité probable d'un algorithme sur la base des éléments suivants
observations empiriques du décompte de son fonctionnement de base :
Taille 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
compter 11 966 24 303 39 992 53 010 67 272 78 692 91 274 113 063 129 799 140 538
55
Page 56
b. Pour chaque entier positif k, trouvez empiriquement la plus petite paire d'in-
entiers 1 ≤ n ≤ m ≤ 100 pour lesquels l'algorithme d'Euclide doit faire k
divisions afin de trouver pgcd(m,n).
8. L'efficacité au cas moyen de l'algorithme d'Euclide sur des entrées de taille n peut
être mesuré par le nombre moyen de divisions D moy (n) effectué par le
algorithme de calcul pgcd(n,1), pgcd(n,2), ..., pgcd(n,n). Par example,
1
D moy (5) = (1 + 2 + 3 + 2 + 1) = 1,8.
5
Produisez un nuage de points de D moy (n) et indiquez une efficacité probable de cas moyen
classe d'efficacité de l'algorithme.
56
57
2. Déboguez votre comptage de comparaison et la génération d'entrées aléatoires pour les petits
tailles de tableau en premier.
3. Sur un ordinateur de bureau raisonnablement rapide, vous pouvez très bien obtenir zéro temps, au moins pour
des tailles plus petites dans votre échantillon. La section 2.6 mentionne une astuce pour surmonter
cette difficulté.
8. Obtenez les données empiriques pour les valeurs aléatoires de n dans une plage comprise entre, disons,
10 2 et 10 4 ou 10 5 et tracer les données obtenues. (Vous pouvez utiliser
différentes échelles pour les axes de votre système de coordonnées.)
9. n/a
10. n/a
57
Page 58
si j ≥ 0 compte ← compte + 1
c. C (10 000) peut être estimé soit à 10 000 2 /4, soit à 4C (5 000).
3. Voir les réponses à l'exercice 2. Notez, cependant, que les données de temps sont
intrinsèquement beaucoup moins précis et volatiles que les données de comptage.
58
Page 59
9. n/a
10. n/a
59