Vous êtes sur la page 1sur 59

Machine Translated by Google

Ce fichier contient les exercices, astuces et solutions du chapitre 2 du livre « Introduction à


la conception et à l'analyse d'algorithmes », 3e édition, par A. Levitin. Les problèmes qui
pourraient constituer un défi pour au moins certains élèves sont notés B ; ceux qui pourraient
être difficiles pour une majorité d'élèves sont notés I

Exercices 2.1
1. Pour chacun des algorithmes suivants, indiquez (i) une métrique de taille naturelle pour
ses entrées, (ii) son opération de base, et (iii) si le nombre d'opérations de base peut être
différent pour des entrées de même taille :

un. calculer la somme de nombres

b. informatique !

c. trouver le plus grand élément dans une liste de nombres

d. L'algorithme d'Euclide

e. tamis d'Eratosthène

F. algorithme stylo­crayon pour multiplier deux entiers décimaux à chiffres

2. une. Considérons l’algorithme basé sur la définition pour ajouter deux matrices × .
Quel est son fonctionnement de base ? Combien de fois est­elle effectuée en fonction de
l’ordre matriciel ? 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
multiplication matricielle.

3. Considérons une variante de recherche séquentielle qui analyse une liste pour renvoyer
le nombre d'occurrences d'une clé de recherche donnée dans la liste. Son efficacité sera­
t­elle différente de celle de la recherche séquentielle classique ?

4. une. Sélection des gants Il y a 22 gants dans un tiroir : 5 paires de gants rouges, 4 paires
de jaunes et 2 paires de verts. Vous sélectionnez les gants dans l'obscurité et ne pouvez
les vérifier qu'après avoir effectué une sélection. Quel est le plus petit nombre de gants
que vous devez sélectionner pour avoir au moins une paire assortie dans le meilleur des
cas ? au pire des cas?

b. Chaussettes manquantes Imaginez qu'après avoir lavé 5 paires de chaussettes


distinctes, vous découvrez qu'il manque deux chaussettes. Bien sûr, vous aimeriez avoir
le plus grand nombre de paires complètes restantes. Ainsi, vous vous retrouvez avec 4
paires complètes dans le meilleur des cas et avec 3 paires complètes dans le pire des
cas. En supposant que la probabilité de disparition pour chaque

1
Machine Translated by Google

des 10 chaussettes est la même, trouvez la probabilité du meilleur des cas ; la probabilité
du pire des cas ; le nombre de paires auquel vous devriez vous attendre dans le cas moyen.

5. aB Démontrer la formule (2.1) pour le nombre de bits dans la représentation binaire d'un
entier positif.

bB Démontrer la formule alternative pour le nombre de bits dans la représentation binaire


d'un entier positif :

= dlog2( + 1)e

c. Quelles seraient les formules analogues pour le nombre de chiffres décimaux ?

d. Expliquez pourquoi, dans le cadre d'analyse accepté, peu importe que nous utilisions
des chiffres binaires ou décimaux pour mesurer la taille de .

6. Suggérez comment un algorithme de tri peut être augmenté de manière à ce que le nombre
optimal de ses comparaisons clés soit égal à seulement −1( est la taille d'une liste,
bien sûr). Pensez­vous que ce serait un ajout intéressant à tout algorithme de tri ?

7. L'élimination gaussienne, l'algorithme classique pour résoudre des systèmes de multiplications


1
à inconnues, requiert le fonctionnement de linéaires 3 3 , qui sont les équations
base de l'algorithme.

un. Combien de temps encore faut­il s'attendre à ce que l'élimination gaussienne fonctionne
sur un système de 1 000 équations par rapport à un système de 500 équations ?

b. Vous envisagez d’acheter un ordinateur 1000 fois plus rapide que celui que vous
possédez actuellement. Dans quelle mesure l'ordinateur plus rapide augmentera­t­il la taille
des systèmes résolubles dans le même laps de temps que sur l'ancien ordinateur ?

8. Pour chacune des fonctions suivantes, indiquez dans quelle mesure la valeur de la fonction
changera si son argument est multiplié par quatre.

un. log2 b. √ c. d. 2 e. 3 F. 2

9. Indiquez si la première fonction de chacune des paires suivantes a un ordre de croissance


plus petit, identique ou plus grand (à un multiple constant près) que la deuxième fonction.

2
Machine Translated by Google

un. ( + 1) et 2000 2 b. 100 2 et 0 01 3

c. log2 et ln d. journal2
2 et log2 2

e. 2 −1 et 2 F. ( − 1) ! et !

10. Invention des échecs a. Selon une légende bien connue, le jeu d'échecs a été
inventé il y a plusieurs siècles dans le nord­ouest de l'Inde par un certain sage.
Lorsqu'il présenta son invention à son roi, celui­ci aimait tellement le jeu qu'il offrit
à l'inventeur la récompense qu'il souhaitait. L'inventeur a demandé que l'on
obtienne du grain de la manière suivante : il fallait placer un seul grain de blé sur
la première case de l'échiquier, deux sur la deuxième, quatre sur la troisième,
huit sur la quatrième, et ainsi de suite. jusqu'à ce que les 64 cases soient
remplies. S’il ne fallait qu’une seconde pour compter chaque grain, combien de
temps faudrait­il pour compter tous les grains qui lui sont dus ?

b. Combien de temps faudrait­il si, au lieu de doubler le nombre de grains pour


chaque case de l'échiquier, l'inventeur demandait d'en ajouter deux ?

3
Machine Translated by Google

Conseils pour les exercices 2.1

1. Les questions sont en effet aussi simples qu’elles le paraissent, même si certaines d’entre elles
peuvent avoir des réponses alternatives. Gardez également à l’esprit la mise en garde
concernant la mesure de la taille d’un entier.

2. une. 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.

b. La multiplication matricielle nécessite deux opérations : la multiplication et l'addition. Lequel


des deux considéreriez­vous comme basique et pourquoi ?

3. L'efficacité de l'algorithme variera­t­elle sur différentes entrées de même taille ?

4. une. Les gants ne sont pas des chaussettes : ils peuvent être droitiers et gauchers.

b. Vous n’avez que deux résultats qualitativement différents possibles. Comptez le nombre de
façons d’obtenir chacun des deux.

5. une. Tout d’abord, prouvez d’abord que si un entier décimal positif a chiffres dans son
représentation binaire, alors

2 −1 ≤ 2

Ensuite, prenons les logarithmes en base 2 des termes de cette inégalité.

b. La preuve est similaire à la preuve de la formule (2.1).

c. La formule sera la même, avec juste un petit ajustement pour tenir compte des différentes
bases.

d. Comment passer d’une base de logarithme à une autre ?

6. Insérez une vérification indiquant si le problème est déjà résolu.

7. Une question similaire a été étudiée dans la section.

8. Utilisez soit la différence entre (4 ) et ( ) , soit le rapport entre (4 ) , selon celui


qui convient le mieux pour obtenir une réponse compacte. Si c'est possible, essayez d'obtenir
une réponse qui ne dépend pas de

9. Si nécessaire, simplifier les fonctions concernées pour distinguer les termes définissant leurs
ordres de croissance à un multiple constant près. (Nous discuterons des méthodes formelles
pour répondre à ces questions dans la section suivante ; cependant, il est possible de répondre
à ces questions sans connaître ces méthodes.)

10. une. Utilisez la formule P 2 =2 +1 − 1.


=0

b. Utilisez la formule de la somme des premiers nombres impairs ou la formule de la


somme des progressions arithmétiques.

4
Machine Translated by Google

Solutions aux exercices 2.1


1. Les réponses sont les suivantes.

un. (i) ; (ii) addition de deux nombres ; (iii) non

b. (i) la grandeur de , c'est­à­dire le nombre de bits dans sa représentation binaire ;


(ii) multiplication de deux nombres entiers ; (iii) non

c. (i) ; (ii) comparaison de deux nombres ; (iii) non (pour l'algorithme d'analyse de
liste standard)

d. (i) soit la grandeur du plus grand de deux nombres d'entrée, soit la grandeur du
plus petit de deux nombres d'entrée, soit la somme des grandeurs de deux nombres
d'entrée ; (ii) division modulo ; (iii) oui

e. (i) la grandeur de , c'est­à­dire le nombre de bits dans sa représentation binaire ;


(ii) l'élimination d'un certain nombre de candidats de la liste des candidats restants au
premier rang ; (iii) non

F. (i) ; (ii) multiplication de deux chiffres ; (iii) non

2. une. Ajout de deux nombres. Elle est effectuée 2 fois (une fois pour chacun des 2
éléments de la matrice en cours de calcul). .Puisque le nombre total d'éléments dans
deux matrices données est = 2 2 , le nombre total d'ajouts peut également être
exprimé par 2 = 2

b. Étant donné que 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 2 éléments du produit de deux matrices par est calculé comme
le produit scalaire (scalaire) de deux vecteurs de taille , ce qui nécessite
multiplications. Le nombre total de multiplications est · 2= 3=( 2)3 2.

3. Cet algorithme fera toujours comparaisons clés sur chaque entrée de taille
alors que ce nombre peut varier entre et 1 pour la version classique de recherche
séquentielle.

4. une. Le meilleur nombre est évidemment deux. Le pire des cas est douze : un de plus
que le nombre de gants à une main.

b. Il n’y a ici que deux issues possibles : les deux chaussettes manquantes forment
une paire (le meilleur des cas) et les deux stocks manquants ne forment pas une
paire (le pire des cas). Le nombre total de résultats différents (les façons

5
Machine Translated by Google

pour choisir les chaussettes manquantes) est ¡10 2 ¢ = 45 Le nombre de chaussettes dans le meilleur des cas
est 5 ; sa probabilité est donc de 9 45Le=nombre de cas les plus défavorables est
5 1
40 = 8
45 ­ 5 = 40 ; donc sa probabilité est attendue 45 9 En moyenne, vous devriez
1 + 3 · 8 = 28 = 3 1
4· 9 9 9 9 paires correspondantes.

5. une. Le plus petit entier positif qui a chiffres binaires dans son binaire
l'expansion est de 10 0 qui vaut 2 −1 ; le plus grand entier positif qui a
|{z} −1

les chiffres binaires dans son développement binaire sont 11 1 qui est 2 −1+2 −2+ +1 =
|{z} −1

2 −1 Ainsi,
2 −1 ≤ 2

Ainsi
log2 2 −1 ≤ log2 log2 2
ou
− 1 ≤ log2

Ces inégalités impliquent que − 1 est le plus grand entier n’excédant pas
log2 Autrement dit, en utilisant la définition de la fonction plancher, on conclut que

− 1 = blog2 c ou = blog2 c+1

b. Si 0a bits dans sa représentation binaire, alors, comme le montre


partie A,
2 −1 ≤ 2

Ainsi
2 −1 +1≤2

et donc
log2 2 −1 log2( + 1) ≤ log2 2
ou
−1 log2( + 1) ≤

Ces inégalités impliquent que est le plus petit entier non inférieur à
log2( + 1) Autrement dit, en utilisant la définition de la fonction plafond,
nous concluons que
= dlog2( + 1)e

c. = blog10 c +1= dlog10( + 1)e

d. = blog2 c + 1 ≈ log2 = log2 10 log10 ≈ (log2 10) , où =

6
Machine Translated by Google

blog10 c + 1 Autrement dit, les deux mesures de taille sont à peu près égales à un
multiple constant pour les grandes valeurs de

6. Avant d'appliquer un algorithme de tri, comparez les éléments adjacents de


son entrée : si ≤ +1 pour chaque =0 −2 arrêt. Généralement, il
n'est pas un ajout intéressant car il ralentit l'algorithme sur tous
mais des apports très particuliers. A noter que certains algorithmes de tri (notamment
le tri à bulles et le tri par insertion, qui sont abordés dans les sections 3.1 et
4.1, respectivement) incorporent intrinsèquement ce test dans le corps du
algorithme.

1
7. une. (2 ) ≈ (2 )3
3
1 = 8, où est le temps d'une multiplication
( ) 3
3

b. On peut estimer le temps d’exécution pour résoudre des systèmes d’ordre sur
l'ancien ordinateur et celui de commande sur le nouvel ordinateur comme ( )≈
1 1
3 3 et ( ) ≈ 10−3 3 3 respectivement, où est le temps de
une multiplication sur l'ancien ordinateur. Remplacement de ( ) et ( )
1
par ces estimations dans l'équation ( )= ( ) donne 3 3≈
1 ≈ 10
10−3 3 3 ou

