Glouton
Glouton
Partie II
Algorithmes gloutons 2 / 83
I L’approche force brute (recherche exhaustive, énumération) Avantage : Rapide en temps de calcul
I Paradigme diviser pour régner (et les algorithmes récursifs)
I Programmation dynamique
Inconvénient : Pas de garantie sur l’optimalité
c d
2
3
Voyageur de commerce (optimisation)
4
donnée : ensemble de villes 1
b
question : quel est le plus court cycle passant par toutes les villes une seule fois ? 5
7
c d c d
2 2
3 3
4 4
1 1
b b
5 5
7 7
a a
2 Villes –> 1
3 Villes –> 1
Idée gloutonne :
4 Villes –> 3
I Construction de la solution ville par ville selon l’ordre de visite
5 Villes –> 12 I À partir de la dernière ville visitée, choisir la ville la plus proche qui est non visitée.
(n−1)!
n Villes –> (la moitié du nombre de permutations possible de taille n − 1) I Arrêter quand on visite toutes les villes
2
I Ajouter la première ville pour construire un cycle.
40 villes –> à peu près 1046 solutions à tester !
Avec une machine moderne : 3 × 1029 années (plus que AgeUnivers 3 ) !
La recherche exhaustive est inefficace ! !
Complexité : O(n2 )
E = {1, 2, 3, 4}
I = {{}, {1}, {2}, {4}, {1, 4}, {2, 4}}
Un matroïde est un couple M = (E, I) qui satisfait les conditions suivantes : Preuve
I E est un ensemble fini non vide I E est un ensemble fini non vide (évident)
I I est un ensemble de sous ensembles de E tel que : I I est héréditaire car :
F Si H ∈ I, et F ⊂ H, alors F ∈ I (on dit que I est héréditaire) F Pour {2, 4} : {} ∈ I , {2} ∈ I , {4} ∈ I
F Si F ∈ I, H ∈ I et |F | < |H|, alors ∃x ∈ H \ F tel que F ∪ {x} ∈ I (propriété d’échange) F Pour {1, 4} : {} ∈ I , {1} ∈ I , {4} ∈ I
F Pour {1} : {} ∈ I , {1} ∈ I
F Pour {2} : {} ∈ I , {2} ∈ I
Si M = (E, I) est un matroïde et H ∈ I, alors H est appelé “sous ensemble F Pour {3} : {} ∈ I , {4} ∈ I
indépendant” F Pour {} : {} ∈ I
I Propriété d’échange :
F Pour H = {1, 4} et F = {2} : F ∪ {4} ∈ I
F Pour H = {2, 4} et F = {1} : F ∪ {2} ∈ I
F Pour H = {4} et F = {} : F ∪ {4} ∈ I
F ...
0 0 0 0 0 0 0 1 0 0 1 0 1 1
0 1 0 0 1 0 1 1 | {z }
N◦ de 0 = N◦ de bits =7 26 25 24 23 22 21 20
27 26 25 24 23 22 21 20
Principe additif
Chaque int requiert 4 octets : n × O(1) Les choix mutuellement exclusifs se combinent par addition.
Ex : combien de choix possibles de plats principal si on a 3 types de viande, 2 poisson
Même astuce que pour les entiers, le nombre d’éléments en préfixe : O(log n) et 3 plats végétariens ? 3 + 2 + 3 = 8 plats
Si L est un tableau contenant n int, alors |L| ∈ O(n) Combien de menus s’il y a 3 entrées, 4 plats, et 4 desserts ? 3 × 4 × 4 = 48 menus
Combien de valeurs possibles pour un int sur 32 bits ? 232 valeurs
un encodage est une fonction injective d’un type de donnée vers les mots binaires :
Principe des tiroirs f : T 7→ {0, 1}k avec f (x) ∈ {0, 1}|x|
Si m objets sont rangés dans n tiroirs, alors un tiroir en contient au moins d mn e.
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 Minorant pour la taille |x| d’une donnée x de type T
I Il y a plus d’un million de londoniens Soit #(T ) le nombre de valeurs possibles du type de donnée T , la mémoire
|x| nécessaire pour stocker une donné x ∈ T est telle que 2|x| ≥ #(T ), ⇒
I m londoniens à répartir parmi n chevelures possibles ⇒ au moins deux londoniens avec la
même chevelure
|x| ∈ Ω(log #(T ))
Calculons #(T ), le nombre de valeurs possibles pour la donnée x de type T : L’algorithme A est en Θ(f (x)) pour une donnée x
La taille |x| de la donnée est en Θ(g (x))
I Entier naturel inférieur ou égal à n : n + 1, soit Θ(n) Alors la complexité de A est en Θ(f (g −1 (x)))
Pour x un entier naturel inférieur ou égal à n : Exemple
|x| ∈ Ω(log n) et puisqu’il existe un encodage tel que |x| ∈ O(log n), alors |x| ∈ Θ(log n) Algorithme : Carré(x)
Données : un entier x
Résultat : un entier valant x 2 Complexité : Θ(x 2 )
I Tableau d’int de longueur n : (232 )n , soit Θ(232n )
r : entier;
n début Taille de la donnée |x| = Θ(log x)
232i , soit Θ(232n )
P
I Tableau d’int de longueur ≤ n : r ← 0;
i=0
pour i allant de 1 à x faire
I log2 (232n ) = 32nlog2 (2) = 32n pour j allant de 1 à x faire Autrement dit, x = Θ(2|x| )
r ← r + 1;
Pour L un tableau d’int de longueur ≤ n :
retourner r ; Donc complexité en Θ(22|x| ) (exponentielle !)
|L| ∈ Ω(n) et puisqu’il existe un encodage tel que |L| ∈ O(n), alors |L| ∈ Θ(n)
Le choix de la structure de données est très important dans la conception Un type abstrait est défini par les opérations qui sont efficaces sur ce type
d’un algorithme
Une réalisation correspond à du code (des algorithmes)
Choisir la structure pour laquelle les opérations utiles sont les plus efficaces
Type Abstrait Réalisation I A S SP SD SM
Un type abstrait est défini par les opérations qui sont efficaces sur ce type Pile Liste chainée O(1) Θ(n) Θ(n) Θ(n) O(1) Θ(n)
Liste chainée avec
File O(1) Θ(n) Θ(n) O(1) Θ(n) Θ(n)
pointeurs début et fin
I Insertion (I) : ajouter un nouvel élément Index statique Vecteur trié Θ(n) O(log n) Θ(n) N/A N/A Θ(n)
I test d’Appartenance (A) : vérifier si l’élément x est présent File de priorité Tas binaire O(log n) Θ(n) Θ(n) N/A N/A O(log n)
I Suppression (S) : supprimer un élément x O(1)∗ O(1)∗
I Suppression du Dernier (SD) : supprimer le dernier élément inséré Ensemble Table de hâchage O(1) N/A N/A Θ(n)
Θ(n) Θ(n)
I Suppression du Premier (SP) : supprimer le premier élément inséré ABR, AVL
I Suppression du Minimum (SM) : supprimer l’élément minimum Ensemble trié O(log n) O(log n) O(log n) N/A N/A O(log n)
Arbre rouge-noir
Fichier des étudiants de l’INSA, il faut une clé unique pour identification T [i − 1] T [i] T [i + 1]
1 67
2
3
Donnée : une liste L d’éléments comparables
2 67
3
5 3 6 Pour chaque x ∈ L :
Insérer x dans le tas binaire H
4 8 5 67
3
5 6 50 7 38 Tant que H n’est pas vide :
Extraire le minimum de H et l’afficher
8 12 9 95 67
3
1 2 3 4 5 6 7 8 9 10
réalisation :
22673 533675 6 8 673567 50 38 12 95 .367
parent de i : bi/2c n insertions en O(log n)
Tri par tas est optimal !
fils gauche de i : 2i
n suppressions en O(log n)
fils droit de i : 2i + 1 O(n log n) dans le pire des cas
Complexité du tri par tas : O(n log n)
Insertion : la position libre la plus à gauche possible sur le dernier niveau
I Percolation échange avec le parent jusqu’à ce que l’invariant soit rétabli O(log n)
Suppression 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)
Représentation des Données 40 / 83 Représentation des Données 41 / 83
Classes de Complexité Considérons les algorithmes de tri qui ne peuvent pas “lire” ces éléments, seulement
les comparer (e.g. un tableau de pointeurs vers une classe d’objets comparables).
On peut considérer que la donnée de l’algorithme est une table de longueur k avec les
résultats des comparaisons :
x = [0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1]
| {z }
k
Borne inférieure pour les algorithmes de tri La complexité d’un problème, à quoi ça sert ?
Théorème
Tout algorithme de tri par comparaison est en Ω(n log n) Pour pouvoir objectivement analyser un algorithme
I Optimalité
Problème de décision Q
Fonction Q : x →
7 {oui, non}
Instance : problème avec la donnée (“Combien vaut 5672 ?”, “Quel est le plus court
chemin entre Toulouse et Paris ?”)
Pour un problème d’optimisation, on peut généralement définir un problème
polynomialement équivalent dont la réponse est dans {oui, non}, :
Ne pas confondre problème et instance
Voyageur de commerce (optimisation)
donnée : ensemble de villes En particulier, se poser la question de la difficulté d’une instance n’a pas
(beaucoup ?) de sens
question : quel est le plus court chemin passant par toutes les villes ?
Voyageur de commerce (décision) I L’algorithme qui renvoie systématiquement, et sans calcul, la solution de cette instance
(correct et en O(1))
donnée : ensemble de villes, entier k
question : est-ce qu’il existe un chemin de longueur inférieure à k passant par toutes
les villes ?
polynomial si sa complexité dans le pire des cas est en O(nc ) avec c > 0
Tri ∈ (n log n)-TIME
nc Recherche dans un tableau trié ∈ (log n)-TIME
exponentiel si elle est en Θ(2 ) pour un certain c > 1
Recherche du maximum dans un tableau ∈ (n)-TIME
Tri
Inclusion
donnée: Une liste L d’objet comparables
Si f (n) ∈ O(g (n)) alors f (n)-TIME ⊆ g (n)-TIME
question: La séquence triée des objets de L
n2 -TIME
Tri n-TIME
(n log n)-TIME Max ?
(log n)-TIME
n-TIME
(n log n)-TIME
(log n)-TIME
Tri ∈ (n log n)-TIME
Tout algorithme de tri est en Ω(n log n) =⇒ Tri 6∈ n-TIME
La recherche du maximum est dans n-TIME, dans (log n)-TIME ?
Rappel :
f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n)) f (n)-TIME
Ensemble des problèmes pour lesquels il existe un algorithme en O(f (n))
Pour prouver qu’un problème appartient à la classe f (n)-TIME Classe des problèmes pour lesquels il existe un algorithme polynômial :
I il suffit d’un algorithme en O(f (n))
P-TIME ou simplement : P
Ensemble des problèmes pour lesquels il existe un algorithme en O(nc )
Pour prouver qu’un problème n’appartient pas à une classe inférieure
pour une constante c.
I il faut montrer que tout algorithme est en Ω(f (n))
[
P= nc -TIME
c≥0
EXP-TIME : On peut analyser l’espace mémoire utilisé par un algorithme de manière similaire
Evidemment, P ⊆ EXP-TIME
EXP-TIME P On ne compte pas la taille de la donnée, mais on compte la taille de la réponse
Est-ce que P ⊂ EXP-TIME ? Oui !
Il existe des problèmes en Ω(2n )
-1 -1 |1 1 -1 {z
1 -1 1 1} -1 -1 1 1 -1 1 Algorithme 2
3 Pi
s[i] = k=1 L[k]
Pj Pj Pi−1 Θ(1) tables de taille Θ(n)
Algorithme 1 3
I
k=i L[k] = k=1 L[k] − k=1 L[k]
Temps : Θ(n ) Temps : Θ(n)
min[i] = min(s[j] | j < i)
P1≤i ≤j ≤n:
Pour chaque Espace : Θ(log n) Espace : Θ(n)
calculer jk=i L[k] ; garder le max. I log n pour le max, la somme et le resultat
max[i] = max(s[j] | j ≥ i)
mss[i] = maxi − mini
Théorème
f (n)-TIME ⊆ f (n)-SPACE
Théorème
Classe des problèmes pour lesquels il existe un algorithme polynômial en espace : P-SPACE ⊆ EXP-TIME
P-SPACE Un problème A dans P-SPACE admet un algorithme qui utilise O(nc ) octets
Ensemble des problèmes pour lesquels il existe un algorithme qui utilise Cet algorithme est constitué de k ∈ Θ(1) instructions (' lignes de code)
O(nc ) octets de mémoire pour une constante c. c
La mémoire utilisée par cet algorithme peut être dans O(2(8n) ) configurations
c c
Il y a donc O(k2(8n) ) = O(2(n) ) configurations possibles
[
= P-SPACE nc -SPACE
c≥0 Si l’algorithme passe deux fois par la même configuration il ne s’arrête jamais
Est-ce que P-SPACE est inclu dans EXP-TIME, EXP-TIME inclu dans
P-SPACE, ou ni l’un ni l’autre ? EXP-TIME P-SPACE P
Problèmes “intermédiaires”
EXP-TIME P-SPACE ? P
Les Classes NP et coNP
EXP-TIME P-SPACE ?NP P Pas d’algorithme en temps polynomial connu, mais aucune preuve d’impossibilité
TSP
donnée: Un ensemble de villes S, une matrice de distance D : S × S 7→ N, un entier k ?
question: Est-ce qu’il existe une route de longueur au plus k passant par toutes les villes ?
Algorithme de vérification
Algorithme : verification(L, G )
Certificat : La coloration (tableau – couleur du i-ème sommet dans la case i)
Données : un graphe G = (S, A) et un tableau T
Résultat : vrai si T est une 3-coloration de G , faux sinon
début
De taille polynomiale (dans la TDLD) pour chaque arrête (i, j) de A faire
si T [i] = T [j] alors
retourner faux ;
I quelle est la taille de la donnée du problème ?
taille : |G | = Θ(|S| + |A|)
retourner vrai ;
I quelle est la taille du certificat ? Complexité : O(|A|) (liste d’adjacence)
taille : Θ(|S|)
Vérifiable en temps polynomial (dans la TDLD) : algorithme ⇒ 3-Coloration est bien dans NP
P et NP P, NP et la Cryptographie
Système d’authentification A
P est la classe des problèmes “faciles à résoudre” comparaison entre
I une clé privée y (mot de passe / pin)
I et une information publique x (login / carte bancaire)
NP est la classe des problèmes “faciles à vérifier”
autorise la transaction si et seulement si A(x) = y
I On ne connait pas d’algorithme polynomial pour Voyageur de commerce ou 3-Coloration Supposons que vérifier A(x) = y ne soit pas polynomial : authentifier est difficile !
I Montrer qu’un problème n’est pas dans P est difficile : tout algorithme est en Ω(2n )
La réponse “oui” est accompagnée d’un certificat grace auquel on peut vérifier que la
réponse est correcte
Problème complémenaire
Si la réponse est “non”...il faut faire confiance ! Le Problème complémenaire co-A d’un problème de décision A, est le
problème qui associe la réponse “non” à toute donnée associée à “oui” dans
I Ou alors vérifier avec un algorithme qui n’est pas polynomial A, et vice versa.
EXP-TIME
Soit un algorithme non-déterministe en O(nc ) temps, et donc mémoire.
P-SPACE
il existe un algorithme déterministe qui n’utilise pas plus d’espace :
N
N
Le certificat nécessite un espace fini (vérifiable en O(nc ) pour une donnée de taille n)
P
I
co
c P
I Il y a donc un nombre fini de certificat : O(2n ) ..
.
c
I On génère et verifie tous les certificats (en temps O(nc 2n ))
n-TIME
.
..