Cours Complet Algorithmique
Cours Complet Algorithmique
Contenu du document
➤ Chapitre 1 : Le pseudocode LDA complet
➤ Chapitre 2 : Rappels mathématiques et logiques
➤ Chapitre 3 : Évaluation de la complexité algorithmique
➤ Chapitre 4 : Algorithmes de recherche et de tri
➤ Chapitre 5 : Structures de données linéaires
➤ Chapitre 6 : Arbres (ABR, Tas, 2-3, AVL)
➤ Chapitre 7 : Graphes et algorithmes sur graphes
➤ Chapitre 8 : Techniques de programmation avancées
➤ Examens S1S7 : Corrigés complets pas à pas
Ce document est conçu pour des étudiants reprenant leurs études. Chaque notion est
construite depuis les bases.
Contents
1 Le Pseudocode Langage de Description d'Algorithmes (LDA) 5
1.1 Qu'est-ce que le pseudocode LDA ? . . . . . . . . . . . . . . . . . . . . 5
1.4.1 L'aectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Logarithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6 Arbres 37
6.1 Concepts fondamentaux . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3
Algorithmique & Complexité GL/SIAD CONTENTS
7.2 Représentation d'un graphe . . . . . . . . . . . . . . . . . . . . . . . . 43
8 Techniques de Programmation 48
8.1 Récursivité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
S4 Reconstruction d'Arbre . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4
Chapitre 1
Le Pseudocode Langage de Descrip-
tion d'Algorithmes (LDA)
1.1 Qu'est-ce que le pseudocode LDA ?
■ Dénition : Algorithme
Unalgorithme est une suite nie et non ambiguë d'instructions permettant de
Analogie
résoudre un problème.
: une recette de cuisine est un algorithme elle décrit des étapes
précises pour produire un résultat à partir d'ingrédients.
tique
programmation. Il sert de
.
rééchir
grammation.
Il force à à la logique avant de coder.
Il est utilisé dans les examens pour écrire et évaluer des algorithmes.
5
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
Algorithmique & Complexité GL/SIAD D'ALGORITHMES (LDA)
8 variable x : reel
9 variable trouve : booleen
10 variable nom : chaine [50]
11
12 debut
13
16 fin
✘ Attention
Diérence procédure / fonction : procédure
fonction
Une eectue des actions mais
aucune
ne retourne valeur. Une retourne
calcule et une valeur. En LDA,
on écrit retourner uniquement dans une fonction.
6
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
D'ALGORITHMES (LDA) Algorithmique & Complexité GL/SIAD
1.3 Les types de données
Type LDA Exemples de valeurs Description
entier −5, 0, 42, 1000 Nombres entiers (positifs ou né-
gatifs)
reel 3.14, −2.7, 0.0 Nombres à virgule ottante
booleen vrai, faux Valeur logique
caractere 'a', 'Z', '5' Un seul caractère (entre apostro-
phes)
chaine[n] "bonjour" Chaîne de caractères de longueur
max n
tableau[n] de type Tableau de n éléments d'un type
donné
pointeur vers type Référence vers une cellule d'un
type donné
✘ Attention
n'est pas = x ← 5 est
peut changer
← . En mathématiques, x = 5 est une équation. En LDA,
une action : on place la valeur 5 dans la variable x. La variable x
à tout moment.
7
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
Algorithmique & Complexité GL/SIAD D'ALGORITHMES (LDA)
1.4.2 Les opérateurs
Catégorie Opérateur Signication Exemple
+ Addition a + b
- Soustraction a - b
Arithmétique * Multiplication a * b
/ Division réelle a / b
div Division entière 10 div 3 = 3
mod Modulo (reste) 10 mod 3 = 1
= Égal a = b
<> ou != Diérent a <> b
Comparaison
<, <= Inférieur, inf. ou égal a < b
>, >= Supérieur, sup. ou égal a > b
et ET logique a > 0 et b > 0
Logique ou OU logique a = 0 ou b = 0
non NON logique (négation) non trouve
6 // Forme 2 : Si / Sinon
7 si condition alors
8 // instructions si vrai
9 sinon
10 // instructions si faux
11 fin_si
12
8
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
D'ALGORITHMES (LDA) Algorithmique & Complexité GL/SIAD
✰ Exemple
Algorithme qui indique si un entier est pair ou impair :
1 algorithme PariteEntier
2 variable n : entier
3 debut
4 afficher " Entrez un entier : "
5 lire n
6 si n mod 2 = 0 alors
7 afficher n , " est pair "
8 sinon
9 afficher n , " est impair "
10 fin_si
11 fin
✘ Attention
fausse dès le départ jamais
exécuté vraie
Si la condition est , le corps de la boucle n'est
. Assurez-vous que la condition est initialement si vous voulez
entrer dans la boucle.
9
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
Algorithmique & Complexité GL/SIAD D'ALGORITHMES (LDA)
8 lire n
9 jusqu_a n > 0
11 // Boucle d é croissante
12 pour i de n a 1 par_pas_de -1 faire
13 afficher i // n , n -1 , ... , 1
14 fin_pour
✰ Exemple
Calcul de la factorielle n! :
10
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
D'ALGORITHMES (LDA) Algorithmique & Complexité GL/SIAD
1.6 Les tableaux
LDA Déclaration et utilisation d'un tableau
1 // D é claration
2 variable tab : tableau [10] de entier // 10 cases ,
indices 0..9
3 variable mat : tableau [5][5] de reel // matrice 5 x5
4
11
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
Algorithmique & Complexité GL/SIAD D'ALGORITHMES (LDA)
1.7 Les structures (enregistrements)
LDA Dénition et utilisation d'une structure
1 // D é finition d ' une structure
2 structure Etudiant
3 numero : entier
4 nom : chaine [50]
5 prenom : chaine [50]
6 moyenne : reel
7 fin_structure
8
12
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
D'ALGORITHMES (LDA) Algorithmique & Complexité GL/SIAD
14
cellule allouée
p 42 ∅
valeur suivant
13
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
Algorithmique & Complexité GL/SIAD D'ALGORITHMES (LDA)
1.10 La récursivité en LDA
LDA Fonction récursive : la factorielle
1 // Une fonction r é cursive s ' appelle elle - mê me
2 fonction factorielle_rec ( n : entier ) : entier
3 debut
4 si n = 0 ou n = 1 alors // cas de base ( arr êt )
5 retourner 1
6 sinon // cas r é cursif
7 retourner n * factorielle_rec ( n - 1)
8 fin_si
9 fin
10
diminue
2. Chaque appel récursif doit se rapprocher du cas de base (le problème
récursion innie
).
3. Sans ces deux règles ⇒ (plantage du programme).
14
CHAPTER 1. LE PSEUDOCODE LANGAGE DE DESCRIPTION
D'ALGORITHMES (LDA) Algorithmique & Complexité GL/SIAD
12 j <- j - 1
13 fin_tq
14 tab [j +1] <- cle // on ins è re cle à sa bonne place
15 fin_pour
16 fin
17
15
Chapitre 2
Rappels Mathématiques et Logiques
2.1 Logique propositionnelle
2.1.1 Tables de vérité
P Q P ∧Q (ET) P ∨Q (OU) ¬P (NON) P ⇒Q (implication)
V V V V F V
V F F V F F
F V F V V V
F F F F V V
★ Lois de De Morgan
¬(P ∧ Q) ≡ (¬P ) ∨ (¬Q)
¬(P ∨ Q) ≡ (¬P ) ∧ (¬Q)
En LDA : non(a et b) ≡ (non a) ou (non b)
16
CHAPTER 2. RAPPELS MATHÉMATIQUES ET
Algorithmique
LOGIQUES& Complexité GL/SIAD
★ Sommes à connaître par c÷ur
n
X
1=n (n termes égaux à 1) (2.1)
i=1
n
X n(n + 1) n2
i= ≈ (somme des n premiers entiers) (2.2)
i=1
2 2
n−1
X n(n − 1)
i= (variante courante) (2.3)
i=0
2
k
X
2i = 2k+1 − 1 (suite géométrique de raison 2) (2.4)
i=0
k
X rk+1 − 1
ri = (r ̸= 1) (suite géométrique générale) (2.5)
i=0
r−1
2.3 Logarithmes
★ Propriétés des logarithmes
logb (xy) = logb x + logb y (2.7)
logb xy = logb x − logb y (2.8)
loga x
logb x = (changement de base) (2.10)
loga b
ln n
log2 n = ≈ 1.443 ln n (2.11)
ln 2
✰ Exemple
Calculer log2 (32) = log2 (25 ) = 5. En général, log2 (2k ) = k .
log2 (1024) = log2 (210 ) = 10. Donc un tableau de 1024 = 210 éléments se parcourt
en dichotomie en 10 étapes.
17
Algorithmique & ComplexitéCHAPTER
GL/SIAD
2. RAPPELS MATHÉMATIQUES ET LOGIQUES
2.4 Raisonnement par récurrence
■ Dénition : Récurrence (principe)
Pour démontrer qu'une propriété P (n) est vraie pour tout n ≥ n0 :
Base :
Hérédité :
1. Vérier P (n0 ).
2. Supposer P (k) vraie (hypothèse de récurrence), et montrer que
P (k + 1) est vraie.
✰ Exemple
Preuve : P n
i = n(n+1)
Base n = 1 i=1 P .
2
1 1×2
Hérédité : i=1 i = 1 = 2 ✓
( ) :
Pk k(k+1)
Supposons i=1 i = 2
. Alors :
k+1 k
X X k(k + 1) k(k + 1) + 2(k + 1) (k + 1)(k + 2)
i= i+(k+1) = +(k+1) = = ✓
i=1 i=1
2 2 2
18
Chapitre 3
Évaluation de la Complexité Algorith-
mique
3.1 Pourquoi mesurer la complexité ?
Deux algorithmes résolvant le même problème peuvent avoir des performances radi-
calement diérentes lorsque la taille des données augmente.
19
Algorithmique CHAPTER
& Complexité3. ÉVALUATION
GL/SIAD DE LA COMPLEXITÉ ALGORITHMIQUE
Constante : O(c) = O(1)
Somme : O(f ) + O(g) = O(max(f, g))
4. pour toute constante c>0
✰ Boucle en O(log n)
1 i <- n
2 tant_que i > 1 faire // combien de fois ?
3 afficher i
4 i <- i div 2 // i est divis é par 2 à chaque tour
5 fin_tq
n
T (n) = a · T + f (n)
b
Comparer f (n) n
2. b .
Appliquer
p
3. avec .
4. le cas correspondant.
21
Algorithmique CHAPTER
& Complexité3. ÉVALUATION
GL/SIAD DE LA COMPLEXITÉ ALGORITHMIQUE
✰ Exemple
T (n) = T (n − 1) + n (ex: tri par sélection)
T (n) = n + (n − 1) + (n − 2) + . . . + 1 = n(n+1)
2
= O(n2 ).
22
Chapitre 4
Algorithmes de Recherche et de Tri
4.1 Recherche séquentielle
LDA Recherche séquentielle dans un tableau non trié
1 // Retourne l ' indice de val dans tab , ou -1 si absent
2 fonction recherche_seq ( tab : tableau [n] de entier ,
3 n : entier , val : entier ) : entier
4 variable i : entier
5 debut
6 pour i de 0 a n -1 faire
7 si tab [i] = val alors
8 retourner i // trouv é à l ' indice i
9 fin_si
10 fin_pour
11 retourner -1 // non trouv é
12 fin
Complexité : Meilleur cas O(1) (premier élément), pire cas O(n) (absent ou dernier).
1 3 5 7 9 11 13 15
0 1 2 3 4 5 6 7
23
Algorithmique & Complexité
CHAPTER
GL/SIAD
4. ALGORITHMES DE RECHERCHE ET DE TRI
3 fonction dichotomie ( tab : tableau [n] de entier ,
4 n : entier , val : entier ) : entier
5 variable bas , haut , milieu : entier
6 debut
7 bas <- 0
8 haut <- n - 1
9 tant_que bas <= haut faire
10 milieu <- ( bas + haut ) div 2
11 si tab [ milieu ] = val alors
12 retourner milieu // trouv é !
13 sinon_si tab [ milieu ] < val alors
14 bas <- milieu + 1 // chercher à droite
15 sinon
16 haut <- milieu - 1 // chercher à gauche
17 fin_si
18 fin_tq
19 retourner -1 // non trouv é
20 fin
Initial : 5 3
min=1 (idx 3) 8 1 9 2
Tour 1 : 1 3 8 5
min=2 (idx 5) 9 2
Tour 2 : 1 2 8 5 9 3
24
CHAPTER 4. ALGORITHMES DE RECHERCHE
Algorithmique
ET DE TRI& Complexité GL/SIAD
6 pour j de i +1 a n -1 faire // chercher le vrai
minimum
7 si tab [ j] < tab [ idx_min ] alors
8 idx_min <- j
9 fin_si
10 fin_pour
11 // é changer tab [ i] et tab [ idx_min ]
12 si idx_min <> i alors
13 temp <- tab [i]
14 tab [i ] <- tab [ idx_min ]
15 tab [ idx_min ] <- temp
16 fin_si
17 fin_pour
18 fin
25
Algorithmique & Complexité
CHAPTER
GL/SIAD
4. ALGORITHMES DE RECHERCHE ET DE TRI
❍ Complexité du tri insertion
Cas Complexité Condition
Meilleur cas O(n) Tableau déjà trié (0 décalage par élément)
Pire cas O(n2 ) Tableau trié à l'envers (max décalages)
Cas moyen O(n2 ) Tableau aléatoire
Complexité : O(n ) 2
en général, O(n) meilleur cas (tableau déjà trié, avec l'optimisation).
26
CHAPTER 4. ALGORITHMES DE RECHERCHE
Algorithmique
ET DE TRI& Complexité GL/SIAD
5, 3, 8, 1, 9, 2
diviser diviser
5, 3, 8 1, 9, 2
trier trier
3, 5, 8 1, 2, 9
fusionner
1, 2, 3, 5, 8, 9
Récurrence : T (n) = 2T (n/2)+O(n) . Par le Théorème Maître (Cas 2) : T (n) = O(n log n) .
27
Algorithmique & Complexité
CHAPTER
GL/SIAD
4. ALGORITHMES DE RECHERCHE ET DE TRI
4.7 Tri par tas (Heap Sort)
LDA Tri par tas
1 // Phase 1 : Construire un tas max à partir du tableau
2 // Phase 2 : Extraire les élé ments un par un ( ordre
croissant )
3
28
CHAPTER 4. ALGORITHMES DE RECHERCHE
Algorithmique
ET DE TRI& Complexité GL/SIAD
❍ Comparaison de tous les algorithmes de tri
Algorithme Meilleur Moyen Pire Stable ?
Sélection O(n2 ) O(n2 ) O(n2 ) Non
Insertion O(n) O(n2 ) O(n )2 Oui
Bulles (opt.) O(n) O(n2 ) O(n2 ) Oui
Fusion O(n log n) O(n log n) O(n log n) Oui
Tas O(n log n) O(n log n) O(n log n) Non
Rapide (Quicksort) O(n log n) O(n log n) O(n2 ) Non
Borne inférieure théorique des tris par comparaison : Ω(n log n)
29
Chapitre 5
Structures de Données Linéaires
5.1 Tableaux dynamiques
LDA Tableau à taille variable simulation
1 // On g è re un " vrai " tableau avec un compteur d 'él é ments
2 structure TableauDyn
3 donnees : tableau [ MAX ] de entier
4 nb_elems : entier // nombre d 'él é ments
actuellement stock és
5 fin_structure
6
valeur
pointeur
Une (donnée)
Un vers le n÷ud suivant (∅ si dernier)
tête 5 22 1 8∅
val|suiv
6 // D é claration de la tê te de liste
7 variable tete : pointeur vers Noeud = NULL
31
Algorithmique & Complexité CHAPTER
GL/SIAD 5. STRUCTURES DE DONNÉES LINÉAIRES
6 nouveau . suivant <- NULL
7 si tete = NULL alors
8 tete <- nouveau // liste é tait vide
9 sinon
10 courant <- tete
11 tant_que courant . suivant <> NULL faire
12 courant <- courant . suivant // aller jusqu ' au dernier
13 fin_tq
14 courant . suivant <- nouveau // attacher le nouveau
noeud
15 fin_si
16 fin
32
CHAPTER 5. STRUCTURES DE DONNÉES LINÉAIRES
Algorithmique & Complexité GL/SIAD
18 si courant <> NULL alors // noeud trouv é
19 precedent . suivant <- courant . suivant
20 liberer ( courant )
21 fin_si
22 fin
33
Algorithmique & Complexité CHAPTER
GL/SIAD 5. STRUCTURES DE DONNÉES LINÉAIRES
5.3 Piles (LIFO)
■ Dénition : Pile (Stack)
LIFO
Analogie :
Une pile est une structure (Last In, First Out) : le dernier élément inséré
est le premier retiré. une pile d'assiettes.
9 push(5)
push/pop
sommet
1
7
3
34
CHAPTER 5. STRUCTURES DE DONNÉES LINÉAIRES
Algorithmique & Complexité GL/SIAD
35 debut
36 retourner tete = NULL
37 fin
enfiler défiler
5 22 1 8
dernier premier (tête)
35
Algorithmique & Complexité CHAPTER
GL/SIAD 5. STRUCTURES DE DONNÉES LINÉAIRES
30 f. premier <- f. premier . suivant
31 si f. premier = NULL alors f. dernier <- NULL fin_si //
file devenue vide
32 liberer ( temp )
33 retourner val
34 fin
36
Chapitre 6
Arbres
6.1 Concepts fondamentaux
■ Dénition : Arbre
Un arbre est une structure hiérarchique composée de n÷uds reliés par des arêtes ,
avec les propriétés suivantes :
racine
un parent
Un n÷ud spécial : la (sans parent).
feuilles
Chaque n÷ud non-racine a exactement .
Les n÷uds sans enfant sont appelés .
10 racine, hauteur=3
n÷ud interne
5 15
2 7 12 20
1 3 6 9
Terme Dénition
Racine N÷ud sans parent (sommet de l'arbre)
Feuille N÷ud sans enfant
N÷ud interne N÷ud avec au moins un enfant
Hauteur Longueur du chemin le plus long de la racine à une feuille
Profondeur d'un n÷ud Longueur du chemin de la racine à ce n÷ud
Degré Nombre d'enfants d'un n÷ud
Sous-arbre Arbre enraciné en un n÷ud ls
37
Algorithmique & Complexité GL/SIAD CHAPTER 6. ARBRES
6.2 Arbres Binaires de Recherche (ABR)
■ Dénition : ABR
Un arbre binaire de recherche est un arbre binaire où, pour tout n÷ud de clé k :
gauche
droit
Toutes les clés du sous-arbre sont< k.
Toutes les clés du sous-arbre sont > k.
38
CHAPTER 6. ARBRES Algorithmique & Complexité GL/SIAD
25 postfixe ( n. gauche )
26 postfixe ( n. droit )
27 afficher n . cle
28 fin_si
29 fin
39
Algorithmique & Complexité GL/SIAD CHAPTER 6. ARBRES
LDA Suppression dans un ABR 3 cas
1 // Cas 1 : feuille -> supprimer directement
2 // Cas 2 : un seul enfant -> remplacer par l ' enfant
3 // Cas 3 : deux enfants -> remplacer par le successeur
infixe
4
40
CHAPTER 6. ARBRES Algorithmique & Complexité GL/SIAD
6.3 Tas (Heap)
■ Dénition : Tas max
Un tas max est un arbre binaire complet (tous les niveaux remplis, sauf éventuelle-
propriété de tas
ment le dernier qui se complète de gauche à droite) tel que la clé de chaque n÷ud
est ≥ à celles de ses enfants ( ).
70
65 60
25 50 55 35 Idx
Val
1 2 3 4 5 6
70 65 60 25 50 55
Parent= ⌊i/2⌋
Fils gauche = 2i
Fils droit = 2i + 1
41
Algorithmique & Complexité GL/SIAD CHAPTER 6. ARBRES
3 variable max , i , j , temp : entier
4 debut
5 si taille = 0 alors erreur " Tas vide " fin_si
6 max <- tas [1] // sauvegarder le maximum
7 tas [1] <- tas [ taille ] // mettre le dernier à la
racine
8 taille <- taille - 1
9 // Percolation vers le bas
10 i <- 1
11 tant_que vrai faire
12 j <- i
13 si 2* i <= taille et tas [2* i] > tas [j ] alors j <- 2* i
fin_si
14 si 2* i +1 <= taille et tas [2* i +1] > tas [ j] alors j <-
2* i +1 fin_si
15 si j = i alors retourner max fin_si // propri été ré
tablie
16 temp <- tas [i ] ; tas [i] <- tas [ j] ; tas [j ] <- temp
17 i <- j
18 fin_tq
19 fin
2 ou 3 ls
1 clé 2 clés
Chaque n÷ud interne a .
feuilles sont à la même profondeur
Un n÷ud à 2 ls contient , un n÷ud à 3 ls contient .
Toutes les .
Avantage : toutes les opérations en O(log n) garanti (pas de pire cas comme
l'ABR).
12, 24
5, 9 18 30, 36
42
Chapitre 7
Graphes et Algorithmes sur Graphes
7.1 Dénitions fondamentales
■ Dénition : Graphe
Un graphe G = (V, E) est constitué de :
V sommets
arêtes
: un ensemble de (vertices) ou n÷uds.
E : un ensemble d' (edges) reliant des paires de sommets.
43
Algorithmique & Complexité
CHAPTER
GL/SIAD
7. GRAPHES ET ALGORITHMES SUR GRAPHES
7.2.2 Liste d'adjacence
LDA Liste d'adjacence
1 structure Arc
2 destination : entier // sommet de destination
3 poids : entier // poids de l ' ar ê te
4 suivant : pointeur vers Arc
5 fin_structure
6
44
CHAPTER 7. GRAPHES ET ALGORITHMES Algorithmique
SUR GRAPHES & Complexité GL/SIAD
11 tant_que non est_vide ( file ) faire
12 u <- defiler ( file )
13 afficher " Visite : " , u , " distance : " , dist [ u]
14 pour_chaque voisin v de u dans adj faire
15 si non visite [ v] alors
16 visite [v ] <- vrai
17 dist [ v] <- dist [u] + 1
18 enfiler ( file , v)
19 fin_si
20 fin_pour_chaque
21 fin_tq
22 fin
23 // Complexit é : O (n + m)
14 // Initialisation et appel
15 procedure DFS ( adj : tableau de liste , n , s : entier )
16 debut
17 pour i de 0 a n -1 faire visite [ i] <- faux fin_pour
18 DFS_rec ( adj , s )
19 fin
20 // Complexit é : O (n + m)
45
Algorithmique & Complexité
CHAPTER
GL/SIAD
7. GRAPHES ET ALGORITHMES SUR GRAPHES
7.5 Algorithme de Dijkstra Plus court chemin
■ Dénition : Problème du plus court chemin
Étant donné un graphe pondéré (poids ≥ 0) et un sommet source s, trouver le
plus court chemin (de poids minimal) de s vers tous les autres sommets.
14 // n it é rations
15 pour i de 0 a n -1 faire
16 // Choisir le sommet non visit é de distance minimale
17 u <- trouver_min ( dist , visite , n)
18 si u = -1 alors retourner fin_si // tous les
sommets accessibles trait és
19 visite [u ] <- vrai
20
46
CHAPTER 7. GRAPHES ET ALGORITHMES Algorithmique
SUR GRAPHES & Complexité GL/SIAD
34 afficher " dist [" , s , " - >" , i , "] = " , dist [i]
35 fin_pour
36 fin
1 1 4 5 Étape
1
0 ∞
d[1] d[2] d[3] d[4] d[5]
3 2
4 2 Init. ∞ ∞ ∞
3
Visit. 1 0 4 ∞ ∞
5
Visit. 2 0 2 5 ∞
5
Visit. 3 0 2 3 5
Visit. 4 0 2 3 5
2 1 2
Chemin optimal 1→5 : 1→
− 2→
− 3→
− 5, longueur = 5.
Complexité : O(n ) 2
avec tableau simple, O((n + m) log n) avec tas min.
47
Chapitre 8
Techniques de Programmation
8.1 Récursivité
■ Dénition : Récursivité
Une fonction (ou procédure) est récursive si elle s'appelle elle-même pour résoudre
un sous-problème de taille réduite.
Structure obligatoire :
Cas de base
Cas récursif
1. : condition d'arrêt (résolu directement, sans appel récursif ).
2. : ramène au même problème de taille strictement inférieure.
48
CHAPTER 8. TECHNIQUES DE PROGRAMMATION
Algorithmique & Complexité GL/SIAD
23 fin
Diviser
Régner
1. : découper le problème en sous-problèmes plus petits.
Combiner
2. : résoudre chaque sous-problème récursivement.
3. : fusionner les solutions partielles.
Exemples : Tri fusion O(n log n), Recherche dichotomique O(log n), multiplication
de matrices de Strassen O(n2.807 ).
LDA Puissance rapide diviser pour régner
1 // Calculer a^ n en O( log n) au lieu de O (n)
2 fonction puissance_rapide (a , n : entier ) : entier
3 debut
4 si n = 0 alors retourner 1 fin_si // cas de
base
5 si n mod 2 = 0 alors
6 // n est pair : a^n = ( a ^( n /2) ) ^2
7 variable demi : entier <- puissance_rapide (a , n div 2)
8 retourner demi * demi
9 sinon
10 // n est impair : a ^n = a * a ^( n -1)
11 retourner a * puissance_rapide (a , n -1)
12 fin_si
13 fin
14 // Trace pour puissance_rapide (2 , 10) :
15 // 2^10 = (2^5) ^2 = (2 * 2^4) ^2 = (2 * (2^2) ^2) ^2 = ...
16 // 4 appels ré cursifs seulement , au lieu de 10 !
49
Algorithmique & Complexité GL/SIAD
CHAPTER 8. TECHNIQUES DE PROGRAMMATION
LDA Fibonacci par mémoïsation O(n) au lieu de O(2 ) n
50
CHAPTER 8. TECHNIQUES DE PROGRAMMATION
Algorithmique & Complexité GL/SIAD
11 montant <- montant - nb * pieces [i ]
12 fin_si
13 fin_pour
14 si montant > 0 alors afficher " Rendu impossible
exactement " fin_si
15 fin
16 // Note : glouton est optimal pour les syst è mes de pi è ces
standard
17 // mais pas toujours pour des syst è mes arbitraires !
51
PARTIE III Corrigés Complets des
Examens S1 à S7
8.4 S1 Rattrapage Semestre 5
8.4.0 Exercice 1 Ordres de grandeur (5 pts)
Fonctions : f = 4n + 22 f = 4n + 12 f
1
1
3
, 2
2
, 3 = n2 log(5n4 ), f4 = 12 n2 − 10n − 60,
f =2−
Q1 Trouver les Grand O (3 pts)
5 n
➤ Réponse
f1 : terme dominant 4n3 ⇒ O(n3 )
f4 : terme dominant
1 2
2
n ⇒ O(n2 )
Sortie:
tabReel[0..n-1] : tableau de réels, n = 2k
1
n jusqu'à
Pour i ← 0 à n − 1 faire
2 lire n =1 puis2( )
3
4 lire tabReel[i]
acher
5 S← somParallele(tabReel , n)
6 S
"Somme = "
Sortie: n = 2
n : entier
si n ≤ 0 alors
k
1 si , sinon 0
retourner
1
2 0
retourner
4
5 0
6 n←n÷2
7retourner 1
5 22 1 8 ∅
si [Link] = ∅ alors
1n← [Link] ← val
allouer(t_element) ; ; [Link] ← ∅
2
3 [Link] ← n [Link] ← n
;
4sinon
5 [Link] ← n ; [Link] ← n
Sortie:
f : t_le
si [Link] = ∅ alors
val : entier
1
2 erreur "File vide"
si alors
3 temp ← [Link] ; val ← [Link] ; [Link] ← [Link]
4 [Link] = ∅
5 [Link] ← ∅
6 libérer(temp) ; retourner val
7 structure Etudiant
54
PARTIE III Corrigés Algorithmique & Complexité GL/SIAD
8 numero : entier
9 nom : chaine [50]
10 prenom : chaine [50]
11 moy : reel // à calculer
12 eval : pointeur vers Note // liste des notes
13 precedent : pointeur vers Etudiant
14 suivant : pointeur vers Etudiant
15 fin_structure
si c ̸= ∅ alors
1 Trouverc tel que [Link] = num dans la liste depuis tete
2
3 n ← allouer(Note) ; [Link] ← val ; [Link] f ← coef f
4 [Link] ← [Link] ; [Link] ← n
55
Algorithmique & Complexité GL/SIAD PARTIE III Corrigés
➤ Réponse
Algorithm 8:
[Link] = num si c = ∅ alors
nbNotes(tête, num) : entier
retourner −1
1 c
Trouver tel que ;
2
retourner nb
6
complexité O(n )
Le produit y = Tx est une convolution : yi = j=1 ti−j+n · xj .
2
Méthode naïve : n produits scalaires de taille n⇒ .
Méthode optimisée via FFT ⇒ O(n log n).
1
Init. 0 0 0 0 0 0 0 0 0 0
1 1 1 1
Marquer 1 0 0 0 0 0 0 0 0 0
1
Multiples de 2 1 0 0 0 0 0
Résultat Ö ✓ ✓
Multiples de 3 1 0 0 1 0 1 0 1 1
Ö ✓ Ö ✓ Ö Ö Ö
Nombres premiers ≤ 10 : 2, 3, 5, 7
Q2 Algorithme (3 pts)
➤ Réponse
Algorithm 10: cribleEratosthene(n)
Pour i ← 2 à ⌊ n⌋ faire
1tab[1..n] ← 0 tab[1]
;
√ ←1
si tab[i] = 0 alors
2
3
Pour i ← 2 à n faire
si tab[i] = 0 alors
7
acher i
8
9
Q3 Complexité (3 pts)
➤ Réponse
O(n log log n) quasi-linéaire, car on ne traite que les multiples des premiers
√
≤ n.
57
Algorithmique & Complexité GL/SIAD PARTIE III Corrigés
8.4.0 Exercice 2 Opérations sur les Arbres (11 pts)
Q1 à Q3 Parcours, résultats et insertions
➤ Réponse
Inxe : 1, 2, 3, 5, 6, 7, 9, 10, 12, 15, 20 Préxe :
Postxe : 1, 3, 2, 6, 9, 7, 5, 12, 20, 15, 10
(croissant)
Insertions : →
10, 5, 2, 1, 3, 7, 6, 9, 15, 12, 20
8 →
ls gauche de 9 ; 6 →
déjà présent (doublon ignoré) ; 4 ls
droit de 3.
58
PARTIE III Corrigés Algorithmique & Complexité GL/SIAD
8.4 S4 Reconstruction d'Arbre & Magasin
Q1 Reconstruction (2 pts)
➤ Réponse
Méthode : racine = premier du préxe = 3 . Dans l'inxe, 3 est en position 3 : 2
n÷uds à gauche {8,6}, 7 n÷uds à droite {12,13,5,20,21,25,28}.
6 13
8 12 5
21
20 28
25
retourner
1
2 0
Q5 Hauteur (2 pts)
➤ Réponse
Algorithm 13: O(n)
si n = ∅ alors
hauteur(n) : entier
retourner
1
2 0
Plog n n
P∞ 1
T (n) = k=0 2· 2k
= 2n k=0 2k = 4n ⇒ O(n)
retourner
3 s← j=0 ;
4 FAUX
Pour j ←P 0 à c − 1 faire
T [i][j] si s ̸= ref alors
5
c−1
retourner
6 s← i=0 ;
7 FAUX
retourner
8 VRAI
Q2 à Q5
➤ Réponse
n = c2 (taille des données). Complexité : O(c2 ) = O(n) (optimal car il faut lire
tous les éléments).
Pour vérier les valeurs 1 à c2 : utiliser un tableau de marques vu[1..c2 ]. Coût
supplémentaire O(n), total O(n).
➤ Réponse
Résultat après insertion de toutes les clés : [70, 65, 60, 25, 50, 55, 35, 10,
5, 40, 45, 20, 30, 15]
Q1 & Q2 : Voir algorithmes inserer_tas, supprimer_max et heap_sort dans le
Chapitre 6.
Dépiler() :
x enler x dans F1 . ⇒ O(1).
transférer tous les éléments de F1 vers F2 sauf le dernier. Récupérer
ce dernier. Échanger F1 ↔ F2 . ⇒ O(n).
5 1 2
6 L p .val p ← p .suiv
insererFin( , ) ;
sinon
2 2 2
7
8 insererFin(L, p1 .val) ; p1 ← p1 .suiv ; p2 ← p2 .suiv
retourner L
9 Vider la liste non épuisée dans L
10
Q2 Récurrences (4 pts)
➤ Réponse
(a) T (n) = T (n/3) + O(1) : a = 1, b = 3, p = log3 1 = 0, f (n) = O(1) = Θ(n0 )
⇒ ⇒ O(log n)
(b) T (n) = 7T (n/2) + n
Cas 2
2
a = 7, b = 2, p = log2 7 ≈ 2.807, f (n) = n2 =
:
si c = ∅ alors
1 c
Trouver [Link] = num
tel que
retourner −1
2
3
9 retourner sN C/sC