8. une. log2 4 − log2 = (log2 4 + log2 ) − log2 =2

b. √ 4 =2

c. 4 =4

d. (4 )2 = 42
2

e. (4 )3 = 43
3

F. 24 = 23 = (2 )3
2

9. une. ( + 1) ≈ 2 a le même ordre de croissance (quadratique) que 2000 2à


dans un multiple constant.

b. 100 2 (quadratique) a un ordre de croissance inférieur à 0,01 3 (cubique).

c. Puisque changer la base d'un logarithme peut être effectué par la formule

log = log log

toutes les fonctions logarithmiques ont le même ordre de croissance à un multiple constant
près.

7
Machine Translated by Google

d. journal2
2 = log2 log2 et log2 2 = 2 log Donc log2 2a un ordre de
croissance plus élevé que log2 2

e. 2 −1 = 2 a le même ordre de croissance que 2


12 à un multiple constant près

F. ( − 1) ! a un ordre de croissance inférieur à !=( − 1)!

10. une. Le nombre total de grains dus à l'inventeur est


64 63

2 = 264 − 1 ≈ 1 8 · 1019
X2 −1 = X
=1 =0

(C'est bien plus que ce que l'on peut obtenir en plantant des céréales sur toute la
surface de la planète Terre.) S'il fallait juste une seconde pour compter chaque
grain, le temps total nécessaire pour compter tous ces grains s'élèverait à environ
585 milliards. ans, soit plus de 100 fois plus que l'âge estimé de notre planète.

b. Ici, la quantité totale de grains aurait été égale à

1+3+ + (2 · 64 − 1) = 642

Avec la même vitesse de comptage d'un grain par seconde, il lui aurait fallu moins
d'une heure et quatorze minutes pour compter sa modeste récompense.

8
Machine Translated by Google

Exercices 2.2
1. Utilisez la notation la plus appropriée parmi Θ et Ω pour indiquer le
classe d'efficacité temporelle de la recherche séquentielle (voir la section 2.1)

un. au pire des cas.

b. Dans le meilleur des cas.

c. dans le cas moyen.

2. Utilisez les définitions informelles de Θ et Ω pour déterminer si les affirmations suivantes


sont vraies ou fausses.

un. ( + 1) 2 ( 3) b. ( + 1) 2 ( 2)

c. ( + 1) 2 Θ( 3) d. ( + 1) 2 Ω( )

3. Pour chacune des fonctions suivantes, indiquez à quelle classe Θ( ( )) la fonction appartient.
(Utilisez le ( ) le plus simple possible dans vos réponses.) Prouvez vos affirmations. un. ( 2+
1)10
b. √ 10 2+7 +3

c. 2 lg( + 2)2 + ( + 2)2 lg 2


d. 2 +1 + 3 −1

e. blog2 c

4. une. Le tableau 2.1 contient les valeurs de plusieurs fonctions qui surviennent souvent lors de
l'analyse d'algorithmes. Ces valeurs suggèrent certainement que les fonctions

journal journal 2 3 2 !

sont classés par ordre croissant de leur ordre de croissance. Ces valeurs prouvent­elles ce fait
avec une certitude mathématique ?

b. Prouver que les fonctions sont bien classées par ordre croissant de leur ordre de croissance.

5. Classez les fonctions suivantes selon leur ordre de croissance (du plus bas au plus élevé) :

( −2)! 5 lg( + 100)10 22 0 001 4+3 3+1 ln2 , √3 3

6. une. Montrer que tout polynôme de degré ( )= + −1 −1 +


··· + 0 avec 0 appartient à Θ( )

b. Montrer que les fonctions exponentielles ont différents ordres de croissance pour différentes
valeurs de base 0

9
Machine Translated by Google

7. Prouver (en utilisant les définitions des notations impliquées) ou réfuter (en
donnant un contre­exemple spécifique) les affirmations suivantes.

un. Si ( ) ( ( )) alors ( ) Ω( ( ))

b. Θ( ( )) = Θ( ( )) où 0

c. Θ( ( )) = ( ( )) ∩ Ω( ( ))

dB Pour deux fonctions non négatives ( ) et ( ) définies sur l'ensemble des entiers non négatifs,
soit ( ) ( ( )) ou ( ) Ω( ( )) ou les deux.

8. B Démontrer le théorème de la section pour

un. Notation Ω.

b. Notation Θ.

9. Nous avons mentionné dans cette section que l'on peut vérifier si tous les éléments d'un tableau sont
distincts par un algorithme en deux parties basé sur le pré­tri du tableau.

un. Si le prétri est effectué par un algorithme avec une efficacité temporelle en Θ( log ) , quelle
sera la classe d'efficacité temporelle de l'algorithme entier ?

b. Si l'algorithme de tri utilisé pour le pré­tri nécessite un tableau supplémentaire de taille , quelle
sera la classe d'efficacité spatiale de l'algorithme entier ?

10. L’étendue d’un ensemble fini non vide de nombres réels est définie comme la différence entre le
plus grand et le plus petit élément de . Pour chaque représentation de donnée ci­dessous,
décrivez en anglais un algorithme pour calculer l’étendue. Indiquer les classes d'efficacité temporelle
de ces algorithmes en utilisant la notation la plus appropriée ( Θ ou Ω)

un. Un tableau non trié

b. Un tableau trié

c. Une liste triée à chaînage unique

d. Un arbre de recherche binaire

11. Plus léger ou plus lourd ? Vous disposez de 2 pièces de monnaie identiques et d’une balance à
deux plateaux sans poids. L’une des pièces est une fausse, mais vous ne savez pas si elle est plus
légère ou plus lourde que les pièces authentiques, qui pèsent toutes le même poids. Concevez un
algorithme Θ(1) pour déterminer si la fausse pièce est plus légère ou plus lourde que les autres.

dix
Machine Translated by Google

12. B Porte dans un mur Vous faites face à un mur qui s'étend à l'infini dans les
deux directions. Il y a une porte dans le mur, mais vous ne savez ni à quelle
distance ni dans quelle direction. Vous ne pouvez voir la porte que lorsque
vous êtes juste à côté. Concevez un algorithme qui vous permet d'atteindre la
porte en faisant au plus ( ) pas, où est le nombre (inconnu de vous) de
pas entre votre position initiale et la porte. [Par95]

11
Machine Translated by Google

Conseils pour les exercices 2.2

1. Utilisez les comptes correspondants à l'opération de base de l'algorithme (voir Section


2.1) et les définitions de Θ et Ω

2. Établissez d’abord l’ordre de croissance de ( + 1) 2, puis utilisez les définitions


informelles de Θ et Ω. (Des exemples similaires ont été donnés dans la section.)

3. Simplifier les fonctions données pour distinguer les termes définissant leurs commandes
de croissance.

4. une. Vérifiez attentivement les définitions pertinentes.

b. Calculez les limites de rapport de chaque paire de fonctions consécutives de la liste.

5. Simplifiez d’abord certaines fonctions. Ensuite, utilisez la liste des fonctions du tableau
2.2 pour « ancrer » chacune des fonctions données. Prouvez leur placement final en
calculant les limites appropriées.

6. une. Vous pouvez prouver cette affirmation soit en calculant une limite appropriée
ou en appliquant l'induction mathématique.

b. Calculer lim →∞ 1 2

7. Prouver l'exactitude de (a), (b) et (c) en utilisant les définitions appropriées ; construire
un contre­exemple pour (d) (par exemple, en construisant deux fonctions se comportant
différemment pour les valeurs paires et impaires de leurs arguments).

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 entendu, différentes inégalités doivent être utilisées pour délimiter la
somme par le bas.

9. Suivez le plan d'analyse utilisé dans le texte lors de la mention de l'algorithme.


tionné pour la première fois.

10. Vous pouvez utiliser des algorithmes simples pour les quatre questions posées.
Utilisez la notation pour la classe d'efficacité temporelle de l'un d'eux, et la notation
Θ pour les trois autres.

11. Le problème peut être résolu en deux pesées.

12. Vous devez marcher par intermittence à gauche et à droite depuis votre position initiale
jusqu'à ce que la porte soit atteinte.

12
Machine Translated by Google

Solutions aux exercices 2.2


1. une. Puisque ( )= ( ) Θ( )

b. Puisque ( )=1 (1) Θ(1)

( +1) + (1 − ) = (1 − ) + où 0 ≤ ≤1
c. Puisque ( )= 2 2 2
( ) Θ( )

2. ( + 1) 2≈ 2 2 est quadratique. Donc

un. ( + 1) 2 ( 3) est vrai. b. ( + 1) 2 ( 2) est vrai.

c. ( + 1) 2 Θ( 3) est faux. d. ( + 1) 2 Ω( ) est vrai.

3. une. De manière informelle, ( 2 + 1)10 ≈ ( 2)10 = 20 Θ( 20) Formellement,

( 2+1)10 ( 2+1)10 1
20 = lim →∞ 2 ¢10 = 1
lim →∞ ( 2)10 lim →∞ ³ 2+1 2 ´10 == lim →∞ ¡ 1 + =

D’où ( 2 + 1)10 Θ( 20)

Remarque : Une preuve alternative peut être basée sur la formule binomiale et
l’affirmation de l’exercice 6a.

b. De manière informelle, √10 2+7 + 3 ≈ √ 10 2 = √10 Θ( ) Formellement,

√10 2+7 +3 7 + 3 = √ 10
= lim →∞ q10 2+7 +3 2 = lim →∞q 10 + 2
lim →∞

Donc √10 2+7 +3 Θ( )

c. 2 lg( + 2)2 + ( + 2)2 lg Θ( lg 2


=2 2 lg( + 2) + ( + 2)2(lg − 1)
) + Θ( 2 lg ) = Θ( 2 lg )

d. 2 +1 + 3 −1 = 2 2+3 1
3
Θ(2 ) + Θ(3 ) = Θ(3 )

e. De manière informelle, blog2 c ≈ log2 Θ(log ) Formellement, en utilisant les inégalités


−1 b c≤ (voir Annexe A), nous obtenons une borne supérieure

blog2 c ≤ log2

et une borne inférieure

1 1
blog2 c log2 − 1 ≥ log2 − log2 (pour chaque ≥ 4) = log2
2 2

D'où blog2 c Θ(log2 ) = Θ(log )

13
Machine Translated by Google

4. une. L'ordre de croissance et les notations associées Ω et Θ traitent de


le comportement asymptotique des fonctions lorsque tend vers l'infini. Donc non
valeurs spécifiques des fonctions dans une plage finie des valeurs de , suggestives
quels qu'ils soient, peuvent établir leurs ordres de croissance avec des méthodes mathématiques.
certitude.
1
log2 (log2 )0 log2 1
=0
b. lim →∞ = lim →∞ ( )0 = lim →∞ 1 = log2 lim →∞

1
=0
lim →∞ log2 = lim →∞ log2

log2 log2
2 = lim →∞
= (voir la première limite de cet exercice) = 0
lim →∞

1
2
3
=0
lim →∞ = lim →∞

3 ( 3)0 3 2 = 3 2 = 3 ( 2)0
lim →∞
2 →∞ (2 )0 = lim →∞ 2 ln 2
= lim ln 2 lim →∞ 2 ln 2 lim →∞ (2 )0
= 3 2 = 6 = 6 ( )0
ln 2 lim →∞ 2 ln 2 ln2 2 lim →∞ 2 ln2 2 lim →∞ (2 )0
= 6 1 = 6 1
=0
ln2 2 lim →∞ 2 ln 2 ln3 2 lim →∞ 2

2
! = (voir exemple 3 dans la section) 0
lim →∞

5. ( −2)! Θ(( −2)!) 5 lg( + 100)10 = 50 lg( + 100) Θ(log ) 22 =


(22) Θ(4 ) 0 001 4+3 3+1 Θ( 4) ln2 Θ(log2 ) √3
1
Θ( 3 ) 3 Θ(3 ) La liste de ces fonctions classées par ordre croissant
l’ordre de croissance est le suivant :

5 lg( + 100)10 ln2 √3 0 001 4+3 3+1 3 22 ( − 2) !

