Ce formulaire rassemble, par thème et non par chapitre, ce qu'il faut avoir sous les yeux la veille d'un examen: la notation du cours, les définitions asymptotiques, le théorème maître et les récurrences résolues, les trois grandes tables de coûts — tris, structures de données, algorithmes de graphes —, les quatre patrons de conception avec l'obligation de démonstration attachée à chacun, et le vocabulaire de la -complétude. Chaque entrée renvoie au chapitre qui la démontre: ce qui est ici est un aide-mémoire, pas une preuve, et une formule qu'on ne saurait pas justifier n'est pas une formule qu'on sait.
Deux avertissements de lecture. Premièrement, aucun coût n'est donné sans son régime: «dans le pire des cas», «en moyenne sous telle loi» ou «amorti». C'est la règle du chapitre 1 et c'est l'imprécision la plus fréquente du domaine; les tables ci-dessous portent donc une colonne pour cela. Deuxièmement, les rappels mathématiques — sommes usuelles, nombres harmoniques, logarithmes, récurrence, indicatrices et espérance — ne sont pas repris ici: ils sont à l'annexe A, dont les énoncés sont numérotés A.1 à A.9.
Notation
| Objet | Notation |
|---|---|
| Taille de l'entrée | |
| Graphe | , , |
| Classes asymptotiques | , , , |
Les indices sont à base 0 et les tranches semi-ouvertes, y compris pour les intervalles de temps du chapitre 9: une tâche qui finit en 13 et une tâche qui commence en 13 sont compatibles. Lorsqu'un résultat classique est énoncé à base 1 dans la littérature (Knuth, CLRS), ce cours le réénonce à base 0 — c'est pourquoi les enfants d'un nœud de tas sont ici et , et non et .
Croissance asymptotique
Définitions du chapitre 1. Démontrer une appartenance à , c'est exhiber un couple ; une démonstration qui ne nomme pas son et son n'en est pas une. Le renversement du quantificateur dans est l'essentiel: la majoration doit y valoir pour toute constante. Quand les limites existent, équivaut à .
est un ensemble: l'écriture correcte est . L'abus est admis dans le fil du texte et ne se lit que de gauche à droite: de et on ne conclut pas .
| Règle | Énoncé |
|---|---|
| Réflexivité | |
| Constante | pour |
| Transitivité | et donnent |
Théorème 1.1 pour la transitivité, théorème 1.2 pour le polynôme. La base d'un logarithme s'oublie — par changement de base — mais jamais un exposant: et .
Chaque classe est un de la suivante. Un polynôme de degré à coefficient dominant positif est dans (théorème 1.2), et avec les constantes explicites et pour (théorème 1.3) — c'est cette minoration qui donne la borne des tris.
| rapport | |||
|---|---|---|---|
| 100 | 664 | 10 000 | 15 |
| 1 000 | 9 966 | 100 | |
| 10 000 | 132 877 |
| Classe | Taille atteinte pour opérations |
|---|---|
| pratiquement illimitée | |
Recherche dichotomique: examens au pire, soit 10 pour mille éléments, 20 pour un million, 30 pour un milliard. Doubler la vitesse de la machine fait gagner un élément sur une entrée traitée en .
Récurrences et théorème maître
Le nombre de feuilles de l'arbre de récursion vaut , et est l'exposant critique. Les trois cas du théorème 2.1 comparent l'exposant de à .
| Cas | Hypothèse sur | Conclusion | Qui domine |
|---|---|---|---|
| 1 | , |
La condition de régularité du cas 3 est: il existe avec pour assez grand. Elle est automatique pour avec . Les cas 1 et 3 exigent un écart , un facteur — et c'est ce qui laisse une de part et d'autre du cas 2:
Aucun des trois cas ne couvre ces deux récurrences: le facteur n'est pour aucun . Quand le raccourci ne s'applique pas, on redessine l'arbre — c'est la méthode qui a démontré le théorème, et elle ne tombe jamais en panne.
| Récurrence | Cas | Solution | Où | |||
|---|---|---|---|---|---|---|
| 1 | 2 | 0 | 2 | dichotomie, ch. 2 | ||
Trois récurrences hors du théorème, à connaître par leur solution:
La deuxième dit que le déséquilibre ne tue pas, tant qu'il reste d'un facteur constant; la troisième que suffit à rendre la somme géométrique convergente. Ce qui tue un algorithme récursif, c'est un découpage qui détache une part de taille constante, comme la première.
Tris
Convention de comptage du cours, sans laquelle aucun des nombres ci-dessous n'a de sens: une comparaison par test entre deux éléments du tableau y compris celui qui fait sortir de la boucle intérieure du tri par insertion, et rien quand l'indice tombe hors du tableau par la gauche; une comparaison par comparaison de deux éléments à l'intérieur de la boucle de fusion, les queues recopiées ne coûtant rien; une comparaison par tour de la boucle de partition de Lomuto. Le même tri par insertion donne 14, 15 ou 21 sous trois conventions défendables.
| Tri | Pire des cas | En moyenne | Mémoire | Stable | En place |
|---|---|---|---|---|---|
| Insertion | oui | oui | |||
| Sélection |
La moyenne est prise sur la loi uniforme des permutations, sauf pour le tri rapide randomisé, où elle est prise sur les tirages de l'algorithme et vaut alors pour toute entrée. La mémoire du tri rapide est celle de la pile de récursion; son travail proprement dit est en place. Chapitre 3 pour tout ce tableau, chapitre 5 pour le tri par tas.
| Fusion, pire | |||
|---|---|---|---|
| 5 | 7 | 8 | 11,6 |
| 7 | 13 | 14 | 19,7 |
| 10 | 22 | 25 | 33,2 |
| 16 | 45 | 49 | 64,0 |
| 100 | 525 | 573 | 664 |
| 1000 | 8 530 | 8 977 | 9 966 |
La borne porte sur un problème, dans un modèle, au pire des cas: les trois qualificatifs sont nécessaires. Elle n'interdit à aucune entrée particulière d'être triée en moins; elle ne concerne pas les algorithmes qui regardent les valeurs au lieu de seulement les comparer. C'est par là que passent les tris linéaires — et ils paient cette sortie: connaître la nature des clés, dépendre d'un second paramètre ou , consommer de la mémoire. Sur entiers distincts, et le tri par base redevient : la borne a le dernier mot dès qu'on compte honnêtement.
Sélection du -ième (chapitre 3). quickselect ne récurse que d'un côté: comparaisons en moyenne (borne explicite par ), au . La garantit au pire par un pivot qui écarte au moins éléments de chaque côté. En pratique on combine les deux (), comme l' protège le tri rapide par le tri par tas.
Quel est l'énoncé exact de la borne inférieure des tris par comparaison?
Structures de données
La colonne «régime» est le cœur de cette table. Un coût amorti est un pire des cas portant sur une suite d'opérations, sans aucune hypothèse probabiliste: il vaut même contre un adversaire, et il ne promet rien sur une opération isolée. Un coût moyen est une espérance sous une loi énoncée: il ne borne rien et ne vous concerne que si vos données suivent cette loi. Un coût de pire des cas borne chaque opération prise séparément. Les trois ne s'échangent jamais.
| Structure | Opération | Coût | Régime |
|---|---|---|---|
| Tableau dynamique | lire l'indice | pire | |
| ajouter en fin | amorti | ||
| insérer au milieu | pire | ||
| Liste simple | lire l'indice | pire | |
| insérer après un nœud connu | pire | ||
| supprimer un nœud connu |
«HUS» est l'hypothèse de hachage uniforme simple: chaque clé a la probabilité d'aller dans chaque paquet, indépendamment des autres. C'est une hypothèse sur la loi conjointe des clés et de la fonction, pas une propriété d'un algorithme: pour une fonction fixée, un adversaire ramène toujours le pire des cas à . La parade est le hachage universel, qui tire au hasard au démarrage — c'est ce que fait Python pour les chaînes depuis la version 3.3.
Amortissement: les trois méthodes (chapitre 4). L'agrégat divise le coût total par le nombre d'opérations. Le comptable affiche un prix par opération et vérifie que la caisse ne devient jamais négative. Le potentiel est le seul qui se transporte:
à condition que pour tout . Potentiels à connaître: pour le tableau qui double (théorème 4.1, coût amorti 3 écritures, borne serrée), pour la file par deux piles (théorème 4.2, au plus opérations de pile), pour le redimensionnement d'une table de hachage.
Théorèmes 4.3 et 4.4. L'espérance n'est pas le maximum: à et , la plus longue chaîne mesure environ 5,5 maillons pour une espérance de 1, et croît comme .
| Résolution | Infructueuse | Fructueuse |
|---|---|---|
| Chaînage | ||
| Hachage uniforme |
Le carré au dénominateur est le prix des amas primaires: à , la recherche infructueuse demande sondes en sondage linéaire contre en hachage uniforme. Le double hachage , avec premier avec , supprime l'amas primaire; il subsiste un amas secondaire, négligeable.
Arbres (chapitre 5), hauteur comptée en arêtes, l'arbre vide valant :
est le nombre minimal de nœuds d'un AVL de hauteur : Un AVL de mille nœuds a une hauteur d'au plus 13, contre 9 pour l'arbre parfait et 999 pour le peigne. Un tas est complet, donc de hauteur exactement sans le moindre effort d'équilibrage; ses indices sont , et , et les feuilles sont les indices à .
Union-find (chapitre 8): l'union par rang garantit qu'une racine de rang porte au moins éléments, donc et un trouver en — borne atteinte. La compression de chemin ne met jamais les rangs à jour: le rang cesse d'être la hauteur pour n'en rester qu'un majorant, ce qui suffit. Ensemble, coût amorti , (Tarjan 1975), et optimal. pour toute entrée concevable — mais tend vers l'infini, donc «quasi constant» ne s'écrit pas .
Une table de hachage en adressage ouvert contient 3000 clés dans 4000 cases. Combien de sondes une recherche infructueuse demande-t-elle en moyenne en sondage linéaire?
Graphes
, sommets, arêtes. Lemme des poignées de main: , d'où maillons dans une liste d'adjacence et le nombre de sommets de degré impair toujours pair. Pour un graphe non orienté simple, . Un arbre à sommets a arêtes; un graphe à composantes a au moins arêtes, avec égalité si et seulement si c'est une forêt.
| Opération | Liste d'adjacence | Matrice |
|---|---|---|
| Espace | ||
| Tester une arête | ||
| Énumérer les voisins |
Presque tous les algorithmes énumèrent des voisinages au lieu de tester des arêtes: la liste gagne, sauf sur un graphe dense ou quand le test d'existence domine.
| Algorithme | Coût | Hypothèse | Ce qui la casse |
|---|---|---|---|
| Parcours en largeur | arêtes de poids 1 | un poids quelconque | |
| Parcours en profondeur | aucune | — | |
| Tri topologique | orienté sans circuit | un circuit | |
| Dijkstra, tas |
Comme , on a : Kruskal et Prim au tas sont dans la même classe, et le choix se fait ailleurs. Sur un graphe creux les deux se valent; sur un graphe dense, c'est Prim au tableau qui gagne, parce que payer un logarithme par arête coûte quand on doit de toute façon lire toutes les arêtes. Si les poids sont de petits entiers, un tri par dénombrement rend Kruskal quasi linéaire, en . Le coût de Kruskal est , et c'est tout ce qu'il y a à retenir.
Relaxation (chapitre 7), l'unique opération dont Dijkstra, Bellman–Ford et le passage par un ordre topologique sont faits:
L'inégalité est stricte: à égalité l'arbre des prédécesseurs ne change pas, ce qui rend les traces reproductibles et — plus important — ce qui permet à Bellman–Ford de détecter un circuit négatif. Invariants: ; toujours; ne remonte jamais; toute valeur atteinte reste (théorème 7.1). : tout sous-chemin d'un plus court chemin est un plus court chemin (théorème 7.2) — faux pour le plus long chemin, et c'est ce qui le rend difficile.
Bellman–Ford: passes suffisent parce qu'un plus court chemin élémentaire a au plus arêtes; une -ième passe qui réussit encore prouve un circuit négatif, car aucune affectation de valeurs finies ne peut satisfaire toutes les inégalités triangulaires autour d'un tel circuit.
Floyd–Warshall: , où est le nombre de sommets — ni un temps ni un nombre d'arêtes. C'est pourquoi la boucle sur doit être la plus : à l'intérieur, elle mélange des autorisations différentes et produit des valeurs fausses sur une case et justes sur les autres. Un après exécution signale un circuit négatif, et le reste de la matrice ne veut alors plus rien dire.
Propriété de coupe (théorème 8.2): si est contenu dans un arbre couvrant minimal, si la coupe respecte — aucune arête de ne la traverse — et si est de poids minimal parmi les traversantes, alors est encore contenu dans un arbre couvrant minimal. Sa jumelle, la propriété de cycle (théorème 8.3): une arête strictement la plus lourde d'un cycle n'appartient à aucun arbre couvrant minimal. Enfin: des poids deux à deux distincts entraînent l'unicité de l'arbre couvrant minimal, la réciproque est fausse, et le poids de l'arbre est de toute façon unique.
Patrons de conception
Quatre schémas, chacun avec l'obligation de démonstration qui lui est attachée. C'est l'obligation qui distingue un algorithme d'une conviction.
| Méthode | Ce qu'elle essaie | Ce qu'elle coûte | Démontré par |
|---|---|---|---|
| Diviser pour régner | un découpage | un tri ou un balayage | ch. 2 |
| Glouton | un seul premier choix | un tri | ch. 9 |
| Programmation dynamique | tous les premiers choix | une table | ch. 10 |
| Séparation et évaluation | tous, moins ceux qu'on élague | exponentiel | ch. 11 |
La différence entre le glouton et la programmation dynamique tient en une phrase: les deux exigent la sous-structure optimale; le glouton n'essaie qu'un premier choix, la table les essaie tous. Le glouton n'est donc légitime que lorsqu'on a démontré que ce choix-là n'a pas besoin d'être comparé aux autres.
Remettez dans l'ordre les étapes d'un argument d'échange démontrant qu'un algorithme glouton est optimal.
Glissez les éléments pour les mettre dans le bon ordre
- Remplacer ce choix par celui du glouton, obtenant une solution
- Conclure que la solution gloutonne s'obtient en un nombre fini d'échanges
- Repérer le premier choix sur lequel diffère de la solution gloutonne
- Prendre une solution optimale quelconque , sans rien supposer d'autre
- Vérifier que est encore admissible, puis que sa valeur n'est pas dégradée
P, NP et approximation
| Terme | Définition |
|---|---|
| Taille d'une instance | la longueur de son codage en bits |
| Pseudo-polynomial | polynomial en la valeur des nombres, exponentiel en leur écriture |
| décidable en temps polynomial | |
| vérifiable en temps polynomial, par un certificat de taille polynomiale | |
| polynomiale avec positive si et seulement si positive |
, et : au moins l'une des deux premières inclusions est stricte, on ne sait pas laquelle. Un seul problème -complet dans donnerait . La -complétude de SAT et de 3-SAT est le , admis; tout le reste s'obtient par réductions, à la manière de Karp (1972).
Le certificat de ne couvre que le oui: rien, dans «ce graphe n'a aucun cycle hamiltonien», ne se certifie brièvement de façon évidente, et savoir si est une seconde question ouverte.
| Problème | Question de décision | Certificat |
|---|---|---|
| SAT, 3-SAT | la formule est-elle satisfaisable? | une affectation |
| Couverture par sommets | une couverture de taille ? | l'ensemble |
| Clique | sommets deux à deux adjacents? | les sommets |
| Ensemble indépendant | sommets deux à deux non adjacents? | les sommets |
| Cycle hamiltonien | un cycle passant une fois par sommet? | l'ordre des sommets |
| Voyageur de commerce | une tournée de longueur ? | l'ordre des villes |
| Partition | deux parts de même somme? | l'une des parts |
| Sac à dos | poids et valeur ? |
Les trois derniers du catalogue sont liés par des transformations triviales: est une couverture si et seulement si est un ensemble indépendant, et est une clique de si et seulement si est un ensemble indépendant de . Une réduction transporte la difficulté exacte; elle ne transporte pas l'approximabilité.
| Problème | Meilleure garantie connue |
|---|---|
| Couverture par sommets | 2, par couplage maximal |
| Voyageur métrique | (Christofides); 2 par l'arbre couvrant |
| Sac à dos 0/1 | pour tout |
| Ensemble indépendant | aucune constante, sauf si |
| Voyageur général | aucune constante, sauf si |
Le mécanisme de toute démonstration d'approximation est là: l'algorithme ne connaît pas , mais il connaît une minoration calculable de — ici , là le poids d'un arbre couvrant minimal — et il borne son résultat par un multiple de cette minoration. Pour le voyageur métrique: parce qu'une tournée privée d'une arête est un arbre couvrant; la marche qui double l'arbre coûte ; les raccourcis ne coûtent rien par l'inégalité triangulaire. Sans cette hypothèse, aucune garantie constante n'existe: le même problème passe de «2-approché» à «inapprochable», et l'hypothèse porte tout le résultat.
pour le sac à dos est pseudo-polynomial: s'écrit en bits, donc le coût est exponentiel en la taille de l'entrée. Cent objets et des poids de quarante bits donnent cases pour une instance de 4000 bits. Le même piège attend le test de primalité par divisions jusqu'à .
Les données témoins du cours
Tous les chapitres travaillent sur les mêmes données. Voici leurs valeurs fixées, rassemblées pour servir de contrôle: si un calcul refait à la main ne les retrouve pas, c'est le calcul qui se trompe.
Tableau témoin a = [38, 27, 43, 3, 9, 82, 10], trié [3, 9, 10, 27, 38, 43, 82].
| Quantité | Valeur |
|---|---|
| Tri par insertion | 15 comparaisons, 11 décalages |
| Tri par insertion, trié / inversé | 6 / 21 comparaisons |
| Tri fusion | 13 comparaisons, en six fusions |
| Tri rapide, Lomuto | 11 comparaisons, en quatre partitions |
| Tri rapide sur le tableau trié | 21 comparaisons |
| Tri par tas | 19 comparaisons (8 pour Floyd, 11 d'extraction) |
quickselect de la médiane | 10 comparaisons, valeur 27 |
| ABR témoin | racine 38, hauteur 4 arêtes |
| Peigne (clés triées) | hauteur 6 |
| Min-tas de Floyd | [3, 9, 10, 27, 38, 82, 43] |
| Max-tas de Floyd | [82, 27, 43, 3, 9, 38, 10] |
Graphe témoin, non orienté, 7 sommets et 11 arêtes de poids , , , , , , , , , , , de somme 52.
| Quantité | Valeur |
|---|---|
| Degrés | 2, 3, 4, 4, 4, 3, 2, de somme |
| Dijkstra depuis | |
| Ordre d'extraction |
Table de hachage témoin: , , clés 22, 31, 4, 15, 28, 17, 88, 59 dans cet ordre. Images . Par chaînage: , , , . Par sondage linéaire: pour , et .
Huffman: , , , , , . Codes , , , , , ; contre 300, soit par caractère. Le coût total est aussi la somme des poids des nœuds internes, .
Sac à dos: , , , , . Dernière ligne de la table [0, 0, 3, 4, 5, 8, 8, 11, 12, 13].
| Question | Réponse |
|---|---|
| Glouton par rapport , version 0/1 | 11, par , deux unités perdues |
| Optimum 0/1 | 13, par , poids exactement 9, unique |
| Optimum fractionnaire | 41/3, soit , , puis deux tiers de |
L'ordre n'est pas un accident: l'optimum fractionnaire majore toujours l'optimum 0/1, puisque toute solution 0/1 est une solution fractionnaire particulière. Sur cette seule instance, les critères «valeur décroissante» et «poids décroissant» trouvent 13 — la bonne réponse pour la mauvaise raison. La seconde instance, avec , , , d'optimum par , les réfute: chacun des quatre critères usuels trouve l'optimum sur l'une des deux instances et le manque sur l'autre.
Sous-séquence commune: ALGORITHME et LOGARITHME ont une plus longue sous-séquence commune de longueur 8 — LGRITHME, ou LORITHME selon la règle de départage, la longueur étant unique et la sous-séquence non — et une distance d'édition de 3, atteinte par trois substitutions.
Références
- Cormen, Leiserson, Rivest & Stein, Introduction to Algorithms, 4ᵉ éd., MIT Press — la référence de tout ce formulaire; l'annexe A de l'ouvrage pour les sommes, le chapitre 4 pour le théorème maître, le chapitre 16 pour l'analyse amortie.
- Cormen, Leiserson, Rivest & Stein, Algorithmique, 3ᵉ éd., Dunod — la traduction française, utile pour fixer le vocabulaire: «coût amorti», «arête sûre», «sous-structure optimale», «vérificateur».
- Sedgewick & Wayne, Algorithms, 4ᵉ éd., Addison-Wesley — les tables de coûts comparées et les variantes d'implémentation, avec des mesures plutôt que des classes.
- Kleinberg & Tardos, Algorithm Design, Pearson — la meilleure exposition des quatre patrons de conception, et la distinction décision / optimisation traitée explicitement.
- Garey & Johnson, Computers and Intractability, Freeman — le catalogue des problèmes -complets, à consulter quand un problème nouveau ressemble à un problème connu.