Académique Documents
Professionnel Documents
Culture Documents
1 Introduction
5 Combinatoire et Dénombrement
Complexité des Algorithmes
6 Quelques Notions de Graphe
2 / 99
Introduction
Soit un histogramme avec n barres sur lequel on a versé un volume d’eau infini.
I Donnez un algorithme pour calculer le volume d’eau résiduel en temps linéaire.
Introduction 3 / 99 Introduction 4 / 99
Complexité des algorithmes Trois problèmes de pavage
Problème 1 : (Tetris)
Etant donné une position de Tetris et la liste des pièces à venir, est-ce qu’il
est possible de vider l’écran ?
Savoir analyser l’efficacité d’un algorithme
Introduction 5 / 99 Introduction 6 / 99
Les trois problèmes ci-dessous sont-ils faciles ? Difficiles ? Les trois problèmes ci-dessous sont-ils faciles ? Difficiles ?
Introduction 6 / 99 Introduction 6 / 99
Calculabilité et complexité des problèmes Vaincre la Combinatoire : Algo. ou Matériel ?
Complexité des Algorithmes Toute donnée peut se coder par un Nombre de Gödel
Q est une relation, pas toujours une fonction : plus court(s) chemin(s)
On peut se restreindre aux fonctions
1 + n + (n − 1) ∗ 2 + 1 = 3n
Algorithme : TriRapide
Invariants Le nombre d’opérations dépend en général de la donnée du problème ;
Données : tableau T d’elts comparables, entiers s, e
Résultat : le tableau trié entre les indices s et e I T [0], . . . , T [i − 1] < pivot
Exemple :
1 Procedure TriRapide(T , s, e) I T [i], . . . , T [j − 1] ≥ pivot
2 si s < e alors
3 p ← Partition(T , s, e); (a) trier 10 entiers vs. trier 1000000 entiers
4 TriRapide(T , s, p − 1);
TriRapide(T , p + 1, e);
(b) tri par sélection de 1000 entiers déjà triés vs. 500 entiers triés dans
5
29 30 17 9 0 24 pivot le sens inverse
6 Procedure Partition(T , s, e)
7 pivot ← T [e];
8 i ← s; 17 9 0 29 30
9 pour j allant de s à e − 1 faire (a) ⇒ Donner la complexité en fonction de la taille de la donnée ;
10 si T [j] < pivot alors → nombre de bits de sa représentation en mémoire
11 échanger T [i] avec T [j];
12 i ← i + 1; 9 17 29 (b) ⇒ Plusieurs types de complexités peuvent être calculées
13 échanger T [i] avec T [j]; → pire/meilleur cas ou en moyenne.
14 retourner i;
9
L’algo. suivant recherche l’élément e dans un tableau. InfTriSelection (n) = n(n + 4), SupTriSelection (n) = n(2n + 5)
z1 z2 z3 z4 z5 z6 z7 z8 z9 TriSélection TriRapide
Sup(n) c1 n 2 c2 n 2
Moy(n) c3 n 2 c4 n ln n
Soit la liste triée des éléments de T : z1 < z2 < . . . < zn
Si on note p(zi , zj ) la probabilité que zi et zj soient comparés, alors l’espérance E du
Soient :
nombre de comparaisons est donc :
I T s (n) le temps effectif de calcul pour TriSélection de n éléments, ' Moys (n) = c3 n2
n−1 X
X n I T r (n) le temps effectif de calcul pour TriRapide de n éléments, ' Moyr (n) = c4 n ln n
p(zi , zj ) Expérience : essayons pour n = 100000 et estimons n = 300000
i=1 j=i+1
T s (100000) T r (100000)
c3 = c4 =
zi et zj sont comparés ssi un des deux est le premier pivot parmi zi , zi+1 , . . . , zj 1000002 100000 ln 100000
I sinon, le pivot zk sépare zi < zk et zj > zk ! et donc (pour T s (100000) = 1.7 et T r (100000) = .006) :
Donc p(zi , zj ) = 2/(j − i + 1) (les choix de pivot sont équiprobables) T s (100000)
T s (300000) = × 3000002 ' 15.3
n−1 X
n n−1 X
n−i n−1 Xn 1000002
X 2 X 2 X 1 T r (100000)
= ≤2 ' 2nln n T r (300000) = × 300000 ln 300000 ' 0.019
i=1 j=i+1
j −i +1 i=1 j=1
j + 1 i=1 j=1
j 100000 ln 100000
Hypothèse simplificatrice
On ne s’intéresse qu’aux fonctions asymptotiquement positives
(positives pour tout n ≥ n0 )
O(g (n)) est l’ensemble de fonctions f (n) telles que : O(g (n)) est l’ensemble de fonctions f (n) telles que :
Prouver que f (n) ∈ O(g (n)) : jeux contre un perfide adversaire ∀ Jeux : prouver que la fonction f2 (n) = 6n2 + 2n − 8 est en O(n2 ) :
Borne supérieure et inférieure : Θ(g (n)) = Ω(g (n)) ∩ O(g (n)) ; f (n)
est en Θ(g (n)) si elle est prise en sandwich entre c1 g (n) et
c2 g (n) ;
∃c1 , c2 ∈ R+∗ , ∃n0 ∈ N, ∀n > n0 , c1 × g (n) ≤ f (n) ≤ c2 × g (n) Notation asymptotique (de l’expression fermée) d’une fonction
Les mêmes simplifications pour O, Ω et Θ :
c2 × g (n) on ne retient que les termes dominants
f ∈ Θ(g ) on supprime les constantes multiplicatives
c1 × g (n)
Exemple
Soit g (n) = 4n3 − 5n2 + 2n + 3 ;
1 on ne retient que le terme de plus haut degré : 4n3 (pour n assez grand le terme en
n3 “domine” les autres, en choisissant bien c1 , c2 , on peut avoir c1 n3 ≤ g (n) ≤ c2 n3 )
n 2 on supprime les constantes multiplicatives : n3 (on peut la choisir !)
k
et on a donc g (n) ∈ Θ(n3 )
Exercice : 2n2 est-il en Θ(n2 ) ? Pareil pour 2n.
Analyse Asymptotique 38 / 99 Analyse Asymptotique 39 / 99
Relation des principaux ordres de grandeur Ordres de grandeurs : exemples
Règles de calculs : combinaisons des complexités Règles de calculs : combinaison des complexité
On additionne les complexités d’opérations en séquence : Dans les boucles, on multiplie la complexité du corps de la boucle par le nombre
d’itérations ;
O(f (n)) + O(g (n)) = O(f (n) + g (n))
Même chose pour les branchements conditionnels : Calcul de la complexité d’une boucle while :
max(O(f (n)), O(g (n))) = O(f (n)) + O(g (n))
Exemple
Exemple
en supposant qu’on a O(h(n)) itérations
si <condition> alors O(g (n))
tant que <condition> faire
#instructions (1); O(f1 (n))
O(g (n))
= O(h(n) × (g (n) + f (n)))
= O(g (n) + f1 (n) + f2 (n)) #instructions ; O(f (n))
sinon
#instructions (2); O(f2 (n))
Calcul de la complexité d’une boucle for : 1 on calcule la complexité de chaque “partie” de l’algorithme ;
Séries arithmétiques
Nombre total d’opérations :
n
X 1
k = 1 + 2 + 3 + ··· + n = n(n + 1) ∈ Θ(n2 )
Θ(1) + Θ(n) ∗ Θ(1) + Θ(n) ∗ Θ(1) + Θ(1) = Θ(n) k=1
2
Alphabet
Ensemble fini de caractères : Langage
Σbin = {0, 1} l’alphabet binaire
Un langage sur l’alphabet Σ est un ensemble de mots sur Σ. L’ensemble de
Σlatin = {a, b, c, . . . , z} l’alphabet latin tous les mots sur Σ est noté Σ∗ .
Σbio = {A, T , G , C } l’alphabet génétique le mot vide : ∈ Σ∗ ;
L’ensemble des caractères ASCII les caractères : si w ∈ Σ alors w ∈ Σ∗ ;
les mots obtenus par l’opération de concatenation “·” de deux mots : si v ∈ Σ∗ et
Mot w ∈ Σ∗ alors v · w ∈ Σ∗
Un mot w sur l’alphabet Σ est une suite finie w1 w2 . . . wn de lettres de Σ.
L’entier n est appelé la longueur du mot w . Il est noté |w |. Code
“0110101” est un mot de longueur 6 sur Σbin Fonction injective f : Σ 7→ Σ0
“maux” est un mot de longueur 4 sur Σlatin Code binaire f : Σ 7→ Σ∗bin
“vuwboj” est un mot de longueur 6 sur Σlatin
“%&))+dfW4” est un mot de longueur 9 sur l’alphabet ASCII
0 1 0 0 1 0 1 1
0 1 0 0 1 0 1 1
27 26 25 24 23 22 21 20 e8 e7 e6 e5 e4 e3 e2 e1
Chaque bit repésente un terme de la somme Chaque bit repésente un élément de U, V ⊆ U est représenté par un mot w qui code
sa fonction caractéristique :
7
X
x= bi 2i χV : U 7→ {0, 1}
i=0
1 si ei ∈ V
ei 7→
0 si ei ∈
6 V
Pour x = 75 : 1 × 26 + 1 × 23 + 1 × 21 + 1 × 20
f ({e7 , e4 , e2 , e1 }) 7→ w = 01001011
7 6 5 4 3 2 1 0
Code de longueur fixe (n) : langage Σnbin = {w | w ∈ Σ∗bin , |w | = n}
Combien de mots de n caractères dans Σ∗bin ? Taille n, nombre de mots 2n , permet de coder des langages de 2n mots ou moins
Quantité d’information
Il n’est pas possible de coder un langage contenant plus de 28 = 256 mots sur 8 bits La Quantité d’information transportée par un message d’un mot dans un
langage de cardinalité N est log2 (N).
Si m est une constante (32, 64, . . .) la taille d’un code de longueur fixe n est O(1)
Bonne nouvelle : l’alphabet n’est pas important
0 0 0 0 0 0 0 1 0 0 1 0 1 1
I Ex : on peut coder les lettres de l’alphabet latin sur dlog2 (26)e = 5 bits (O(1) bits) | {z }
I Un mot de Σ∗latin de longueur n se code sur au plus 5n bits : la taille du code ne change N◦ de 0 = N◦ de bits =7 26 25 24 23 22 21 20
pas (de façon asymptotique)
Mauvaise nouvelle : les données ont le plus souvent un nombre de valeurs possibles
infini (entier, liste de caractères, etc.) Pour représenter [0, x] (x ∈ N), il faut Ω(log2 (x)) bits
I Quel que soit n, il existe x ∈ N tel que x > 2n et donc le langage N n’a pas de code
binaire de longueur fixe
Supprimer les 0 non-significatifs, rajouter autant de 0 que de bits “utiles” en préfixe
Principe additif
Les choix mutuellement exclusifs se combinent par addition.
Dénombrement
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
“Compter le nombre d’éléments d’un ensemble” et 3 plats végétariens ?
3 + 2 + 3 = 8 possibilités
Principe multiplicatif
Calculer la complexité en temps d’un algorithme (compter le nombre d’opérations) Les choix indépendents se combinent par multiplication.
Ex : combien de menus possibles s’il y a 3 entrées, 4 plats, et 4 desserts ?
3 × 4 × 4 = 48 possibilités
Avec trois ensembles : bn/2c + bn/3c + bn/5c − bn/6c − bn/10c − bn/15c + bn/30c ' 22n/30
Si m > n objets sont rangés dans n tiroirs, alors un tiroir en contient au moins 2 Nombre de permutations
Nombre de permutations de n éléments :
Il y a deux londoniens avec exactement le même nombre de cheveux
Pn = n!
I Il n’y a pas plus d’un million de cheveux sur un crâne, donc pas plus d’un million de
nombres de cheveux distincts
n positions pour le premier éléments, n − 1 pour le deuxièmes, etc.
I Il y a plus d’un million de londoniens 24 “club sandwiches” (lard, laitue, tomate, mayonnaise)
8.065 · 1067 mélanges d’un jeu de 52 cartes
I m londoniens à répartir parmi n chevelures possibles ⇒ au moins deux londoniens avec la
même chevelure
Nombre de permutations
Nombre d’arrangements
Nombre de permutations de k éléments avec répétitions n1 , n2 , . . . , nk :
Nombre d’arrangements de p parmi n éléments :
n!
P¯n (n1 , n2 , . . . , nk ) = Qk n!
Anp =
i=1 ni ! (n − p)!
Pour chaque élément i y a ni ! permutations symétriques par réarrangement des n positions pour le 1er éléments, n − 1 pour le 2èmes, . . ., n + 1 − p pour le pème.
répétitions de i
360 “club sandwiches” si on rajoute les deux tranches de pain (= 6!/2!)
Tri
donnée : une table d’éléments comparables
but : donner une liste triée de ces éléments
Une combinaison est une partie de cardinalité p d’un ensemble
Considérons les algorithmes de tri qui ne peuvent pas “lire” ces éléments, seulement
Nombre de combinaisons les comparer (e.g. un tableau de pointeurs vers une classe d’objets comparables).
Nombre de combinaisons de p parmi n éléments : Lors de son execution, cet algorithme va comparer k paires d’éléments (x, y ), le
résultat peut être 0 (x < y ) ou 1 (x ≥ y )
n!
Cnk =
(n − p)!p! On peut considérer que la donnée de l’algorithme est une table de longueur k avec les
résultats des comparaisons :
Une combinaison de p éléments peut être arrangée de p! façon, donc Cpn = Anp /p! x = [0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1]
| {z }
k
La taille (ou cardinalité) |E | d’un ensemble E est le nombre d’éléments de cet ensemble
Georg Cantor
{1, 2, 3} et {A, B, C , D} ?
Est-ce qu’il y a deux fois plus d’entiers que d’entiers pairs ?
L’ensemble des atomes qui constituent un morceau de craie et l’ensemble des protons
qui appartiennent au même morceau de craie ? Ou est-ce que deux ensembles infinis ont la même taille
(infinie) ?
1 ←→ 2 5 8 10 12
2 ←→ 4 0, 1 1, 1 6 2, 1 3, 1 4, 1 ...
f (n) = 2n, f −1 (n) = n f est inversible
3 ←→ 6 2
.. .. 2 3 4 7 11
. . 0, 0 1, 0 2, 0 3, 0 4, 0 ...
n ←→ 2n 1
T∗ 1 1 0 0 1 0 ... ?
.. Soit T ∗ la partie de N qui
·
. ·· contient i ssi i 6∈ Ti
Ti 0 0 1 ... ... 1
I Ex : N+ , Z, Q sont dénombrables
Si f est une bijection, alors
.. 0 .. f (T ∗ ) = j ∈ N
. 1 .
Est-ce que j appartient à T ∗ ?
T2 0 1 1 .. I Ex : 2N , R ne sont pas dénombrables
T1 1 0 0 . Contradiction ⇒ l’hypothèse
(“∃ une bijection f : 2N 7→ N”)
T0 0 0 0
est fausse !
0 1 2 ... ... i ... j
Graphe G = (V , E )
Un ensemble d’objets dont certains sont liés deux à deux.
Un graphe G = (V , E ) est défini par un ensemble de sommets V et un
ensemble d’arêtes E . Une arête e ∈ E est une paire de sommets qui peut
Quelques Notions de Graphe être ordonnée (on parle de graphe orienté) ou pas (graphe non-orienté).
V E
{1, 2} 1 1
1 {1, 3}
2 {1, 4} 2 3 2 3
Ex : 3 {2, 5}
4 4
4 {3, 6}
5 {4, 5}
6 {4, 6} 5 6 5 6
{5, 6}
4 1 1
1 4
1 3
2 3 2 3
2 3 = 1 3 =
4 4
4 6
2 5
5 6 5 6
5 6 2 5
6
La façon dont le graphe est déssiné n’a pas d’importance Chaînes et Chemins
Le nom des sommets n’a pas d’importance Une chaîne (resp. un chemin) de x0 vers xk dans un graphe (orienté)
G = (V , E ) est est une liste ordonnée de sommets x0 , . . . , xk telle que pour
isomorphisme tout 1 ≤ i ≤ k {xi−1 , xi } ∈ E (resp. (xi−1 , xi ) ∈ E ).
G = (V , E ) est isomorphe à G 0 = (V 0 , E 0 ) s’il existe une bijection Élémentaire si tout les sommets sont distincts (sauf x0 et xk ).
f : V 7→ V 0 telle que (u, v ) ∈ E ⇐⇒ (f (u), f (v )) ∈ V 0
1 1 Est il possible de visiter Koenigsberg en traversant chaque pont exactement une fois ?
2 3 2 3 C
4 4
5 6 5 6 A D
Cycles et Circuits
B
Un cycle (resp. circuit) dans un graphe (orienté) G = (V , E ) est une
chaîne (resp. un chemin) d’un sommet x vers lui-même.
Graphe Eulerien
Connexité Un graphe G = (V , E ) est dit Eulerien s’il contient un cycle x0 , x1 , . . . , x|E |
Un graphe est (bi)connexe si toute paire de sommets appartient à une passant une et une seule fois par chaque arête, i.e., x0 = x|E | et
chaîne (un cycle) {{xi−1 , xi } 1 ≤ i ≤ |E |} = E .
Arbre enraciné 2 67
3
5 3 6
I Orientation racine → feuilles
Profondeur d’un arbre complet Ajout : la position libre la plus à gauche possible sur le dernier niveau
La longueur maximale d’un chemin vers une feuille d’un arbre binaire I Percolation échange avec le parent jusqu’à ce que l’invariant soit rétabli O(log n)
complet est dlog2 ne(∈ O(log n)) Extraction du minimum : la racine, qu’on remplace par le “dernier” sommet
I Percolation échange avec le fils minimum jusqu’à ce que l’invariant soit rétabli O(log n)
Il faut avoir une intuition sur la forme de la solution (ici : O(n log n))
Temps d’exécution T dans le pire des cas du tri fusion pour trier un tableau de n
entiers
On veut montrer que T (n) = 2T (bn/2c) + Θ(n) ∈ O(n log n)
Méthode par substitution (condition aux limites) Méthode par substitution (condition aux limites)
T (2) = 2T (b2/2c) + 2
Il faut montrer que la formule est vraie pour les conditions limites de la récurrence
pour des données de petite taille, i.e. n = 1
T (2) = 2T (1) + 2
Problème : c’est faux pour n = 1 car c × 1 × log 1 = 0 < T (1) = 1 ;
T (2) = 2 ∗ 1 + 2 = 4 ≤ 2c log 2 = 2c
Mais on cherche à montrer la complexité pour des données de grande taille : n ≥ n0
et on a le choix pour n0 =⇒ vérifier pour T (2) (et T (3)) T (2) = 4 ≤ 2c
On peut aussi borner par f (n) = cn log n + b puisque cn log n + b ∈ O(n log n)
c≥2
I Ou même f (n) = cn log n + an + b
On fait la même chose pour T (3)...
... et on obtient que c doit être ≥ 2.
Algorithmes Récursifs 94 / 99 Algorithmes Récursifs 95 / 99
Méthode par substitution (Récurrence) Diviser pour régner
Théorème maître (général) - version simplifiée Théorème maître (général) - version simplifiée
On ne considère que les récurrences T (n) = aT (n/b) + Θ(nd ) (ou O(nd )) On ne considère que les récurrences T (n) = aT (n/b) + Θ(nd ) (ou O(nd ))
avec a ≥ 1, b > 1, d ≥ 0 avec a ≥ 1, b > 1, d ≥ 0
1 Si d > logb a, T (n) = Θ(nd ) complexité dominée par le coût de fusion 1 Si d > logb a, T (n) = Θ(nd ) complexité dominée par le coût de fusion
2 Si d < logb a, T (n) = Θ(nlogb a ) complexité dominée par le coût du sous-problème 2 Si d < logb a, T (n) = Θ(nlogb a ) complexité dominée par le coût du sous-problème
3 Si d = logb a, T (n) = Θ(nd log n) pas de domination 3 Si d = logb a, T (n) = Θ(nd log n) pas de domination
a = 2, b = 2, d = 1, log2 2 = 1 = d a = 1, b = 2, d = 0, log2 1 = 0 = d
On est donc dans le 3ème cas et la complexité en Θ(n log n) On est donc dans le cas 3 et la complexité en Θ(log n)