( ) + −1 −1+ + 0 −1
= limite + +
0
)
6. une. lim →∞ →∞ = lim →∞( +

= 0

D’où ( ) Θ( )

b.

0 si 1 2 1 ( 2)
1
1 si 1= 2 1 Θ( 2)
lim →∞
2 = lim →∞ µ 1 2¶ =
∞ si 1 2
( 1) 2

7. une. L'affirmation devrait être correcte car elle indique que si l'ordre de
la croissance de ( ) est inférieure ou égale à l’ordre de croissance de ( ) alors

14
Machine Translated by Google

l'ordre de croissance de ( ) est supérieur ou égal à l'ordre de croissance de


( ) La preuve formelle est également immédiate :

( )≤ ( ) pour tout ≥ 0 où 0

implique
1
( ) ( )≤ ( ) pour tout ≥ 0

b. L'affirmation selon laquelle Θ( ( )) = Θ( ( )) devrait être vraie car ( )


et ( ) diffèrent simplement par un multiple constant positif et, par conséquent, par
la définition de Θ doit avoir le même ordre de croissance. La preuve formelle doit
montrer que Θ( ( )) Θ( ( )) et Θ( ( )) Θ( ( )) Soit ( )
Θ( ( )); nous allons montrer que ( ) Θ( ( )) En effet,

( )≤ ( ) pour tout ≥ 0 (où 0)

peut être réécrit comme

( )≤ 1 ( ) pour tout ≥ 0 (où 1= 0),

c'est­à­dire, ( ) Θ( ( ))

Soit maintenant ( ) Θ( ( )); nous allons montrer que ( ) Θ( ( )) pour 0


En effet, si ( ) Θ( ( ))

( )≤ ( ) pour tout ≥ 0 (où 0)

et donc

( )≤ ( )= 1 ( ) pour tout ≥ 0 (où 1= 0),

c'est­à­dire ( ) Θ( ( ))

c. L’affirmation est évidemment correcte (similaire à l’affirmation selon laquelle =


si et seulement si ≤ et ≥ ). La preuve formelle doit montrer que Θ( ( ))
( ( )) ∩ Ω( ( )) et que ( ( )) ∩ Ω( ( )) Θ( ( )) qui découlent
immédiatement des définitions de Ω, et Θ

d. L'affirmation est fausse. La paire de fonctions suivante peut servir de contre­


exemple

si est pair 2 si est pair


( )= et ( )=
2 si est impair si est impair

15
Machine Translated by Google

8. une. Nous devons prouver que si 1( ) Ω( 1( )) et 2( ) Ω( 2( )), alors


1( )+ 2( ) Ω(max{ 1( ) 2( )}).

Preuve Puisque 1( ) Ω( 1( )) il existe une constante positive 1 et un entier


non négatif 1 tel que

1( )≥ 1 1( ) pour tous ≥ 1

Puisque 2( ) Ω( 2( )) il existe une constante positive 2 et un entier non négatif


2 tel que

2( )≥ 2 2( ) pour tous ≥ 2

Notons = min{ 1 2} et considérons ≥ max{ 1 2} afin de pouvoir utiliser les


deux inégalités. L'addition des deux inégalités ci­dessus donne ce qui suit :

1( )+ 2( )≥ 1 1( )+ 2 2( )
≥ 1( )+ 2( )= [ 1( )+ 2( )]
≥ max{ 1( ) 2( )}

D'où 1( )+ 2( ) Ω(max{ 1( ) 2( )}), les constantes et 0 requises par


la définition étant min{ 1 2} et max{ 1 2} respectivement.

b. La preuve découle immédiatement du théorème prouvé dans le texte (la partie ), de


l'assertion prouvée dans la partie (a) de cet exercice (la partie Ω), et de la définition de Θ
(voir exercice 7c)

9. une. Puisque le temps d'exécution de la partie tri de l'algorithme dominera toujours le temps
d'exécution de la seconde, c'est la première qui déterminera l'efficacité temporelle de
l'ensemble de l'algorithme. Formellement, il découle de l'égalité

Θ( log )+ ( ) = Θ( log )

dont la validité est facile à prouver de la même manière que celle du théorème de section.

b. Puisque la deuxième partie de l’algorithme n’utilisera aucun espace supplémentaire, la


classe d’efficacité spatiale sera déterminée par celle de la première partie (de tri).
Ce sera donc Θ( )

10. une. Parcourez le tableau pour trouver les valeurs maximales et minimales parmi ses
éléments, puis calculez la différence entre elles. L'efficacité temporelle de l'algorithme est
Θ( ) Remarque : Bien que l'on puisse trouver à la fois les valeurs maximales et minimales
dans un tableau d'éléments avec environ 1,5 comparaisons

16
Machine Translated by Google

(voir les solutions au problème 5 dans les exercices 2.3 et au problème 2 dans les
exercices 5.1), cela ne change bien sûr pas la classe d'efficacité linéaire.

b. Pour un tableau trié, nous pouvons simplement calculer la différence entre son premier
et son dernier élément : [ − 1] − [0] La classe d'efficacité temporelle est
évidemment Θ(1)

c. Le plus petit élément se trouve dans le premier nœud de la liste et ses valeurs peuvent
donc être obtenues en temps constant. Le plus grand élément se trouve dans le dernier
nœud accessible uniquement par le parcours de la liste entière, ce qui nécessite un
temps linéaire. Le calcul de la différence entre les deux valeurs nécessite un temps
constant. Par conséquent, la classe d’efficacité temporelle est Θ( )

d. Le plus petit (le plus grand) élément d’un arbre de recherche binaire se trouve dans
le nœud le plus à gauche (le plus à droite). Pour l'atteindre, il faut commencer par la
racine et suivre la chaîne de pointeurs enfant gauche (enfant droit) jusqu'à ce qu'un nœud
avec le pointeur enfant gauche nul (enfant droit) soit atteint. Selon la structure de l'arbre,
cette chaîne de nœuds peut avoir une longueur comprise entre 1 et nœuds. Par
conséquent, le temps pour atteindre son dernier nœud sera en ( ) Le temps
d'exécution de l'ensemble de l'algorithme sera également linéaire : ( ) + ( ) + Θ(1) = ( )

11. Le puzzle peut être résolu en deux pesées comme suit. Commencez par mettre de côté
une pièce si est impair et deux pièces si est pair. Après cela, divisez le nombre pair
de pièces restant en deux groupes de taille égale et placez­les sur les plateaux opposés
de la balance. Si elles 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é. On peut donc comparer le groupe
réservé d'une ou deux pièces à un même nombre de pièces authentiques : si la première
pèse moins, la fausse pièce est plus légère, sinon elle est plus lourde. Si la première
pesée n'aboutit pas à une balance, prenez le groupe le plus léger et, si le nombre de
pièces qu'il contient est impair, ajoutez­y une des pièces initialement mises de côté (qui
doit être authentique). Divisez toutes ces pièces en deux groupes de taille égale et pesez­
les. Si elles pèsent le même poids, toutes ces pièces sont authentiques et donc la fausse
pièce est plus lourde ; sinon, 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
avec 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). Bien sûr, si nous avions
envisagé de mettre une pièce de monnaie sur la balance comme opération de base de
l'algorithme, l'efficacité de l'algorithme aurait été en Θ( ) au lieu de Θ(1)

12. L’idée clé ici est de marcher par intermittence à droite et à gauche en s’éloignant à chaque
fois de façon exponentielle 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 =0 1
faire 2 pas vers la droite, revenir à la position initiale, faire 2 pas vers la gauche, et
revenez à nouveau à la position initiale. Soit 2 −1 ≤2 Le

17
Machine Translated by Google

Le nombre d'étapes dont cet algorithme aura besoin pour trouver la porte peut être estimé ci­
dessus comme suit :

X−1 4 · 2 +3·2 = 4(2 − 1) + 3 · 2 7·2 = 14 · 2 −1 14


=0

Par conséquent, le nombre d'étapes effectuées par l'algorithme est en ( ) (Remarque :


il n'est pas difficile d'améliorer la constante multiplicative avec un meilleur algorithme.)

18
Machine Translated by Google

Exercices 2.3
1. Calculez les sommes suivantes.

un. 1+3+5+7+ ··· + 999

b. 2 + 4 + 8 + 16 + ··· + 1024

c. P +1=3 1 d. P +1=3 e. P −1=0 ( + 1)

F. P 3 +1 g. P =1 P h. P −1=0 1 ( + 1)
=1 =1

2. Trouvez l’ordre de croissance des sommes suivantes.

2
un. P −1
=0 ( 2 +1)2 b. P −1=2 LG

c. P =1( + 1)2 −1 d. P −1=0 P −1 =0( + )

Utilisez la notation Θ( ( )) avec la fonction ( ) la plus simple possible.

3. La variance d'échantillon de mesures 1 2 peut être calculée comme suit :

P =1( − ¯)2
où ¯= P =1
−1
ou
P =1 2 −(P =1 )2
−1
Trouvez et comparez le nombre de divisions, de multiplications et d'additions/soustractions
(les additions et les soustractions sont généralement regroupées) qui sont nécessaires
pour calculer la variance en fonction de chacun des éléments suivants.
ces formules.

4. Considérez l'algorithme suivant.

Mystère de l'algorithme ( )
//Entrée : Un entier non négatif
←0
pour ←1à faire
← +
retour

un. Que calcule cet algorithme ?

b. Quel est son fonctionnement de base ?

c. Combien de fois l’opération de base est­elle exécutée ?

19
Machine Translated by Google

d. Quelle est la classe d’efficacité de cet algorithme ?

e. Suggérez une amélioration, ou un meilleur algorithme, et indiquez sa classe d'efficacité. Si


vous n’y parvenez pas, essayez de prouver qu’en fait, cela n’est pas possible.

5. Considérez l'algorithme suivant.

Secret d'algorithme( [0 − 1])


//Entrée : Un tableau [0 − 1] de nombres réels
minval ← [0]; maxval ← [0] pour
←1à − 1 faire si [ ]
minval minval ←
[ ] si [ ]
maxval maxval ←
[ ] return
maxval − minval

Répondez aux questions a—e du problème 4 sur cet algorithme.

6. Considérez l'algorithme suivant.

Énigme de l'algorithme( [0 −1 0 − 1])


//Entrée : Une matrice [0 −1 0 − 1] de nombres réels
pour ←0à − 2 do pour
← +1à − 1 do si [
] 6= [ ]
renvoie faux
retourner vrai

Répondez aux questions a—e du problème 4 sur cet algorithme.

7. Améliorer la mise en œuvre de l'algorithme de multiplication matricielle (voir exemple 3) en


réduisant le nombre d'ajouts effectués par l'algorithme.
Quel effet ce changement aura­t­il sur l’efficacité de l’algorithme ?

8. Déterminez l'ordre asymptotique de croissance pour le nombre total de fois où toutes les portes
sont basculées dans le puzzle des portes de casier (problème 12 dans les exercices 1.1).

9. Prouvez la formule

( + 1)
X =1+2+ ··· + =2
=1

soit par induction mathématique, soit en suivant les idées d'un écolier de 10 ans nommé Karl
Friedrich Gauss (1777­1855) qui a grandi pour devenir l'un des plus grands mathématiciens de
tous les temps.

20
Machine Translated by Google

10. Calcul mental Un tableau 10×10 est rempli de nombres répétitifs sur ses diagonales, comme
indiqué ci­dessous. Calculez la somme totale des nombres du tableau dans votre 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.

Algorithme GE( [0.. −1 0 ])


//Entrée : Une matrice ×( + 1) [0 −1 0 ] de nombres réels pour
←0à − 2 do pour
← +1à − 1 do pour ←
à faire [ ]
← [ ]− [ ] [ ] [ ]
retour

aB Trouvez la classe d'efficacité temporelle de cet algorithme.

bB Quelle inefficacité flagrante ce pseudocode contient­il et comment peut­il être éliminé


pour accélérer l’algorithme ?

12. Le quartier de von Neumann Combien de carrés un par un sont générés par l'algorithme
qui commence par un seul carré carré et à chacune de ses itérations ajoute de nouveaux
carrés tout autour de l'extérieur. Combien de carrés un par un sont générés à la ème
itération ? [Gar99] (Dans le langage de la théorie des automates cellulaires, la réponse est
le nombre de cellules dans le voisinage de von Neumann de plage .) Les résultats pour
= 0, 1 et

21
Machine Translated by Google

2 sont illustrés ci­dessous.

=0 =1 =2

13. Numérotation des pages Trouvez le nombre total de chiffres décimaux nécessaires pour
numéroter les pages dans un livre de 1 000 pages. Supposons que les pages soient
numérotées consécutivement en commençant par 1.

22
Machine Translated by Google

Conseils pour les exercices 2.3

1. Utilisez les formules et règles de sommation courantes répertoriées à l’annexe A. Vous devrez
peut­être effectuer quelques opérations algébriques simples avant de les appliquer.

2. Trouvez une somme parmi celles de l'annexe A qui ressemble à la somme en question et
essayez de transformer cette dernière en première. Notez qu’il n’est pas nécessaire d’obtenir
une formule fermée pour une somme avant d’établir son ordre de croissance.

3. Suivez simplement les formules en question.

4. une. Tracer l'algorithme pour obtenir sa sortie pour quelques petites valeurs de (par exemple,
=1 2 et 3) devraient vous aider si vous en avez besoin.

b. Nous avons été confrontés à la même question pour les exemples évoqués dans le texte.
L’un d’eux est particulièrement pertinent ici.

c. Suivez le plan décrit dans la section.

d. En fonction de , la réponse doit découler immédiatement de votre réponse à la partie (c).


Vous pouvez également vouloir donner une réponse en fonction du nombre de bits dans la
représentation de (pourquoi ?).

e. N'avez­vous pas rencontré cette somme quelque part ?

5. une. Tracer l'algorithme pour obtenir sa sortie pour quelques petites valeurs de (par exemple,
=1 2 et 3) devraient vous aider si vous en avez besoin.

b. Nous avons été confrontés à la même question pour les exemples discutés dans la section.
L’un d’eux est particulièrement pertinent ici.

c. Vous pouvez soit suivre le plan de la section en établissant et calculer une somme, soit
répondre directement à la question. (Essayez de faire les deux.)

d. Votre réponse découlera immédiatement de la réponse à la partie (c).

e. L’algorithme doit­il toujours faire deux comparaisons à chaque itération ? Cette idée peut
être développée davantage pour obtenir une amélioration plus significative que l’évidente :
essayez de le faire pour un tableau à quatre éléments, puis généralisez les informations. Mais
peut­on espérer trouver un algorithme avec une efficacité meilleure que linéaire ?

6. une. Les éléments [ ] et [ ] sont symétriques par rapport à la diagonale


principale de la matrice.

b. Il n'y a qu'un seul candidat ici.

23
Machine Translated by Google

c. Vous ne pouvez enquêter que sur le pire des cas.

d. Votre réponse découlera immédiatement de la réponse à la partie (c).

e. Comparez le problème résolu par l’algorithme avec la façon dont il le fait.

7. Le calcul d’une somme de nombres peut être effectué avec − 1 additions. Combien l'algorithme
fait­il en calculant chaque élément de la matrice du produit ?

8. Établissez une somme pour le nombre de fois où toutes les portes ont basculé et trouvez son ordre
asymptotique de croissance en utilisant certaines propriétés de l'annexe A.

9. Pour l'étape générale de la preuve par induction, utilisez la formule

X = X−1
+
=1 =1

Le jeune Gauss a calculé la somme 1+2+ ··· + 99 + 100 en remarquant qu'elle peut être calculée
comme la somme de 50 paires, chacune ayant la même somme.

10. Il existe au moins deux manières différentes de résoudre ce problème.


à partir d'une collection de questions d'entretien à Wall Street.

11. une. La constitution d'une somme ne devrait poser aucune difficulté. Cependant, l'utilisation des
formules et des règles de sommation standard nécessitera plus d'efforts que dans les exemples
précédents.

b. Optimisez la boucle la plus interne de l'algorithme.

12. Établissez une somme pour le nombre de carrés après itérations de l'algorithme
puis simplifiez­le pour obtenir une réponse sous forme fermée.

13. Pour dériver une formule exprimant le nombre total de chiffres en fonction du nombre de pages
où 1 ≤ ≤ 1000 , il est pratique de diviser le domaine de la fonction en plusieurs intervalles
naturels.

24
Machine Translated by Google

Solutions aux exercices 2.3


500 500 500
500 501
1. une. 1+3+5+7+ +999 = P. (2 ­1) = P. 2 ­ P. 1=2 2 ­500 = 250 000
=1 =1 =1
500
(Ou en utilisant la formule de la somme des entiers impairs : P. (2 ­1) = 5002 =
=1
250 000
Ou en utilisant la formule de la somme de la progression arithmétique avec
1=1 = 999 et = 500 : ( 1+ ) = (1+999)500 = 250 000 )
2 2

dix dix

b. 2 + 4 + 8 + 16 + +1 024 = P 2 =P 2 −1 = (211 −1)−1=2 046


=1 =0

(Ou en utilisant la formule de la somme des séries géométriques avec =2


210−1
= 2, et =9: +1−1 =2 =2 046 )
−1 2−1

+1
c. P 1=( + 1) − 3+1= −1
=3
+1 +1 2
=
( +1)( +2) −3= 2+3 −4
d. P = P −P 2 2
=3 =0 =0

2 2
= ( −1) 6(2 −1) ( −1)
e. P−1 ( + 1) = P−1 ( + )= P−1 + P−1 2 +
=0 =0 =0 =0

= ( 2−1)
3

3 +1−1 3 +2−9
F. P 3 +1 = 3 P 3 = 3[P 3 − 1] = 3[ 3−1 2 − 1] =
=1 =1 =0

( +1) = ( +1) =
( +1) ( +1)
g. P P =P P =P 2 2 P 2 2
=1 =1 =1 =1 =1 =1

= 2( +1)2
4

1 − 1
h. P =1 1 ( + 1) = P =1( +1 )
1 − 1 1 − 1 1 − 1 1 − 1 1 =
= ( )=1
1 )+(s’agit
−2(Il 2 d’un
3 ) +cas particulier
+ ( −1 de )+(
la série dite+1 +1 +1
télescopique – voir Annexe
A–P = ( − −1) = − −1.)

2 4 2
2. une. P−1 ( + 1)2 = P−1( +2 + 1) = P−1 4 +2 P−1 2 + P−1 1
=0 =0 =0 =0 =0

2 4
Θ( 5) + Θ( 3) + Θ( ) = Θ( 5) (ou simplement P−1 ( + 1)2 ≈ P−1 Θ( 5))
=0 =0

2
b. P−1 log2 = P−1 2 log2 =2 P−1 log2 = 2 P log2 − 2 log2
=2 =2 =2 =1

2Θ( log ) − Θ(log ) = Θ( log )

25
Machine Translated by Google

c. P ( + 1)2 −1 = P 2 −1 + P 2 −1 = 1 P 2 + P−1 2
=1 =1 =1 2 =1 =0

Θ( 2 ) + Θ(2 ) = Θ( 2 ) (ou P ( + 1)2 −1 ≈ 1 P 2 Θ( 2 ))


=1 2 =1

2 ( −1) ) 2 − 1
d. P−1 P−1 ( + )= P−1 [ P−1 + P−1 ]= P−1 [ + 2 ]= P−1 [ 3
2 2 ]
=0 =0 =0 =0 =0 =0 =0

= 3 2 −
2 P−1 12 P−1 Θ( 3) − Θ( 2) = Θ( 3)
=0 =0

3. Pour la première formule : ( )=2 ( )= ( )+ ( ) = [( − 1) +


( − 1)] + ( + 1) = 3 −1

Pour la deuxième formule : ( )=2 ( )= +1 ( )+ ( ) = [( − 1) + ( − 1)] +


2=2

4. une. Calcule ( )=P 2


=1

b. Multiplication (ou, si l'on suppose que la multiplication et l'addition prennent le même temps,
l'une ou l'autre des deux).

c. ( )=P 1= .
=1

d. ( )= Θ( ) Puisque le nombre de bits = blog2 c + 1 ≈ log2 et donc ≈


2 ( )≈2 Θ(2 )

2 = ( +1)(2 +1)
e. Utilisez la formule P 6 calculer la somme dans Θ(1)
=1
time (qui suppose que le temps des opérations arithmétiques reste constant quelle que soit la
taille des opérandes des opérations).

5. une. Calcule la plage, c'est­à­dire la différence entre le plus grand et le plus grand du tableau.
les plus petits éléments.

b. Une comparaison d'éléments.

c. ( )= P−1 2 = 2( − 1).
=1

d. Θ( )

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 :

si [ ] minval minval ← [ ]

26
Machine Translated by Google

sinon si [ ] maxval maxval ← [ ]


Une autre amélioration, à la fois plus subtile et substantielle, repose sur le constat qu'il est plus
efficace de mettre à jour les valeurs minimales et maximales vues jusqu'à présent non pas pour
chaque élément mais pour une paire de deux éléments consécutifs. Si deux de ces éléments
sont d'abord comparés, les mises à jour ne nécessiteront que deux comparaisons supplémentaires,
pour un total de trois comparaisons par paire. Notez que la même amélioration peut être obtenue
par un algorithme diviser pour régner (voir le problème 2 dans les exercices 5.1).

6. une. L'algorithme renvoie « vrai » si sa matrice d'entrée est symétrique et


« faux » si ce n’est pas le cas.

b. Comparaison de deux éléments matriciels.

c. ( )= P−2 P−1 1= P−2 [( − 1) − ( + 1) + 1)


=0 = +1 =0

( −1)
= P−2 ( −1− )=( − 1) + ( − 2) + +1= 2
=0

d. Quadratique : ( ) Θ( 2) (ou ( ) ( 2))

e. L'algorithme est optimal car tout algorithme qui résout ce problème doit, dans le pire des cas,
comparer ( − 1) 2 éléments de la partie triangulaire supérieure de la matrice avec leurs
homologues symétriques de la partie triangulaire inférieure, c'est tout ce que fait cet algorithme.

7. Remplacez le corps de la boucle par le fragment suivant :

[ ]← [ 0] [0
] pour ←1à − 1 faire

[ ]← [ ]+ [ ] [ ]

Cela diminuera le nombre d'additions de 3à 3− 2, mais le nombre de multiplications sera


toujours de 3 La classe d'efficacité de l'algorithme restera cubique.

8. Soit ( ) le nombre total de fois où toutes les portes ont été basculées. L'énoncé du problème
implique que

( )=X b c
=1

Puisque −1 b c≤ et P =1 1 ≈ ln + , où =0 5772 ( voir

27
Machine Translated by Google

Annexe A),

( )≤X = X 1 ≈ (ln + ) Θ( log )


=1 =1

De la même manière,

( ) X ( − 1) = X 1 −X 1≈ (ln + )− Θ( log )
=1 =1 =1

Cela implique que ( ) Θ( log )

Remarque : Alternativement, nous pourrions utiliser la formule pour approximer les sommes
par intégrales définies (voir l'annexe A) :

1
( )≤X = (1+X )= (1+ln ) Θ( log )
=1 =21 )≤ (1+Z 1

et
+1
1
( ) X ( −1) = X 1 − − = ln( +1)− Θ( log )
=1 =1 X=1 1 ≥ Z 1

( +1)
9. Voici une preuve par induction mathématique que P = 2 pour chaque
=1

entier positif
1
1(1+1) =
= 1 et ( +1)2 = 1 2
(i) Étape de base : Pour =1 P =P
=1 =1 ¯¯¯ =1

( +1)
(ii) Étape inductive : Supposons que P = 2 pour un entier positif
=1
+1
( +1)( +2) =
Ceci est obtenu comme suit : 2
Nous devons montrer que alors P
=1
+1
( +1) ( +1)+2( +1) +( + 1) = + ( + 1) = ( +1)( +2) 2
=
P =P 22
=1 =1

Le jeune Gauss calcula la somme

1+2+ ··· + 99 + 100

en remarquant qu'il peut être calculé comme la somme de 50 paires, chacune avec la
somme 101 :
1 + 100 = 2 + 99 = = 50 + 51 = 101
La somme totale est donc égale à 50·101 = 5 050 (L'anecdote historique bien connue
prétend que son professeur a confié cette tâche à une classe pour garder

28
Machine Translated by Google

la classe occupée.) L’idée de Gauss peut être facilement généralisée à un


arbitraire en ajoutant
( )=1+2+ ··· + ( − 1) +
et
( )= +( − 1) + ··· +2+1
obtenir

( +
1) 2 ( )=( + 1) et donc ( )=2

10. Le but ici est de calculer (dans sa tête) la somme des nombres du 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 quelconques dans les carrés symétriques par rapport à la diagonale
reliant les coins inférieur gauche et supérieur droit est égale à 20 : 1+19, 2+18,
2+18. , et ainsi de suite. Ainsi, 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 de 55 + 10 puisque chacun des
nombres est plus grand de 1 que ses homologues de la rangée ci­dessus. Il en
va de même pour toutes les autres lignes. La somme totale est donc égale à 55
+ (55+10) + (55+20) + ...+ (55+90) = 55·10 + (10+20+...+90) =

29
Machine Translated by Google

55·10 + 10·(1+2+...+9) = 55·10 + 10·45 =1000.

Notez que la première méthode utilise la même astuce que Carl Gauss a probablement
utilisée pour trouver la somme des cent premiers nombres entiers (problème 9 des
exercices 2.3). Nous avons également utilisé cette formule (deux fois, en fait) dans la
deuxième solution du problème.

11. une. Le nombre de multiplications ( ) et le nombre de divisions ( )


réalisés par l'algorithme sont donnés par la même somme :

( )= ( )= X−2 X−1 X 1= X−2 X−1 ( − + 1) =


=0 = +1 = =0 = +1

= ( − + 1)( −1−( + 1) + 1) = ( − + 1)( − − 1)


X−2 X−2
=0 =0

=( + 1)( − 1) + ( − 2) + +3 1

= ( − 1) (2 − 1)
X−1 ( + 2) = X−1 2+ X−1 2 + 2( − 1)
=6 2
=1 =1 =1

( − 1)(2 + 5) 1
= ≈ 3 Θ( 3)
6 3

b. L'inefficacité est l'évaluation répétée du rapport [ ] [ ] dans la


boucle la plus interne de l'algorithme, qui, en fait, ne change pas avec la variable de
boucle . Par conséquent, cet invariant de boucle peut être calculé juste une fois avant
d'entrer dans cette boucle : ← [ ] [ ] ; la boucle la plus
interne est alors modifiée en

[ ]← [ ]− [ ]

Ce changement élimine l’opération la plus coûteuse de l’algorithme, la division, de sa


boucle la plus interne. Le gain de temps de fonctionnement obtenu par ce changement
peut être estimé comme suit :
1
( ) 1 3 3+ 3 3 = +
≈ = +1
( ) 1 3 3

où et sont respectivement le temps nécessaire pour une division et une


multiplication.

12. La réponse peut être obtenue par une simple évaluation de la somme

2X _ (2 − 1) + (2 + 1) = 2 2+2 +1
=1

30
Machine Translated by Google

(On peut également obtenir la réponse sous forme fermée en notant que les cellules
sur les diagonales alternées du quartier de von Neumann de portée composent deux
carrés de tailles + 1 et , respectivement.)

13. Soit ( ) le nombre total de chiffres décimaux dans les premiers entiers positifs
(pages du livre). Les neuf premiers nombres sont à un chiffre, donc ( ) = pour 1 ≤
≤ 9 Les 90 nombres suivants de 10 à 99 inclus sont à deux chiffres. Ainsi

( ) = 9 + 2( − 9) pour 10 ≤ ≤ 99

La valeur maximale de ( ) pour cette plage est (99) = 189 De plus, il existe 900
décimales à trois chiffres, ce qui conduit à la formule

( ) = 189 + 3( − 99) pour 100 ≤ ≤ 999

La valeur maximale de ( ) pour cette plage est (999) = 2889 En ajoutant quatre
chiffres pour la page 1000, nous obtenons (1000) = 2893

31
Machine Translated by Google

Exercices 2.4
1. Résolvez les relations de récurrence suivantes.

un. ( )= ( − 1) + 5 pour 1 (1) = 0

b. ( )=3 ( − 1) pour 1 (1) = 4

c. ( )= ( − 1) + pour 0 (0) = 0

d. ( )= ( 2) + pour 1 (1) = 1 (résoudre pour =2 )

e. ( )= ( 3) + 1 pour 1 (1) = 1 (résoudre pour =3 )

2. Établir et résoudre une relation de récurrence pour le nombre d'appels effectués par
F( ) l'algorithme récursif de calcul !

3. Considérons l'algorithme récursif suivant pour calculer la somme des


premiers cubes : ( )=13 + 23 + ··· + 3

Algorithme ( )
//Entrée : Un entier positif
//Sortie : La somme des premiers cubes si
= 1 renvoie 1
sinon renvoie ( − 1) +

un. Configurez et résolvez une relation de récurrence pour le nombre de fois que
l'opération de base de l'algorithme est exécutée.

b. Comment cet algorithme se compare­t­il à l'algorithme non récursif simple pour


calculer cette fonction ?

4. Considérez l'algorithme récursif suivant.

Algorithme ( )
//Entrée : Un entier positif si
= 1 renvoie 1 sinon
renvoie ( − 1) + 2 −1

un. Définissez une relation de récurrence pour les valeurs de cette fonction et résolvez­
la pour déterminer ce que cet algorithme calcule.

b. Établissez une relation de récurrence pour le nombre de multiplications effectuées


par cet algorithme et résolvez­la.

c. Établissez une relation de récurrence pour le nombre d'additions/soustractions


effectuées par cet algorithme et résolvez­la.

32
Machine Translated by Google

5. Tour de Hanoï a. Dans la version originale du puzzle de la Tour de Hanoï, telle qu'elle a
été publiée par Edouard Lucas, un mathématicien français, dans les années 1890, la fin
du monde se produira après que 64 disques auront été retirés d'une tour mystique de
Brahma. Estimez le nombre d’années qu’il faudrait si les moines pouvaient déplacer un
disque par minute. (Supposons que les moines ne mangent pas, ne dorment pas et ne meurent pas.)

b. Combien de mouvements le ième plus grand disque (1 ≤ ≤ ) effectue­t­il des mouvements


dans cet algorithme ?

c. Trouvez un algorithme non récursif pour le puzzle de la Tour de Hanoï et implémentez­


le dans la langue de votre choix.

6. B Tour restreinte de Hanoï Considérons la version du puzzle de la Tour de Hanoï dans


laquelle disques doivent être déplacés du piquet A au piquet C à l'aide du piquet B de
sorte que tout mouvement devrait soit placer un disque sur le piquet B, soit déplacer un
disque de cette cheville. (Bien sûr, l'interdiction de placer un disque plus grand sur un
disque plus petit reste également en vigueur.) Concevez un algorithme récursif pour ce
problème et trouvez le nombre de mouvements effectués par celui­ci.

7. B une. Montrer que le nombre exact d'ajouts effectués par l'algorithme récursif BinRec( )
pour un entier positif arbitraire est blog2 c

b. Établissez une relation de récurrence pour le nombre d'ajouts effectués par la version
non récursive de cet algorithme (voir Section 2.3, Exemple 4) et résolvez­la.

8. une. Concevoir un algorithme récursif pour calculer 2 pour tout entier non négatif basé
sur la formule : 2 = 2 −1 + 2 −1

b. Établissez une relation de récurrence pour le nombre d'ajouts effectués par l'algorithme
et résolvez­la.

c. Dessinez un arbre d'appels récursifs pour cet algorithme et comptez le nombre d'appels
effectués par l'algorithme.

d. Est­ce un bon algorithme pour résoudre ce problème ?

9. Considérez l'algorithme récursif suivant.

Énigme d'algorithme( [0 − 1])


//Entrée : Un tableau [0 − 1] de nombres réels
si = 1 renvoie [0]
sinon temp ← Riddle( [0 − 2])
si temp ≤ [ − 1] retourner temp sinon
retourner [ − 1]

un. Que calcule cet algorithme ?

33
Machine Translated by Google

b. Définissez une relation de récurrence pour le nombre d'opérations de base de l'algorithme et


résolvez­la.

10. Considérez l'algorithme suivant pour vérifier si un graphe défini par sa matrice de contiguïté est
complet.

Algorithme GraphiqueComplet( [0 −1 0 − 1])

//Entrée : Matrice d'adjacence [0 −1 0 − 1]) d'un graphe non orienté avec


≥ 1 sommets
//Sortie : 1 (vrai) si est complet et 0 (faux) sinon si = 1 renvoie 1 //Le
graphe à un sommet est complet par définition sinon GraphComplete( [0 −
2
0 − 2]) renvoie 0 sinon pour ←0à − 2 fais

si [ −1 ]=0 renvoyer 0
renvoyer 1

Quelle est la classe d’efficacité de l’algorithme dans le pire des cas ?

11. Le déterminant d'une matrice ×

00 0 −1
10 1 −1
= .
.
.
−1 0 −1 −1

noté det peut être défini comme 00 pour = 1 et, pour 1 par la formule
récursive

det = 0 det
X−1
=0

où vaut +1 si est pair et −1 si est impair, 0 et la est l'élément de la ligne 0


colonne , et est la matrice ( −1)×( −1) obtenue à partir de la matrice en supprimant
sa ligne 0 et colonne .

aB Etablir une relation de récurrence pour le nombre de multiplications effectuées par


l'algorithme implémentant cette définition récursive.

bB Sans résoudre la récurrence, que dire de l'ordre de croissance de la solution par rapport
à !?

12. Le quartier de von Neumann revisité Trouvez le nombre de cellules dans le quartier de von
Neumann d'intervalle (Problème 12 des exercices 2.3) en établissant et en résolvant une
relation de récurrence.

34
Machine Translated by Google

13. Faire frire des hamburgers Il existe hamburgers à frire sur une petite grille pouvant
contenir seulement 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, que l'on fasse frire un ou
deux hamburgers en même temps.
Considérez l'algorithme récursif suivant pour exécuter cette tâche. Si ≤ 2 faites
frire le hamburger (ou les deux hamburgers ensemble si = 2) de chaque côté. Si
2 faites frire deux hamburgers ensemble de chaque côté, puis faites frire les −
2 hamburgers restants selon le même algorithme.

un. Configurez et résolvez la récurrence du temps nécessaire à cet algorithme pour


faire frire hamburgers.

b. Expliquez pourquoi cet algorithme ne fait pas frire les hamburgers dans le temps
minimum pour tous 0.

c. Donnez un algorithme récursif correct qui exécute la tâche dans le temps minimum
pour tout 0 et trouvez une formule fermée pour le temps minimum.

14. B Problème de célébrité Une célébrité parmi un groupe de personnes est une
personne qui ne connaît personne mais qui est connue de tous les autres. La tâche
consiste à identifier une célébrité en posant uniquement des questions aux personnes
du type : « Le connaissez­vous ? » Concevez un algorithme efficace pour identifier une
célébrité ou déterminer que le groupe ne possède pas une telle personne. De combien
de questions votre algorithme a­t­il besoin dans le pire des cas ? [Homme89]

35
Machine Translated by Google

Conseils pour les exercices 2.4

1. Chacune de ces récurrences peut être résolue par la méthode des sous­récurrences rétrospectives.
institutions.

2. La relation de récurrence en question est presque identique à la relation de récurrence pour


le nombre de multiplications, qui a été établie et résolue dans la section.

3. une. La question est similaire à celle de l’efficacité de la méthode récursive.


algorithme de calcul !

b. Écrivez un pseudocode pour l'algorithme non récursif et déterminez son efficacité.

4. une. Notez qu'il vous est demandé ici une récurrence pour les valeurs de la fonction, et non
une récurrence pour le nombre de fois que son opération est exécutée. Suivez simplement
le pseudocode pour le configurer. Il est plus facile de résoudre cette récurrence par des
substitutions directes (voir Annexe B).

b. Cette question est très similaire à celle dont nous avons déjà discuté.

c. Vous souhaiterez peut­être inclure la soustraction nécessaire pour diminuer

5. une. Utilisez la formule pour le nombre de mouvements de disque dérivée dans la section.

b. Résolvez le problème de 3 disques pour étudier le nombre de mouvements effectués par


chacun des disques. Généralisez ensuite les observations et prouvez leur validité pour le
cas général des disques .

6. L'algorithme requis et la méthode de son analyse sont similaires à ceux de la version classique
du puzzle. En raison de la contrainte supplémentaire, plus de deux instances plus petites du
puzzle doivent être résolues ici.

7. une. Considérons séparément les cas de valeurs paires et impaires de et montrons que
pour les deux blog2 c satisfait la relation de récurrence et sa condition initiale.

b. Suivez simplement le pseudocode de l'algorithme.

8. une. Utilisez la formule 2 =2 −1 + 2 −1 sans la simplifier ; n'oubliez pas de prévoir une


condition d'arrêt de vos appels récursifs.

b. Un algorithme similaire a été étudié à la section 2.4.

c. Une question similaire a été étudiée à la section 2.4.

d. Une mauvaise classe d’efficacité d’un algorithme ne signifie pas en soi que

36
Machine Translated by Google

l'algorithme est mauvais. Par exemple, l’algorithme classique du puzzle de la Tour de Hanoï est
optimal malgré son efficacité en temps exponentiel. Par conséquent, une affirmation selon
laquelle un algorithme particulier n’est pas bon nécessite une référence à un meilleur.

9. une. Tracer l'algorithme pour = 1 et = 2 devrait aider.

b. Il est très similaire à l’un des exemples discutés dans la section.

10. Obtenez le nombre d'opérations de base soit en résolvant une relation de récurrence, soit en
calculant directement le nombre d'éléments de la matrice de contiguïté que l'algorithme vérifie
dans le pire des cas.

11. une. Utilisez la formule de la définition pour obtenir la relation de récurrence du nombre de
multiplications effectuées par l'algorithme.

b. Étudiez le côté droit de la relation de récurrence. Le calcul des premières valeurs de ( )


peut également être utile.

12. Vous pourriez utiliser la symétrie du quartier pour obtenir une formule simple pour le nombre de
carrés ajoutés au quartier à la ième itération de 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
Machine Translated by Google

Solutions aux exercices 2.4


1. une. ( )= ( − 1) + 5 pour 1 (1) = 0

( )= ( − 1) + 5 =
[ ( − 2) + 5] + 5 = ( − 2) + 5 · 2 = [ (
− 3) + 5] + 5 · 2 = ( − 3) + 5 · 3
=

= ( − )+5 ·
=

= (1) + 5 · ( − 1) = 5( − 1)

Remarque : La solution peut également être obtenue en utilisant la formule du terme


de la progression arithmétique :

( )= (1) + ( − 1) = 0 + 5( − 1) = 5( − 1)

b. ( )=3 ( − 1) pour 1 (1) = 4

( )=3 ( − 1) =
3[3 ( − 2)] = 32 ( − 2) =
32[3 ( − 3)] = 33 ( − 3)
=

=3 ( − )
=

=3 −1 (1) = 4 · 3 −1

Remarque : La solution peut également être obtenue en utilisant la formule du terme


de la progression géométrique :

( )= (1) −1 = 4 · 3 −1

c. ( )= ( − 1) + pour 0 (0) = 0

( )= ( − 1) + =
[ ( − 2) + ( − 1)] + = ( − 2) + ( − 1) + =[ ( −
3) + ( − 2)] + ( − 1) + = ( − 3) + ( − 2) + ( − 1) +
=

= ( − )+( − + 1) + ( − + 2) + ··· +
=
( + 1)
= (0) + 1 + 2 + ··· + =
2

38
Machine Translated by Google

d. ( )= ( 2) + pour 1 (1) = 1 (résoudre pour =2 )

(2 )= (2 −1)+2 =
[ (2 −2)+2 −1]+2 = (2 −2)+2 −1 + 2 =
[ (2 −3)+2 −2]+2 −1 + 2 = (2 −3)+2 −2 + 2 −1 + 2
=
= (2 − )+2 − +1 + 2 − +2 + ··· + 2
=

= (2 − )+21 + 22 + ··· + 2 =1+21 + 22 + ··· + 2 =2 +1 −


1=2 · 2 − 1=2 − 1

e. ( )= ( 3) + 1 pour 1 (1) = 1 (résoudre pour =3 )

(3 )= (3 −1)+1 =
[ (3 −2) + 1] + 1 = (3 −2)+2 =
[ (3 −3) + 1 ] + 2 = (3 −3)+3
=

= (3 − )+
=

= (3 − )+ = (1) + = 1 + log3

2. ( )= ( − 1) + 1 (0) = 1 (il y a un appel mais pas de multiplications


quand = 0)

( )= ( − 1) + 1 = [ ( − 2) + 1] + 1 = ( − 2) + 2 = = ( −
)+ = = (0) + =1+

3. une. Soit ( ) le nombre de multiplications effectuées par l'algorithme.


On a pour cela la relation de récurrence suivante :

( )= ( − 1) + 2 (1) = 0

39
Machine Translated by Google

Nous pouvons le résoudre par des substitutions vers l'arrière :

( )= ( − 1) + 2 = [ (
− 2) + 2] + 2 = ( − 2) + 2 + 2 = [ ( − 3) + 2] +
2+2= ( − 3) + 2 + 2 + 2
=

= ( − )+2
=

= (1) + 2( − 1) = 2( − 1)

b. Voici un pseudocode pour l'option non récursive :

Algorithme NonrecS( )
//Calcule la somme des premiers cubes de manière non récursive //
Entrée : Un entier positif
//Sortie : La somme des premiers cubes. ←
1 pour
← 2 pour faire
← +
retour

Le nombre de multiplications effectuées par cet algorithme sera

X 2=2X 1 = 2( − 1)
=2 =2

Il s'agit exactement du même nombre que dans la version récursive, mais la version non
récursive ne supporte pas la surcharge de temps et d'espace associée à la pile de récursion.

4. une. ( )= ( − 1) + 2 − 1 pour 1 (1) = 1

Le calcul des premiers termes de la séquence donne ce qui suit : (2) = (1) + 2
· 2 − 1=1+2 · 2 − 1 = 4 ; (3) = (2) + 2 · 3 − 1=4+2
· 3 − 1 = 9; (4) = (3) + 2 · 4 − 1=9+2 · 4 − 1 = 16

Il apparaît donc que ( ) = 2 Nous allons vérifier cette hypothèse en substituant


cette formule dans l'équation de récurrence et la condition initiale.
Le membre de gauche donne ( )= 2 Le membre de droite donne

( − 1) + 2 − 1=( − 1)2 + 2 −1= 2

40
Machine Translated by Google

La condition initiale est vérifiée immédiatement : (1) = 12 = 1

b. ( ) = ( − 1) + 1 pour 1 (1) = 0 Le résoudre par des substitutions


vers l'arrière (c'est presque identique à l'exemple factoriel – voir l'exemple 1 dans la
section) ou en appliquant la la formule du ème terme d'une progression
arithmétique donne ( ) = −1

c. Soit ( ) le nombre d'additions et de soustractions effectuées par l'algorithme. La


récurrence pour ( ) est ( ) = ( − 1) + 3 pour 1 (1) = 0 Résoudre
par substitutions inverses ou en appliquant la formule du ème terme d'un la
progression arithmétique donne ( ) = 3( − 1)

Remarque : Si nous n'incluons pas dans le décompte les soustractions nécessaires


pour diminuer , la récurrence sera ( )= ( − 1) + 2 pour 1 (1) = 0
Sa solution est ( ) = 2( − 1)

5. une. Le nombre de coups est donné par la formule : ( )=2 −1 Donc

264 − 1
≈3 5 · 1013 ans
60 · 24 · 365

contre l'âge de l'Univers estimé à environ 13 · 109 ans.

b. Observez qu'à chaque mouvement du ème disque, l'algorithme déplace d'abord


la tour de tous les disques plus petits que lui vers un autre pion (cela nécessite un
déplacement du ( + 1)er disque) puis, après le déplacement du ème disque, cette
tour plus petite est déplacée au sommet de celui­ci (cela nécessite à nouveau un
déplacement du ( + 1)er disque). Ainsi, à chaque déplacement du ème disque,
l’algorithme déplace le ( + 1)er disque exactement deux fois. Puisque pour = 1,
le nombre de coups est égal à 1, on a la récurrence suivante pour le nombre de coups
effectués par le ème disque :

( + 1) = 2 ( ) pour 1 ≤ (1) = 1

Sa solution est ( )=2 −1 pour =1 2 (La façon la plus


simple d'obtenir cette formule est d'utiliser la formule du terme générique d'une
progression géométrique.) Notez que la réponse s'accorde bien avec la formule du
nombre total de coups :

( )=X ( )=X 2 −1 =1+2+ ··· + 2 −1 = 2 −1


=1 =1

6. Si =1 déplacez le disque unique du piquet A d'abord au piquet B, puis du


le pion B au pion C. Si 1 , procédez comme suit :
transférez récursivement les disques − 1 supérieurs du pion A au pion C en passant par le pion
B

41
Machine Translated by Google

déplacer le disque de la cheville A à la cheville B


transférer récursivement − 1 disques de la cheville C à la cheville A en passant par la cheville B
déplacer le disque de la cheville B à la cheville C
transférer de manière récursive − 1 disques de la cheville A à la cheville C en passant par la cheville B.

La relation de récurrence pour le nombre de mouvements ( ) est

( )=3 ( − 1) + 2 pour 1 (1) = 2

Il peut être résolu par des substitutions vers l'arrière comme suit

( )=3 ( − 1) + 2 = 3[3 (
− 2) + 2] + 2 = 32 ( − 2) + 3 · 2+2 = 32[3 ( − 3) + 2] + 3 ·
2+2=33 ( − 3) + 32 · 2+3 · 2+2
=

=3 ( − ) + 2(3 −1 + 3 −2 + ··· + 1) = 3 ( − )+3 −1


=

=3 −1 (1) + 3 −1 − 1=3 −1 · 2+3 −1 − 1=3 −1

7. une. On vérifiera par substitution que ( ) = blog2 c satisfait la récurrence


pour le nombre d'ajouts

( )= (b 2c)+1 pour chaque 1

Soit pair, c'est­à­dire =2


Le côté gauche est : ( )
= blog2 c = blog2 2 c = blog2 2 + log2 c = (1 + blog2 c) = blog2 c+1

Le membre de droite est :


(b 2c)+1= (b2 2c)+1= ( )+1= blog2 c+1

Soit impair, c'est­à­dire =2 +1


Le côté gauche est : ( )
= blog2 c = blog2(2 + 1)c = utilisant blog2 c = dlog2( + 1)e − 1 dlog2(2 + 2)e − 1 =
dlog2 2( + 1)e − 1 = dlog2 2 + log2( + 1)e −
1=1+ dlog2( + 1)e − 1 = blog2 c+1
Le membre de droite est :
(b 2c)+1= (b(2 + 1) 2c)+1= (b +1 2c)+1= ( )+1 = blog2 c+1

La condition initiale est vérifiée immédiatement : (1) = blog2 1c = 0

42
Machine Translated by Google

b. La relation de récurrence pour le nombre d'ajouts est identique à


celui de la version récursive :

( )= (b 2c)+1 pour 1 (1) = 0

avec la solution ( ) = blog2 c + 1.

8. une. Puissance de l'algorithme ( )


//Calcule 2 de manière récursive par la formule 2 =2 −1 + 2 −1
//Entrée : Un entier non négatif
//Sortie : renvoie 2
si = 0 renvoyer 1
sinon, retourne ( − 1) + ( − 1)

b. ( )=2 ( − 1) + 1 (0) = 0

( )=2 ( − 1) + 1

= 2[2 ( − 2) + 1] + 1 = 22 ( − 2) + 2 + 1

= 22[2 ( − 3) + 1] + 2 + 1 = 23 ( − 3) + 22 +2+1
=

=2 ( − )+2 −1 + 2 −2 + ··· + 1
=

=2 (0) + 2 −1 + 2 −2 + ··· +1=2 −1 + 2 −2 + ··· +1=2 −1

c. L'arbre des appels récursifs pour cet algorithme se présente comme suit :

n­1 n­1

n­2 n­2 n­2 n­2


... ... ...
1 1 1 1

0 0 0 0 0 0 0 0

A noter qu'il possède un niveau supplémentaire par rapport à l'arbre similaire de la Tour.
du puzzle de Hanoï.

d. C'est un très mauvais algorithme car il est largement inférieur à l'algorithme qui multiplie
simplement un accumulateur par 2 fois, sans parler
des algorithmes beaucoup plus efficaces discutés plus loin dans le livre. Même si seulement
les ajouts sont autorisés, ajouter deux fois 2 −1 est mieux que cet algorithme.

43
Machine Translated by Google

9. une. L'algorithme calcule la valeur du plus petit élément dans un élément donné
tableau.

b. La récurrence du nombre de comparaisons clés est

( )= ( − 1) + 1 pour 1 (1) = 0

Le résoudre par substitutions vers l’arrière donne ( )= −1

10. Soit ( ) le nombre de fois que l'élément de la matrice de contiguïté est vérifié dans
le pire des cas (le graphique est complet). On a la récurrence suivante pour ( )

( )= ( − 1) + − 1 pour 1 (1) = 0

La résolution de la récurrence par substitutions vers l'arrière donne ce qui suit :

( )= ( − 1) + −1=
[ ( − 2) + − 2] + −1=
[ ( − 3) + − 3] + −2+ −1
=

= ( − )+( − )+( − + 1) + ··· + ( − 1)


=

= (1) + 1 + 2 + ··· + ( − 1) = 0 + ( − 1) 2=( − 1) 2

Ce résultat pourrait également être obtenu directement en observant que dans le pire
des cas l’algorithme vérifie chaque élément situé en dessous de la diagonale principale
de la matrice de contiguïté d’un graphe donné.

11. une. Soit ( ) le nombre de multiplications effectuées par l'algorithme basé sur la formule
det =P −1 =0 0 det Sin'inclut pas les multiplications par
on , qui
sont juste ±1 alors

( )= X−1 ( ( − 1) + 1)
=0

c'est à dire,

( )= ( ( − 1) + 1) pour 1 et (1) = 0 b. Puisque

( )= ( − 1) + la suite ( ) croît vers l'infini au moins aussi vite que la


fonction factorielle définie par ( ) = ( − 1)

44
Machine Translated by Google

12. Le nombre de carrés ajoutés à la ème itération à chacun des quatre côtés
symétriques du quartier de von Neumann est égal à On obtient donc la
récurrence suivante pour ( ) le nombre total de carrés dans le quartier après la
ième itération :

( )= ( − 1) + 4 pour 0 et (0) = 1

La résolution de la récurrence par substitutions vers l'arrière donne ce qui suit :

( )= ( − 1) + 4 =
[ ( − 2) + 4( − 1)] + 4 = ( − 2) + 4( − 1) + 4 =[ (
− 3) + 4( − 2)] + 4( − 1) + 4 = ( − 3) + 4( − 2) + 4( − 1) + 4
=

= ( − ) + 4( − + 1) + 4( − + 2) + ··· + 4
=

= (0) + 4 · 1+4 · 2 + ··· + 4 = 1 + 4(1 + 2 + ··· + ) = 1+4 (


+ 1) 2=2 2+2 +1

13. une. Soit ( ) le nombre de minutes nécessaires pour faire frire hamburgers
selon l'algorithme donné. On a alors la récurrence suivante pour ( ):

( )= ( − 2) + 2 pour 2 (1) = 2 (2) = 2

Sa solution est ( ) = pour tout 0 pair et ( ) = + 1 pour tout


impair peut être obtenue soit par substitutions inverses, soit en appliquant la formule
du terme générique d'un progression arithmétique.

b. L'algorithme ne parvient pas à exécuter la tâche consistant à faire frire


hamburgers dans le temps minimum pour tout impair 1. En particulier, il faut
(3) = 4 minutes pour frire trois hamburgers, alors qu'on peut le faire en 3 minutes :
Faites d’abord frire les crêpes 1 et 2 d’un côté. Faites ensuite frire la crêpe 1 sur la
deuxième face avec la crêpe 3 sur sa première face. Enfin, faites frire les deux
crêpes 2 et 3 sur la deuxième face.

c. Si ≤ 2 faites frire le hamburger (ou les deux hamburgers ensemble si = 2)


de chaque côté. Si = 3 faites frire les crêpes en 3 minutes comme indiqué dans
la réponse à la question de la partie b. Si 3 faites frire deux hamburgers
ensemble de chaque côté, puis faites frire les − 2 hamburgers restants selon le
même algorithme. La récurrence du nombre de minutes nécessaires pour frire
hamburgers se présente désormais comme suit :

( )= ( − 2) + 2 pour 3 (1) = 2 (2) = 2 (3) = 3

Pour chaque 1 , cet algorithme nécessite minutes pour effectuer le travail.


C'est le temps minimum possible car les crêpes ont 2 faces à frire

45
Machine Translated by Google

et n'importe quel algorithme ne peut pas faire frire plus de deux côtés en une minute.
L’algorithme est également évidemment optimal pour le cas trivial où = 1 nécessite
deux minutes pour faire frire un seul hamburger des deux côtés.

Remarque : Le cas de = 3 est un casse­tête bien connu, qui remonte au moins à 1943.
Sa version algorithmique pour un arbitraire est incluse dans Al­gorithmic Puzzles de
A. Levitin et M. Levitin, Oxford University Press, 2011, problème 16.

14. Le problème peut être résolu par un algorithme récursif. En effet, en posant une seule
question, nous pouvons éliminer de 1 le nombre de personnes pouvant être une célébrité,
résoudre le problème pour le groupe restant de − 1 personnes de manière récursive,
puis vérifier la solution renvoyée en ne posant pas plus de deux questions. . Voici une
description plus détaillée de cet algorithme :

Si =1 , renvoyez cette personne comme une célébrité. Si 1 procéder comme


suit :

Étape 1 Sélectionnez deux personnes dans le groupe donné, disons A et B, et demandez à A si


A connaît B. Si A connaît B, supprimez A des personnes restantes qui peuvent être une
célébrité ; si A ne connaît pas B, supprimez B de ce groupe.

Étape 2 Résoudre le problème de manière récursive pour le groupe restant de − 1 personnes


qui peut être une célébrité.

Étape 3 Si la solution renvoyée à l'étape 2 indique qu'il n'y a aucune célébrité parmi le groupe
de − 1 personnes, le plus grand groupe de personnes ne peut pas non plus contenir
de célébrité. Si l'étape 2 a identifié comme célébrité une personne autre que A ou B, par
exemple C, demandez si C connaît la personne supprimée à l'étape 1 et, si la réponse
est non, si la personne supprimée à l'étape 1 connaît C. Si la personne supprimée à
l'étape 1 connaît C. "Si la réponse à la deuxième question est oui", renvoyez C comme
une célébrité et "pas de célébrité" dans le cas contraire. Si l'étape 2 a identifié B comme
une célébrité, demandez simplement si B connaît A : renvoyez B comme une célébrité si
la réponse est non et "non". "célébrité" sinon. Si l'étape 2 a identifié A comme une
célébrité, demandez si B connaît A : renvoyez A comme une célébrité si la réponse est
oui et "pas de célébrité" dans le cas contraire.

La récurrence pour ( ), le nombre de questions nécessaires dans le pire des cas, est la
suivante :

( )= ( − 1) + 3 pour 2 (2) = 2 (1) = 0

Sa solution est ( ) = 2 + 3( − 2) pour 1 et (1) = 0

Remarque : Une discussion de ce problème, y compris une implémentation de cet


algorithme dans un pseudocode de type Pascal, peut être trouvée dans Introduction aux
algorithmes : une approche créative d'Udi Manber. Addison­Wesley, 1989.

46
Machine Translated by Google

Exercices 2.5
1. Trouvez un site Web dédié aux applications des nombres de Fibonacci et
étudiez­le.

2. Le problème des lapins de Fibonacci Un homme a placé deux lapins dans un endroit
entouré d'un mur. Combien de couples de lapins y aura­t­il dans une année si le premier
couple de lapins (mâle et femelle) est un nouveau­né et que tous les couples de lapins ne
sont pas fertiles pendant leur premier mois de vie mais donnent ensuite naissance à un
nouveau couple mâle/femelle à la fin de chaque mois ?

3. Monter les escaliers Trouvez le nombre de façons différentes de monter un escalier à si


chaque marche est un ou deux escaliers. Par exemple, un escalier à 3 marches peut être
monté de trois manières : 1­1­1, 1­2 et 2­1.

4. Combien y a­t­il de nombres pairs parmi les premiers nombres de Fibonacci ?


Donner une formule fermée valable pour chaque 0

1 5. Vérifier par substitutions directes que la fonction √ ( − ˆ ) satisfait en effet


5
récurrence (2.6) et les conditions initiales (2.7).

6. Les valeurs maximales des types primitifs Java int et long sont respectivement 231 −1 et
263 −1. Trouvez le plus petit pour lequel le ème nombre de Fibonacci ne tiendra pas
dans une mémoire allouée pour a. le type int. b. le type long.

7. Considérons l'algorithme récursif basé sur une définition pour calculer le ème nombre de
Fibonacci ( ). Soit ( ) et ( ) le nombre de fois que (1) et (0) sont
respectivement calculés. Prouver que a. ( )= ( ) b.
( )= ( − 1)

8. Améliorer l'algorithme du texte afin qu'il ne nécessite que l'espace Θ(1).

9. Prouver l'égalité

· ( (− 1)+ 1)( ¸ =) · 0( 1 1
) 1¸ pour ≥1

10. B Combien de divisions modulo l'algorithme d'Euclide effectue­t­il sur deux nombres de
Fibonacci consécutifs ( ) et ( − 1) comme entrée de l'algorithme ?

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 carrés
dont pas plus de deux carrés sont de la même taille. Quelle est la classe d’efficacité
temporelle de votre algorithme ?

47
Machine Translated by Google

12. Dans le langage de votre choix, implémentez deux algorithmes pour calculer les
cinq derniers chiffres du ème nombre de Fibonacci qui sont basés sur (a)
l'algorithme récursif basé sur la définition F(n) ; (b) l'algorithme itératif basé sur la
définition Fib(n). Réalisez une expérience pour trouver la plus grande valeur de
pour laquelle vos programmes s'exécutent en moins d'une minute sur votre ordinateur.

48
Machine Translated by Google

Conseils pour les exercices 2.5

1. Utilisez un moteur de recherche.

2. Établissez une équation exprimant le nombre de lapins après mois dans


en termes de nombre de lapins au cours de certains mois précédents.

3. Il existe plusieurs façons de résoudre ce problème. Le plus élégant d'entre eux


permet de poser le problème dans cette section.

4. Écrire les dix premiers nombres de Fibonacci, disons, crée le modèle


évident.

5. Il est plus facile de remplacer et ˆ séparément dans l'équation de récurrence


Pourquoi cela suffira­t­il ?

6. Utilisez une formule approximative pour ( ) pour trouver les plus petites valeurs de à
dépasser les chiffres donnés.

7. Établissez les relations de récurrence pour ( ) et ( ) avec des conditions initiales


appropriées, 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. Modifiez l'algorithme pour profiter de ce
fait.

9. Prouvez­le par induction mathématique.

10. Considérons d'abord un petit exemple tel que le calcul de pgcd(13 8).

11. Profitez de la nature particulière des dimensions du rectangle.

12. Les derniers chiffres d'un entier peuvent être obtenus en calculant mod 10
Effectuer toutes les opérations de vos algorithmes modulo 10 (voir annexe A) vous
permettra de contourner la croissance exponentielle des nombres de Fibonacci. Notez
également que la section 2.6 est consacrée à une discussion générale de l’analyse
empirique des algorithmes.

49
Machine Translated by Google

Solutions aux exercices 2.5


1. n/a

2. Soit ( ) le nombre de couples de lapins à la fin du mois Clairement, (0) = 1 et


(1) = 1. Pour chaque 1, le nombre de couples de lapins, ( ), est égal au nombre
de couples à la fin du mois −1, ( −1), plus le nombre de couples de lapins nés à la
fin du mois , qui selon les hypothèses du problème est égal à ( − 2), le nombre de
couples de lapins à la fin du mois − 2. On a donc la relation de récurrence

( )= ( − 1) + ( − 2) pour 1 (0) = 1 (1) = 1

Le tableau suivant donne les valeurs des treize premiers termes de la séquence, appelés
nombres de Fibonacci, définis par cette relation de récurrence :

0 1 2 3 4 5 6 7 8 9 10 11 12 ( ) 1 1 2 3 5 8 13 21 34 55 89 144 233

Notez que ( ) diffère légèrement de la séquence canonique de Fibonacci, qui est définie
par la même équation de récurrence ( )= ( − 1) + ( −2) mais les conditions
initiales différentes, à savoir ( 0) = 0 et (1) = 1 Évidemment, ( )= ( + 1) pour
≥0

Remarque : Le problème a été inclus par Léonard de Pise (alias Fibonacci) dans son livre
de 1202 Liber Abaci, dans lequel il préconisait l'utilisation des chiffres hindous­arabes.

3. Soit ( ) le nombre de façons différentes de monter un escalier de type . ( −1)


d’entre eux commencent par une montée d’un escalier et ( −2) d’entre eux commencent
par une montée de deux marches. Ainsi,

( )= ( − 1) + ( − 2) pour ≥3 (1) = 1 (2) = 2

En résolvant cette récurrence soit « à partir de zéro », soit mieux encore en remarquant
que la solution a une longueur d'avance sur la séquence canonique de Fibonacci ( ),
nous obtenons ( )= ( + 1) pour ≥1

4. En commençant par (0) = 0 et (1) = 1 et la règle ( )= ( − 1) + ( − 2) pour


chaque élément suivant de la séquence, il est facile de voir que les nombres de Fibonacci
forment le modèle suivant

pair, impair, impair, pair, impair, impair, ...

Par conséquent, le nombre de nombres pairs parmi les premiers nombres de Fibonacci
peut être obtenu par la formule d 3e

50
Machine Translated by Google

5. En remplaçant dans le membre de gauche de l’équation, nous obtenons


( )− ( − 1) − ( − 2) = − −1 − −2 = −2( 2− − 1) = 0 car
est un des racines de l'équation caractéristique 2− − 1=0
La vérification de ˆ fonctionne pour la même raison. Puisque l'équation ( )− ( − 1)
− ( − 2) = 0 est homogène et linéaire, toute combinaison linéaire de ses solutions et
ˆ , c'est­à­dire toute séquence de la forme + ˆ sera aussi une solution de
( )− ( − 1) − ( − 2) = 0 En particulier, ce sera le cas pour la suite de Fibonacci
1
Les deux conditions initiales sont vérifiées de manière assez simple
√ 5 − √1 5 ˆ
(mais, bien sûr, pas individuellement pour et ˆ )

6. une. La question est de trouver la plus petite valeur de telle que ( ) 231−1
1
En utilisant la formule ( )=5
√ arrondie à l'entier le plus proche, on obtient
(approximativement) l'inégalité suivante :

1
231 − 1 ou √ 5(231 − 1) √5

Après avoir pris les logarithmes naturels des deux côtés, nous obtenons

ln(√5(231 − 1)) ln
≈ 46 3

La réponse est donc = 47

b. De même, nous devons trouver la plus petite valeur de telle que ( ) 263 − 1. Ainsi,

1
263 − 1 ou √ 5(263 − 1) √5

ou, après avoir pris les logarithmes naturels des deux côtés,

ln(√5(263 − 1)) ln
≈ 92 4

La réponse est donc = 93

7. Puisque ( ) est calculé de manière récursive par la formule ( )= ( − 1) + ( −


2) , les équations de récurrence pour ( ) et ( ) seront les mêmes que la récurrence
pour ( ). Les conditions initiales seront :

(0) = 0 (1) = 1 et (0) = 1 (1) = 0

pour ( ) et ( ) respectivement. Par conséquent, puisque l’équation de récurrence et


les conditions initiales pour ( ) et ( ) sont les mêmes, ( )=

51
Machine Translated by Google

( ) Quant à l’affirmation selon laquelle ( )= ( − 1) , il est facile de voir que


cela devrait être le cas puisque la séquence ( ) se présente comme suit :

1 0, 1, 1, 2, 3, 5, 8, 13, 21, ...,

c'est­à­dire que c'est la même chose que les nombres de Fibonacci décalés d'une position
vers la droite. Cela peut être formellement prouvé en vérifiant que la séquence ( −1)
(dans laquelle (−1) est défini comme 1) satisfait la relation de récurrence

( )= ( − 1) + ( − 2) pour 1 et (0) = 1 (1) = 0

Cela peut également être prouvé soit par récurrence mathématique, soit en dérivant une
formule explicite pour ( ) et en montrant que cette formule est la même que la valeur de
la formule explicite pour ( ) avec remplacé par −1

8. Algorithme Fib2( )
//Calcule le ­ième nombre de Fibonacci en utilisant seulement deux variables //
Entrée : un entier non négatif
//Sortie : Le ­ième nombre de Fibonacci ←
0; ← 1 pour
← 2 pour faire
← +
← −
si = 0 retourner 0
sinon retourner

9. (i) La validité de l'égalité pour = 1 découle immédiatement de la définition de la suite de


Fibonacci. (ii) Supposons que

− 1) + 1)
( ¸) = · (0 1) ( 11¸ pour un entier positif · (

Nous devons le montrer alors

( () +( 2) +¸ =1)· 0 1
( + 1) 11¸ +1 ·

En effet,

1 1111¸¸· +1
( = −· 01)1 1 (1 ¸ ) · (0 1) 1 1( ¸ ·+1
0 1) ¸= · 0

=· ( ) ( +1) ( +1) ( +2) ¸ .

52
Machine Translated by Google

10. La principale observation 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 consécutifs, à savoir :

pgcd( ( ) ( − 1)) = pgcd( ( − 1) ( − 2)) pour chaque ≥4

En effet, puisque ( − 2) ( − 1) pour tout ≥4

( )= ( − 1) + ( − 2) 2 ( − 1)

Par conséquent, pour tout ≥ 4 , le quotient et le reste de la division de ( ) par


( − 1) sont respectivement 1 et ( ) − ( − 1) = ( − 2) . C'est exactement
ce que nous affirmions au début de la solution. À son tour, cela conduit à la récurrence
suivante pour le nombre de divisions ( ) :

( )= ( − 1) + 1 pour ≥4 (3) = 1

dont la condition initiale (3) = 1 est obtenue en traçant l'algorithme sur la paire
d'entrées (3) (2) soit 2,1. La solution à cette récidive est :

( )= − 2 pour chaque ≥3

(On peut aussi facilement trouver directement que (2) = 1 et (1) = 0 )

11. Étant donné un rectangle de côtés ( ) et ( + 1) , le problème peut être résolu


par l'algorithme récursif suivant. Si = 1 le problème est déjà résolu car le rectangle
est un carré 1 × 1. Si 1 disséquez le rectangle en carré ( ) × ( ) et le
rectangle de côtés ( −1) et ( ), puis disséquez ce dernier par le même
algorithme. L'algorithme est illustré ci­dessous pour le carré 8 × 13.

11×11×

3 ×3
×22

8×8

5 ×5

53
Machine Translated by Google

Puisque l'algorithme dissèque le rectangle de côtés ( ) et ( + 1) en


carrés – ce qui peut être formellement obtenu en résolvant la récurrence pour le
nombre de carrés ( ) = ( −1)+1 (1) = 1 – son efficacité temporelle
appartient à la classe Θ( ).

12. n/a

54
Machine Translated by Google

Exercices 2.6
1. Considérons l'algorithme de tri bien connu suivant (nous l'étudierons
plus tard dans le livre) avec un compteur inséré pour compter le nombre de comparaisons clés.

Algorithme SortAnalysis( [0 − 1])


//Entrée : Un tableau [0 − 1] de éléments commandables
//Sortie : le nombre total de comparaisons clés effectuées
←0
pour ←1à − 1 faire
← [ ]
← −1
tandis que ≥ 0 et [ ] font
← +1

[ + 1] ← [ ]
← −1
[ + 1] ←

Le compteur de comparaison est­il inséré au bon endroit ? Si vous le croyez,


prouve le; si vous pensez que ce n'est pas le cas, apportez la correction appropriée.

2. une. Exécutez le programme du problème 1, avec un compteur correctement inséré (ou


compteurs) pour le nombre de comparaisons clés, sur 20 tableaux aléatoires de tailles
1000, 1500, 2000, 2500,...,9000, 9500.

b. Analyser les données obtenues pour former une hypothèse sur l'algorithme
efficacité moyenne.

c. Estimez le nombre de comparaisons clés auxquelles on peut s'attendre pour un tableau généré
aléatoirement de taille 10 000, trié par le même algorithme.

3. Répétez le problème 2 en mesurant la durée d'exécution du programme en millisecondes.


ondes.

4. Hypothèse d'une classe d'efficacité probable d'un algorithme basée sur ce qui suit
observations empiriques du nombre de ses opérations de base :

taille 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
compte 11 966 24 303 39 992 53 010 67 272 78 692 91 274 113 063 129 799 140 538

5. Quelle transformation d'échelle fera ressembler un nuage de points logarithmique à un


linéaire ?

6. Comment distinguer un nuage de points pour un algorithme dans Θ(lg lg ) de


un nuage de points pour un algorithme dans Θ(lg )?

55
Machine Translated by Google

7. une. Trouver empiriquement le plus grand nombre de divisions effectuées par l'algorithme
d'Euclide pour calculer pgcd( ) pour 1 ≤ ≤ ≤ 100

b. Pour chaque entier positif trouver empiriquement la plus petite paire d'entiers 1 ≤ ≤
≤ 100 pour laquelle l'algorithme d'Euclide doit faire
divisions afin de trouver pgcd( ).

8. L'efficacité moyenne de l'algorithme d'Euclide sur des entrées de taille peut


être mesuré par le nombre moyen de divisions ( ) effectuées par le
algorithme de calcul pgcd( 1) pgcd( 2) ..., pgcd( ) Par exemple,

1
(5) = (1 + 2 + 3 + 2 + 1) = 1 8
5

Produisez un nuage de points de ( ) et indiquez une classe d'efficacité moyenne


probable de l'algorithme.

9. Faites une expérience pour vérifier la classe d'efficacité du tamis d'Eratos­


thenes (voir section 1.1).

10. Exécutez une expérience de synchronisation pour les trois algorithmes de calcul du pgcd ( )
présentés à la section 1.1.

56
Machine Translated by Google

Conseils pour les exercices 2.6

1. Renvoie­t­il un nombre de comparaison correct pour chaque tableau de taille 2 ?

2. Déboguez d'abord votre comptage de comparaison et votre génération d'entrées aléatoires pour les
petites tailles de tableau.

3. Sur un ordinateur de bureau raisonnablement rapide, vous pourriez très bien obtenir un temps nul, du
moins pour les plus petites tailles de votre échantillon. La section 2.6 mentionne une astuce pour
surmonter cette difficulté.

4. Vérifiez à quelle vitesse les valeurs de comptage augmentent en doublant la taille.

5. Une question similaire a été abordée dans la section.

6. Comparez les valeurs des fonctions lg lg et lg pour =2

7. Insérez le compteur de division dans un programme implémentant l'algorithme


et exécutez­le pour les paires d'entrées dans la plage indiquée.

8. Obtenez les données empiriques pour les valeurs aléatoires de dans une plage comprise, disons,
entre 102 et 104 ou 105 et tracez les données obtenues. (Vous souhaiterez peut­être utiliser différentes
échelles pour les axes de votre système de coordonnées.)

9. n/a

10. n/a

57
Machine Translated by Google

Solutions aux exercices 2.6


1. Il ne compte pas la comparaison [ ] lorsque la comparaison échoue (et, par conséquent, le
corps de la boucle while n'est pas exécuté). Si le langage implique que la deuxième comparaison
sera toujours exécutée même si la première clause de la conjonction échoue, le décompte doit
simplement être incrémenté de un, soit juste avant l'instruction while, soit juste après la fin de
l'instruction while. Si la deuxième clause de la conjonction n'est pas exécutée après l'échec de la
première clause, nous devons ajouter la ligne

si ≥0 ← +1

juste après la fin de l'instruction while.

2. une. Il faut s'attendre à des nombres très proches de 2 4 (le nombre théorique approximatif de
comparaisons clés effectuées par tri par insertion sur des tableaux aléatoires).

b. La proximité des ratios ( ) 2 par rapport à une constante suggère l’ efficacité moyenne
Θ( 2). La même conclusion peut également être tirée en observant la multiplication par quatre du
nombre de comparaisons clés en réponse au doublement de la taille du tableau.

c. (10 000) peut être estimé soit à 10 0002 4 , soit à 4 (5 000)

3. Voir les réponses de l'exercice 2. Notez cependant que les données temporelles sont intrinsèquement
beaucoup moins précises et volatiles que les données de comptage.

4. Les données présentent un comportement indiquant un algorithme lg .

5. Si ( )≈ log , alors la transformation = ( 1) donnera ( )≈( log )

6. La fonction lg lg croît beaucoup plus lentement que la fonction à croissance lente lg De plus,
si nous transformons les tracés par substitution =2 , le tracé de la première semblerait
logarithmique tandis que celui de la seconde semblerait linéaire.

7. une. 9 (pour = 89 et = 55)

b. Deux nombres de Fibonacci consécutifs – = +2 = +1 – constituent la plus petite


paire d'entiers ≥ 0 qui nécessite comparaisons pour chaque ≥2 (Il s'agit d'un fait
théorique bien connu établi par G. Lamé (par exemple, [KnuII].) Pour =1 la réponse est +1
et , qui sont tous deux égaux à
1.

58
Machine Translated by Google

8. L'expérience devrait confirmer le résultat théorique connu : l'efficacité moyenne


de l'algorithme d'Euclide est en Θ(lg ) Pour un résultat légèrement différent
12 l en 2
métrique ( ) étudiée par D. Knuth, ( ) ≈ ln ≈ 0 2 843 ln (voir
[KnuII], Section 4.5.3).

9. n/a

10. n/a

59

Vous aimerez peut-être aussi