Post on 10-Oct-2020
Algorithmique et Analyse d’Algorithmes
Algorithmique et Analyse d’AlgorithmesL3 Info
Cours 9 : Arbres partiellement ordonnés
Diviser pour régner
Benjamin Wack
2020 – 2021
1 / 32
Algorithmique et Analyse d’Algorithmes
La dernière foisI CodageI EntropieI Algorithme de Huffman
Aujourd’hui
I Arbre partiellement ordonné, tasséI Structure de tasI Application à la FAP
I Diviser pour régner
2 / 32
Algorithmique et Analyse d’Algorithmes
Plan
Arbre partiellement ordonné, tasséArbre partiellement ordonnéArbre tassé
Structure de tasDéfinition et applicationsOpérations
Diviser pour Régner
3 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre partiellement ordonné
Plan
Arbre partiellement ordonné, tasséArbre partiellement ordonnéArbre tassé
Structure de tasDéfinition et applicationsOpérations
Diviser pour Régner
4 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre partiellement ordonné
DéfinitionOn suppose qu’on sait comparer les clés choisies pour les nœuds.Arbre ordonnéUn arbre est ordonné si tout nœud a une clé inférieure ou égale à cellesde chacun de ses fils (s’ils existent).
B
F
H G
J
F
D
Ici par exemple à la racine B est bien inférieur à D, J et F ; il en va demême pour tous les autres nœuds. On remarque en revanche :I qu’aucun ordre particulier n’est imposé entre les nœuds « frères ».I qu’un nœud « haut » (ici J par exemple) peut parfois être supérieur
à un nœud « bas » (comme la feuille F), du moment que ces nœudsne sont pas sur une même branche.
5 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre partiellement ordonné
DéfinitionOn suppose qu’on sait comparer les clés choisies pour les nœuds.Arbre ordonnéUn arbre est ordonné si tout nœud a une clé inférieure ou égale à cellesde chacun de ses fils (s’ils existent).
B
F
H G
J
F
D
Ici par exemple à la racine B est bien inférieur à D, J et F ; il en va demême pour tous les autres nœuds. On remarque en revanche :I qu’aucun ordre particulier n’est imposé entre les nœuds « frères ».I qu’un nœud « haut » (ici J par exemple) peut parfois être supérieur
à un nœud « bas » (comme la feuille F), du moment que ces nœudsne sont pas sur une même branche.
5 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre partiellement ordonné
PropriétésOn se limitera dans ce cours à des arbres binaires :I les algorithmes et propriétés présentées ici restent valablesI mais leur implémentation est facilitée (cf TD1 numéro 9)
H
E
B
R
K
N
I Propriété : Chaque sous-arbre d’un arbre ordonné est lui-même unarbre ordonné (par définition)
I Propriété : Dans tout chemin de l’arbre (d’un nœud vers une feuille),les clés sont en ordre croissant (par définition)
I La racine d’un arbre ordonné contient la clé de valeur minimumparmi les clés de l’arbre.(On peut le démontrer par récurrence structurelle sur l’arbre)
6 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre partiellement ordonné
PropriétésOn se limitera dans ce cours à des arbres binaires :I les algorithmes et propriétés présentées ici restent valablesI mais leur implémentation est facilitée (cf TD1 numéro 9)
H
E
B
R
K
N
I Propriété : Chaque sous-arbre d’un arbre ordonné est lui-même unarbre ordonné (par définition)
I Propriété : Dans tout chemin de l’arbre (d’un nœud vers une feuille),les clés sont en ordre croissant (par définition)
I La racine d’un arbre ordonné contient la clé de valeur minimumparmi les clés de l’arbre.(On peut le démontrer par récurrence structurelle sur l’arbre)
6 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre partiellement ordonné
PropriétésOn se limitera dans ce cours à des arbres binaires :I les algorithmes et propriétés présentées ici restent valablesI mais leur implémentation est facilitée (cf TD1 numéro 9)
H
E
B
R
K
N
I Propriété : Chaque sous-arbre d’un arbre ordonné est lui-même unarbre ordonné (par définition)
I Propriété : Dans tout chemin de l’arbre (d’un nœud vers une feuille),les clés sont en ordre croissant (par définition)
I La racine d’un arbre ordonné contient la clé de valeur minimumparmi les clés de l’arbre.(On peut le démontrer par récurrence structurelle sur l’arbre)
6 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre tassé
Plan
Arbre partiellement ordonné, tasséArbre partiellement ordonnéArbre tassé
Structure de tasDéfinition et applicationsOpérations
Diviser pour Régner
7 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre tassé
Définition
RappelsLa hauteur d’un arbre est la longueur maximum d’un chemin.Le niveau d’un nœud est la longueur de son chemin d’accès.
Arbre tassé
Un arbre binaire de hauteur h est tassé si :I Tous les nœuds internes ont deux fils,
sauf éventuellement le dernier dansl’ordre du parcours en largeur.
I Les feuilles du dernier niveau h sont « tassées à gauche ».Remarquons alors que :I les feuilles de niveau h − 1 sont « tassées à droite »I les nœuds internes de niveau h − 1 sont « tassés à gauche ».
8 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre tassé
Définition
RappelsLa hauteur d’un arbre est la longueur maximum d’un chemin.Le niveau d’un nœud est la longueur de son chemin d’accès.
Arbre tassé
Un arbre binaire de hauteur h est tassé si :I Tous les nœuds internes ont deux fils,
sauf éventuellement le dernier dansl’ordre du parcours en largeur.
I Les feuilles du dernier niveau h sont « tassées à gauche ».Remarquons alors que :I les feuilles de niveau h − 1 sont « tassées à droite »I les nœuds internes de niveau h − 1 sont « tassés à gauche ».
8 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre tassé
Propriétés d’un arbre tassé
StructureI Tous les niveaux sont complets (contiennent le maximum possible de
nœuds), sauf éventuellement le dernier niveau h.I Remarquons aussi que le dernier nœud interne (dans l’ordre du
parcours en largeur) est le seul qui peut être unaire (et cela arrive siet seulement si n est pair).
Hauteur et nombre de nœudsI Le nombre de nœuds de chaque niveau (complet) i est 2i .I Le nombre total de nœuds est donc :
n = 2h − 1 (niveaux complets de 0 à h − 1)+ x où 0 < x ≤ 2h (dernier niveau)
I Par conséquent h = blog2 nc (ce sera important pour la complexité).
9 / 32
Algorithmique et Analyse d’AlgorithmesArbre partiellement ordonné, tassé
Arbre tassé
Propriétés d’un arbre tassé
StructureI Tous les niveaux sont complets (contiennent le maximum possible de
nœuds), sauf éventuellement le dernier niveau h.I Remarquons aussi que le dernier nœud interne (dans l’ordre du
parcours en largeur) est le seul qui peut être unaire (et cela arrive siet seulement si n est pair).
Hauteur et nombre de nœudsI Le nombre de nœuds de chaque niveau (complet) i est 2i .I Le nombre total de nœuds est donc :
n = 2h − 1 (niveaux complets de 0 à h − 1)+ x où 0 < x ≤ 2h (dernier niveau)
I Par conséquent h = blog2 nc (ce sera important pour la complexité).
9 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Définition et applications
Plan
Arbre partiellement ordonné, tasséArbre partiellement ordonnéArbre tassé
Structure de tasDéfinition et applicationsOpérations
Diviser pour Régner
10 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Définition et applications
Définition
Tas binaireUn tas (heap en anglais) est un arbre binaire à la fois tassé et ordonné.
E
H N
F
R
P K
B
T
I Ce n’est pas vraiment un type abstrait(en particulier il sert à réaliser une File à Priorités efficace)
I Mais on a encore le choix de la représentation de l’arbre en mémoire.(on verra en TD1 qu’il vaut mieux éviter une forme chaînée)
RemarqueNe pas confondre avec la zone d’allocation dynamique en mémoire.
11 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Définition et applications
Définition
Tas binaireUn tas (heap en anglais) est un arbre binaire à la fois tassé et ordonné.
E
H N
F
R
P K
B
T
I Ce n’est pas vraiment un type abstrait(en particulier il sert à réaliser une File à Priorités efficace)
I Mais on a encore le choix de la représentation de l’arbre en mémoire.(on verra en TD1 qu’il vaut mieux éviter une forme chaînée)
RemarqueNe pas confondre avec la zone d’allocation dynamique en mémoire.
11 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Définition et applications
Définition
Tas binaireUn tas (heap en anglais) est un arbre binaire à la fois tassé et ordonné.
E
H N
F
R
P K
B
T
I Ce n’est pas vraiment un type abstrait(en particulier il sert à réaliser une File à Priorités efficace)
I Mais on a encore le choix de la représentation de l’arbre en mémoire.(on verra en TD1 qu’il vaut mieux éviter une forme chaînée)
RemarqueNe pas confondre avec la zone d’allocation dynamique en mémoire.
11 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Définition et applications
Applications du tas
Réalisation d’une file à priorités efficace
I On compare les nœuds de l’arbre selon leur priorité(Remarque : on peut aussi construire un tas max de la même façon)
I Le nœud prioritaire (racine) est accessible en temps constantI Pas d’information superflue à maintenir (moins que dans un ABR
par exemple)
On retrouvera donc un tas dans tous les algorithmes qui demandent degérer des priorités :I Algorithme de HuffmanI Algorithmes de graphes (Prim cours 11, Dijkstra semestre 6)
Application « évidente » : tri par tas (heapsort)I Insérer les éléments à trier dans un tas, puis les extraire un par un.I C’était la motivation initiale de cette structure.
12 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Définition et applications
Applications du tas
Réalisation d’une file à priorités efficace
I On compare les nœuds de l’arbre selon leur priorité(Remarque : on peut aussi construire un tas max de la même façon)
I Le nœud prioritaire (racine) est accessible en temps constantI Pas d’information superflue à maintenir (moins que dans un ABR
par exemple)
On retrouvera donc un tas dans tous les algorithmes qui demandent degérer des priorités :I Algorithme de HuffmanI Algorithmes de graphes (Prim cours 11, Dijkstra semestre 6)
Application « évidente » : tri par tas (heapsort)I Insérer les éléments à trier dans un tas, puis les extraire un par un.I C’était la motivation initiale de cette structure.
12 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Définition et applications
Applications du tas
Réalisation d’une file à priorités efficace
I On compare les nœuds de l’arbre selon leur priorité(Remarque : on peut aussi construire un tas max de la même façon)
I Le nœud prioritaire (racine) est accessible en temps constantI Pas d’information superflue à maintenir (moins que dans un ABR
par exemple)
On retrouvera donc un tas dans tous les algorithmes qui demandent degérer des priorités :I Algorithme de HuffmanI Algorithmes de graphes (Prim cours 11, Dijkstra semestre 6)
Application « évidente » : tri par tas (heapsort)I Insérer les éléments à trier dans un tas, puis les extraire un par un.I C’était la motivation initiale de cette structure.
12 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Plan
Arbre partiellement ordonné, tasséArbre partiellement ordonnéArbre tassé
Structure de tasDéfinition et applicationsOpérations
Diviser pour Régner
13 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Ensemble minimal d’opérationsTas_Vide : void → TasEst_Vide : Tas → bool
Insérer : Element × Tas → voidAjoute (par effet de bord) l’élément à ceux déjà présents.Au besoin, réorganise les éléments pour conserver un tas.
Trouver_Min : Tas → ElementPermet de consulter l’élément minimum sans modifier letas (pas d’effet de bord, il suffit de consulter la racine).
Extraire_Min : Tas → voidSupprime (par effet de bord) l’élément de clé minimale.Au besoin, réorganise les éléments pour conserver un tas.S’il y a plusieurs minimums, un seul est supprimé.
Les opérations Tas_Vide, Est_Vide et Trouver_Min sont simples àréaliser en temps constant.
14 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Ensemble minimal d’opérationsTas_Vide : void → TasEst_Vide : Tas → bool
Insérer : Element × Tas → voidAjoute (par effet de bord) l’élément à ceux déjà présents.Au besoin, réorganise les éléments pour conserver un tas.
Trouver_Min : Tas → ElementPermet de consulter l’élément minimum sans modifier letas (pas d’effet de bord, il suffit de consulter la racine).
Extraire_Min : Tas → voidSupprime (par effet de bord) l’élément de clé minimale.Au besoin, réorganise les éléments pour conserver un tas.S’il y a plusieurs minimums, un seul est supprimé.
Les opérations Tas_Vide, Est_Vide et Trouver_Min sont simples àréaliser en temps constant.
14 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Ensemble minimal d’opérationsTas_Vide : void → TasEst_Vide : Tas → bool
Insérer : Element × Tas → voidAjoute (par effet de bord) l’élément à ceux déjà présents.Au besoin, réorganise les éléments pour conserver un tas.
Trouver_Min : Tas → ElementPermet de consulter l’élément minimum sans modifier letas (pas d’effet de bord, il suffit de consulter la racine).
Extraire_Min : Tas → voidSupprime (par effet de bord) l’élément de clé minimale.Au besoin, réorganise les éléments pour conserver un tas.S’il y a plusieurs minimums, un seul est supprimé.
Les opérations Tas_Vide, Est_Vide et Trouver_Min sont simples àréaliser en temps constant.
14 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Ensemble minimal d’opérationsTas_Vide : void → TasEst_Vide : Tas → bool
Insérer : Element × Tas → voidAjoute (par effet de bord) l’élément à ceux déjà présents.Au besoin, réorganise les éléments pour conserver un tas.
Trouver_Min : Tas → ElementPermet de consulter l’élément minimum sans modifier letas (pas d’effet de bord, il suffit de consulter la racine).
Extraire_Min : Tas → voidSupprime (par effet de bord) l’élément de clé minimale.Au besoin, réorganise les éléments pour conserver un tas.S’il y a plusieurs minimums, un seul est supprimé.
Les opérations Tas_Vide, Est_Vide et Trouver_Min sont simples àréaliser en temps constant.
14 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Ensemble minimal d’opérationsTas_Vide : void → TasEst_Vide : Tas → bool
Insérer : Element × Tas → voidAjoute (par effet de bord) l’élément à ceux déjà présents.Au besoin, réorganise les éléments pour conserver un tas.
Trouver_Min : Tas → ElementPermet de consulter l’élément minimum sans modifier letas (pas d’effet de bord, il suffit de consulter la racine).
Extraire_Min : Tas → voidSupprime (par effet de bord) l’élément de clé minimale.Au besoin, réorganise les éléments pour conserver un tas.S’il y a plusieurs minimums, un seul est supprimé.
Les opérations Tas_Vide, Est_Vide et Trouver_Min sont simples àréaliser en temps constant.
14 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Ensemble minimal d’opérationsTas_Vide : void → TasEst_Vide : Tas → bool
Insérer : Element × Tas → voidAjoute (par effet de bord) l’élément à ceux déjà présents.Au besoin, réorganise les éléments pour conserver un tas.
Trouver_Min : Tas → ElementPermet de consulter l’élément minimum sans modifier letas (pas d’effet de bord, il suffit de consulter la racine).
Extraire_Min : Tas → voidSupprime (par effet de bord) l’élément de clé minimale.Au besoin, réorganise les éléments pour conserver un tas.S’il y a plusieurs minimums, un seul est supprimé.
Les opérations Tas_Vide, Est_Vide et Trouver_Min sont simples àréaliser en temps constant.
14 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
F
R
P K
B
T
Idée générale : il faut que l’arbre reste tassé et ordonné.
I Tassé. On ne peut ajouter le nouveau nœud que :I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
F
R
P K
B
T
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
F
R
P K
B
T D
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
F
R
P K
B
T D
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné.
On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
F
R
P K
B
T D
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
F
R
P
B
K
T D
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
R
P
B
D
F
T K
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
R
P
B
D
F
T K
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
R
P
B
F
D
T K
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion
E
H N
R
P F
D
B
T K
Idée générale : il faut que l’arbre reste tassé et ordonné.I Tassé. On ne peut ajouter le nouveau nœud que :
I au dernier niveau, après la dernière feuille ;I ou si le dernier niveau est complet, au tout début du prochain niveau.
I Ordonné. On rectifie l’ordre par échange de clés sans modifier lastructure de l’arbre, depuis la nouvelle feuille jusqu’à la racine.
INSERER( e, t )Créer une nouvelle feuille n de clé e après la dernière feuille du tas tp := Noeud Père(n)while n n’est pas la racine et clé(p) > clé(n)
Échanger les clés de p et de nn := pp := Noeud Père(n)
15 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion : explications complémentaires
La boucle de l’algorithme précédent, qui consiste à prendre un nœud dontla clé est trop « bas » dans l’arbre et à la faire remonter petit à petits’appelle une percolation vers le haut, à l’image de ce qui se produitquand une bulle remonte dans un liquide.
Expérimentez avec l’application (attention, le pavé numérique nefonctionne pas) :https://www.cs.usfca.edu/~galles/JavascriptVisual/Heap.htmlInsérez quelques valeurs au hasard, par exemple 6, 9, 8, 13, 7, 12 pourconstruire un début d’arbre.Puis insérez d’autres valeurs, par exemple : 2, puis 11, 4 ou encore 16 enobservant attentivement à chaque fois comment l’arbre se réorganise.
16 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion : explications complémentaires
La boucle de l’algorithme précédent, qui consiste à prendre un nœud dontla clé est trop « bas » dans l’arbre et à la faire remonter petit à petits’appelle une percolation vers le haut, à l’image de ce qui se produitquand une bulle remonte dans un liquide.
Expérimentez avec l’application (attention, le pavé numérique nefonctionne pas) :https://www.cs.usfca.edu/~galles/JavascriptVisual/Heap.htmlInsérez quelques valeurs au hasard, par exemple 6, 9, 8, 13, 7, 12 pourconstruire un début d’arbre.Puis insérez d’autres valeurs, par exemple : 2, puis 11, 4 ou encore 16 enobservant attentivement à chaque fois comment l’arbre se réorganise.
16 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Insertion : explications complémentaires
La boucle de l’algorithme précédent, qui consiste à prendre un nœud dontla clé est trop « bas » dans l’arbre et à la faire remonter petit à petits’appelle une percolation vers le haut, à l’image de ce qui se produitquand une bulle remonte dans un liquide.
Expérimentez avec l’application (attention, le pavé numérique nefonctionne pas) :https://www.cs.usfca.edu/~galles/JavascriptVisual/Heap.htmlInsérez quelques valeurs au hasard, par exemple 6, 9, 8, 13, 7, 12 pourconstruire un début d’arbre.Puis insérez d’autres valeurs, par exemple : 2, puis 11, 4 ou encore 16 enobservant attentivement à chaque fois comment l’arbre se réorganise.
16 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
E
H N
F
R
P K
B
T
Même principe : l’arbre devra rester...
I Tassé. On doit supprimer la dernière feuille du dernier niveau.Cependant le maximum est à la racine : on commence par échanger.
I Ordonné. On réordonne par échange de clés sans modifier lastructure de l’arbre, en descendant cette fois vers les feuilles.
EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m
17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
E
H N
F
R
P K
B
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer
la dernière feuille du dernier niveau.Cependant le maximum est à la racine : on commence par échanger.
I Ordonné. On réordonne par échange de clés sans modifier lastructure de l’arbre, en descendant cette fois vers les feuilles.
EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m
17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
E
H N
F
P K
B
RT
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné. On réordonne par échange de clés sans modifier la
structure de l’arbre, en descendant cette fois vers les feuilles.EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m
17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
E
H N
F
P K
B
RT
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.
I Ordonné. On réordonne par échange de clés sans modifier lastructure de l’arbre, en descendant cette fois vers les feuilles.
EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m
17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
E
H N
F
P K
R
BT
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.
I Ordonné. On réordonne par échange de clés sans modifier lastructure de l’arbre, en descendant cette fois vers les feuilles.
EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m
17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
E
H N
F
P K
R
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné.
On réordonne par échange de clés sans modifier lastructure de l’arbre, en descendant cette fois vers les feuilles.
EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m
17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
E
H N
F
P K
R
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné. On réordonne par échange de clés sans modifier la
structure de l’arbre, en descendant cette fois vers les feuilles.
EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m
17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
H N
F
P K
R
E
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné. On réordonne par échange de clés sans modifier la
structure de l’arbre, en descendant cette fois vers les feuilles.EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m 17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
H N
F
P K
R
E
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné. On réordonne par échange de clés sans modifier la
structure de l’arbre, en descendant cette fois vers les feuilles.EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m 17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
N
F
P K
R
E
H
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné. On réordonne par échange de clés sans modifier la
structure de l’arbre, en descendant cette fois vers les feuilles.EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m 17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
N
F
P K
E
R
H
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné. On réordonne par échange de clés sans modifier la
structure de l’arbre, en descendant cette fois vers les feuilles.EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m 17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum
N
F
P K
E
H
R
T
Même principe : l’arbre devra rester...I Tassé. On doit supprimer la dernière feuille du dernier niveau.
Cependant le maximum est à la racine : on commence par échanger.I Ordonné. On réordonne par échange de clés sans modifier la
structure de l’arbre, en descendant cette fois vers les feuilles.EXTRAIRE_MIN( t )f := Dernière feuille de tn := Racine de tÉchanger les clés de f et de nSupprimer fwhile n n’est pas une feuille et clé(n) > clé d’un fils de n
m := Fils de n de clé minimaleÉchanger les clés de m et de nn := m 17 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum : explications complémentairesDans ce second algorithme, la boucle effectue une percolation vers le bas,comme un confetti qui coulerait lentement au fond d’un verre d’eau.
L’algorithme est un peu plus compliqué car on ne sait pas à l’avance versoù va aller la valeur qu’on a placée à la racine :I si elle est supérieure à un seul de ses deux fils, c’est évidemment ce
fils qui doit remonter à sa placeI mais si elle est supérieure à ses deux fils, il faut en choisir un : on
réalise rapidement que c’est le plus petit des deux qui doit remonterCeci explique en particulier la ligne :
m := Fils de n de clé minimale.Reprenez l’arbre construit sur :https://www.cs.usfca.edu/~galles/JavascriptVisual/Heap.htmlCette fois il suffit de cliquer sur Remove Smallest : vous n’avez rien àchoisir puisque c’est forcément l’élément minimal qui sort du tas.Pensez à utiliser les boutons Pause et Step pour mieux voir ce qui sepasse.
18 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum : explications complémentairesDans ce second algorithme, la boucle effectue une percolation vers le bas,comme un confetti qui coulerait lentement au fond d’un verre d’eau.L’algorithme est un peu plus compliqué car on ne sait pas à l’avance versoù va aller la valeur qu’on a placée à la racine :I si elle est supérieure à un seul de ses deux fils, c’est évidemment ce
fils qui doit remonter à sa placeI mais si elle est supérieure à ses deux fils, il faut en choisir un : on
réalise rapidement que c’est le plus petit des deux qui doit remonterCeci explique en particulier la ligne :
m := Fils de n de clé minimale.
Reprenez l’arbre construit sur :https://www.cs.usfca.edu/~galles/JavascriptVisual/Heap.htmlCette fois il suffit de cliquer sur Remove Smallest : vous n’avez rien àchoisir puisque c’est forcément l’élément minimal qui sort du tas.Pensez à utiliser les boutons Pause et Step pour mieux voir ce qui sepasse.
18 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Extraction du minimum : explications complémentairesDans ce second algorithme, la boucle effectue une percolation vers le bas,comme un confetti qui coulerait lentement au fond d’un verre d’eau.L’algorithme est un peu plus compliqué car on ne sait pas à l’avance versoù va aller la valeur qu’on a placée à la racine :I si elle est supérieure à un seul de ses deux fils, c’est évidemment ce
fils qui doit remonter à sa placeI mais si elle est supérieure à ses deux fils, il faut en choisir un : on
réalise rapidement que c’est le plus petit des deux qui doit remonterCeci explique en particulier la ligne :
m := Fils de n de clé minimale.Reprenez l’arbre construit sur :https://www.cs.usfca.edu/~galles/JavascriptVisual/Heap.htmlCette fois il suffit de cliquer sur Remove Smallest : vous n’avez rien àchoisir puisque c’est forcément l’élément minimal qui sort du tas.Pensez à utiliser les boutons Pause et Step pour mieux voir ce qui sepasse.
18 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Complexité
Admettons que les opérations coûteuses soient la comparaison etl’échange de clés.
Les deux opérations Insérer et Extraire_min sont constituées d’uneboucle effectuant à chaque itération :I une comparaison (ou deux)I un échange
De plus, dans cette boucle, le nœud à réordonner suit un chemin d’unefeuille à la racine (ou inversement) : le coût est donc majoré par lahauteur de l’arbre.
Or on a vu que dans un arbre tassé h = blog2 nc :
Complexité de la mise à jour du tasLa complexité des opérations Insérer et Extraire_min est en O(log2 n).
19 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Complexité
Admettons que les opérations coûteuses soient la comparaison etl’échange de clés.
Les deux opérations Insérer et Extraire_min sont constituées d’uneboucle effectuant à chaque itération :I une comparaison (ou deux)I un échange
De plus, dans cette boucle, le nœud à réordonner suit un chemin d’unefeuille à la racine (ou inversement) : le coût est donc majoré par lahauteur de l’arbre.
Or on a vu que dans un arbre tassé h = blog2 nc :
Complexité de la mise à jour du tasLa complexité des opérations Insérer et Extraire_min est en O(log2 n).
19 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Complexité
Admettons que les opérations coûteuses soient la comparaison etl’échange de clés.
Les deux opérations Insérer et Extraire_min sont constituées d’uneboucle effectuant à chaque itération :I une comparaison (ou deux)I un échange
De plus, dans cette boucle, le nœud à réordonner suit un chemin d’unefeuille à la racine (ou inversement) : le coût est donc majoré par lahauteur de l’arbre.
Or on a vu que dans un arbre tassé h = blog2 nc :
Complexité de la mise à jour du tasLa complexité des opérations Insérer et Extraire_min est en O(log2 n).
19 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Opérations supplémentaires
Pour certains algorithmes, on aura besoin d’une opération supplémentairedans les files à priorité
Modifier_priorité (Noeud n, Priorité p)
Celle-ci n’est en fait pas plus difficile que celles déjà connues :I Si n devient plus prioritaire, on effectue une percolation vers le haut.I Si n devient moins prioritaire, on effectue une percolation vers le bas.
Enfin on verra en TD1 :I Tri_Par_Tas ( Tableau t )I Créer_tas ( Tableau t de taille n )
I Version naïve par n insertions successives en O(n log n)I Version efficace procédant des feuilles vers la racine en O(n)
20 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Opérations supplémentaires
Pour certains algorithmes, on aura besoin d’une opération supplémentairedans les files à priorité
Modifier_priorité (Noeud n, Priorité p)
Celle-ci n’est en fait pas plus difficile que celles déjà connues :I Si n devient plus prioritaire, on effectue une percolation vers le haut.I Si n devient moins prioritaire, on effectue une percolation vers le bas.
Enfin on verra en TD1 :I Tri_Par_Tas ( Tableau t )I Créer_tas ( Tableau t de taille n )
I Version naïve par n insertions successives en O(n log n)I Version efficace procédant des feuilles vers la racine en O(n)
20 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Opérations supplémentaires
Pour certains algorithmes, on aura besoin d’une opération supplémentairedans les files à priorité
Modifier_priorité (Noeud n, Priorité p)
Celle-ci n’est en fait pas plus difficile que celles déjà connues :I Si n devient plus prioritaire, on effectue une percolation vers le haut.I Si n devient moins prioritaire, on effectue une percolation vers le bas.
Enfin on verra en TD1 :I Tri_Par_Tas ( Tableau t )I Créer_tas ( Tableau t de taille n )
I Version naïve par n insertions successives en O(n log n)I Version efficace procédant des feuilles vers la racine en O(n)
20 / 32
Algorithmique et Analyse d’AlgorithmesStructure de tas
Opérations
Opérations supplémentaires
Pour certains algorithmes, on aura besoin d’une opération supplémentairedans les files à priorité
Modifier_priorité (Noeud n, Priorité p)
Celle-ci n’est en fait pas plus difficile que celles déjà connues :I Si n devient plus prioritaire, on effectue une percolation vers le haut.I Si n devient moins prioritaire, on effectue une percolation vers le bas.
Enfin on verra en TD1 :I Tri_Par_Tas ( Tableau t )I Créer_tas ( Tableau t de taille n )
I Version naïve par n insertions successives en O(n log n)I Version efficace procédant des feuilles vers la racine en O(n)
20 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Plan
Arbre partiellement ordonné, tasséArbre partiellement ordonnéArbre tassé
Structure de tasDéfinition et applicationsOpérations
Diviser pour Régner
21 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Diviser pour Régner
Ceci est une (brève) introduction à la méthode Diviser pour Régner pourélaborer une solution algorithmique à un problème.
Vous étudierez au semestre 6 les propriétés générales des algorithmesconstruits sur ce principe, en particulier comment déterminer leurcomplexité.
Pour cette séance de cours, nous nous contenterons d’un exemple deproblème et d’un calcul de complexité « avec les mains » (mais quiressemble à ceux que vous généraliserez par la suite).
22 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Diviser pour Régner
Ceci est une (brève) introduction à la méthode Diviser pour Régner pourélaborer une solution algorithmique à un problème.
Vous étudierez au semestre 6 les propriétés générales des algorithmesconstruits sur ce principe, en particulier comment déterminer leurcomplexité.
Pour cette séance de cours, nous nous contenterons d’un exemple deproblème et d’un calcul de complexité « avec les mains » (mais quiressemble à ceux que vous généraliserez par la suite).
22 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Un exemple : le problème du sous-tableau maximalSoit un tableau T [1..n] d’entiers relatifs.On cherche deux indices i et j tels que la somme des entiers de T [i ..j]soit maximale.
1 2 3 4 5 6 7 8 9 10
20 5 -13 1 -34 21 6 -9 14 -36
Une visualisation possible : les sommes cumulées croissantes
1 2 3 4 5 6 7 8 9 10-30-20-100102030
23 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Un exemple : le problème du sous-tableau maximalSoit un tableau T [1..n] d’entiers relatifs.On cherche deux indices i et j tels que la somme des entiers de T [i ..j]soit maximale.
1 2 3 4 5 6 7 8 9 10
20 5 -13 1 -34 21 6 -9 14 -36
Une visualisation possible : les sommes cumulées croissantes
1 2 3 4 5 6 7 8 9 10-30-20-100102030
23 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Un exemple : le problème du sous-tableau maximalSoit un tableau T [1..n] d’entiers relatifs.On cherche deux indices i et j tels que la somme des entiers de T [i ..j]soit maximale.
1 2 3 4 5 6 7 8 9 10
20 5 -13 1 -34 21 6 -9 14 -36
Une visualisation possible : les sommes cumulées croissantes
1 2 3 4 5 6 7 8 9 10-30-20-100102030
23 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Algorithme (très) naïfOn essaye tous les couples (i , j) et pour chacun on calcule la somme :max := T [1] // Initialisation avec T [1..1](imax , jmax) := (1, 1)for i := 1 to n
for j := i to ns := 0for k := i to j // Calcul de la somme de T [i ..j]
s := s + T [k]if s > max
max := s(imax , jmax) := (i , j)
return (max , imax , jmax)
Complexité :I On a trois « vraies » boucles imbriquées (i , j , k)I On peut démontrer que la complexité est en O(n3)
24 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Algorithme (très) naïfOn essaye tous les couples (i , j) et pour chacun on calcule la somme :max := T [1] // Initialisation avec T [1..1](imax , jmax) := (1, 1)for i := 1 to n
for j := i to ns := 0for k := i to j // Calcul de la somme de T [i ..j]
s := s + T [k]if s > max
max := s(imax , jmax) := (i , j)
return (max , imax , jmax)Complexité :I On a trois « vraies » boucles imbriquées (i , j , k)I On peut démontrer que la complexité est en O(n3)
24 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Comment améliorer cet algorithme naïf ?
Clairement, il faut éviter de recalculer la somme de T [i ..j] à partir de 0 àchaque fois :
max := T [1](imax , jmax) := (1, 1)for i := 1 to n
s := 0for j := i to n
s := s + T [j] // Mise à jour continue de s = T [i ..j]if s > max
max := s(imax , jmax) := (i , j)
return (max , imax , jmax)
Complexité :n∑
i=1
n∑j=i
1 = n(n+1)2 = O(n2)
25 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Comment améliorer cet algorithme naïf ?
Clairement, il faut éviter de recalculer la somme de T [i ..j] à partir de 0 àchaque fois :
max := T [1](imax , jmax) := (1, 1)for i := 1 to n
s := 0for j := i to n
s := s + T [j] // Mise à jour continue de s = T [i ..j]if s > max
max := s(imax , jmax) := (i , j)
return (max , imax , jmax)
Complexité :n∑
i=1
n∑j=i
1 = n(n+1)2 = O(n2)
25 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Comment améliorer cet algorithme naïf ?
Clairement, il faut éviter de recalculer la somme de T [i ..j] à partir de 0 àchaque fois :
max := T [1](imax , jmax) := (1, 1)for i := 1 to n
s := 0for j := i to n
s := s + T [j] // Mise à jour continue de s = T [i ..j]if s > max
max := s(imax , jmax) := (i , j)
return (max , imax , jmax)
Complexité :n∑
i=1
n∑j=i
1 = n(n+1)2 = O(n2)
25 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Comment améliorer cet algorithme naïf ?
Clairement, il faut éviter de recalculer la somme de T [i ..j] à partir de 0 àchaque fois :
max := T [1](imax , jmax) := (1, 1)for i := 1 to n
s := 0for j := i to n
s := s + T [j] // Mise à jour continue de s = T [i ..j]if s > max
max := s(imax , jmax) := (i , j)
return (max , imax , jmax)
Complexité :n∑
i=1
n∑j=i
1 = n(n+1)2 = O(n2)
25 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Peut-on faire encore mieux ?
Nicolas Machiavel, Le Prince : « Divide et impera », « Divise et règne »
Imaginons qu’on coupe le tableau en deux par le milieu : le sous-tableaumaximal est forcément dans un de ces trois cas
1 n/2 n
inclus dans la moitié gauche
inclus dans la moitié droite
à cheval sur les deux
26 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Peut-on faire encore mieux ?
Nicolas Machiavel, Le Prince : « Divide et impera », « Divise et règne »
Imaginons qu’on coupe le tableau en deux par le milieu : le sous-tableaumaximal est forcément dans un de ces trois cas
1 n/2 n
inclus dans la moitié gauche
inclus dans la moitié droite
à cheval sur les deux
26 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Peut-on faire encore mieux ?
Nicolas Machiavel, Le Prince : « Divide et impera », « Divise et règne »
Imaginons qu’on coupe le tableau en deux par le milieu : le sous-tableaumaximal est forcément dans un de ces trois cas
1 n/2 n
inclus dans la moitié gauche
inclus dans la moitié droite
à cheval sur les deux
26 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Peut-on faire encore mieux ?
Nicolas Machiavel, Le Prince : « Divide et impera », « Divise et règne »
Imaginons qu’on coupe le tableau en deux par le milieu : le sous-tableaumaximal est forcément dans un de ces trois cas
1 n/2 n
inclus dans la moitié gauche
inclus dans la moitié droite
à cheval sur les deux
26 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Peut-on faire encore mieux ?
Nicolas Machiavel, Le Prince : « Divide et impera », « Divise et règne »
Imaginons qu’on coupe le tableau en deux par le milieu : le sous-tableaumaximal est forcément dans un de ces trois cas
1 n/2 n
inclus dans la moitié gauche
inclus dans la moitié droite
à cheval sur les deux
26 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Algorithme récursif
Pour les deux cas où le tableau recherché est dans une des deux moitiés,un simple appel récursif nous donnera directement la réponse :
SousTableauMax(g , d)if g = d // Cas de base
return (T [g ], g , g)else
milieu := (g + d) / 2(maxG , iG , jG) := SousTableauMax(g , milieu) // 2 appels(maxG , iD, jD) := SousTableauMax(milieu + 1, d) // récursifs
(maxCheval , iCheval , jCheval) := ChevalMax(g , d)
Choisir le meilleur résultat parmi les 3 précédents.
Il reste à coder la fonction ChevalMax, qui cherche un sous-tableaumaximal à cheval sur les deux moitiés.
27 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Algorithme récursif
Pour les deux cas où le tableau recherché est dans une des deux moitiés,un simple appel récursif nous donnera directement la réponse :SousTableauMax(g , d)if g = d // Cas de base
return (T [g ], g , g)else
milieu := (g + d) / 2(maxG , iG , jG) := SousTableauMax(g , milieu) // 2 appels(maxG , iD, jD) := SousTableauMax(milieu + 1, d) // récursifs
(maxCheval , iCheval , jCheval) := ChevalMax(g , d)
Choisir le meilleur résultat parmi les 3 précédents.
Il reste à coder la fonction ChevalMax, qui cherche un sous-tableaumaximal à cheval sur les deux moitiés.
27 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Algorithme récursif
Pour les deux cas où le tableau recherché est dans une des deux moitiés,un simple appel récursif nous donnera directement la réponse :SousTableauMax(g , d)if g = d // Cas de base
return (T [g ], g , g)else
milieu := (g + d) / 2(maxG , iG , jG) := SousTableauMax(g , milieu) // 2 appels(maxG , iD, jD) := SousTableauMax(milieu + 1, d) // récursifs
(maxCheval , iCheval , jCheval) := ChevalMax(g , d)
Choisir le meilleur résultat parmi les 3 précédents.
Il reste à coder la fonction ChevalMax, qui cherche un sous-tableaumaximal à cheval sur les deux moitiés.
27 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Recherche d’un sous-tableau maximal « à cheval »
1 i n/2 j n
T [i ..j] contient forcément T [i ..n/2] et T [n/2..j] :on cherche séparement le meilleur i puis le meilleur j .
ChevalMax(g , d)milieu := (g + d) / 2s := T [milieu]maxG := simax := milieufor i := milieu − 1 downto g
s := s + T [i ]if s > maxG
maxG := simax := i
// Puis on fait pareil pour jmax entre milieu + 1 et d
28 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Recherche d’un sous-tableau maximal « à cheval »
1 i n/2 j n
T [i ..j] contient forcément T [i ..n/2] et T [n/2..j] :on cherche séparement le meilleur i puis le meilleur j .ChevalMax(g , d)milieu := (g + d) / 2s := T [milieu]maxG := simax := milieufor i := milieu − 1 downto g
s := s + T [i ]if s > maxG
maxG := simax := i
// Puis on fait pareil pour jmax entre milieu + 1 et d 28 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Complexité de l’algorithme récursif
I Complexité de ChevalMaxDeux boucles successives de milieu à g puis de milieu à ddonc une complexité en O(d − g) (taille du segment considéré)
I Complexité de SousTableauMaxNotons C(n) le coût de SousTableauMax sur un segment detaille n :
C(n) = 2C(n/2) + O(n) + O(1)
coût des appels récursifs
coût de ChevalMax
choix de la solution
Encore une équation récursive ! Voyons comment la résoudre...
29 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Complexité de l’algorithme récursif
I Complexité de ChevalMaxDeux boucles successives de milieu à g puis de milieu à ddonc une complexité en O(d − g) (taille du segment considéré)
I Complexité de SousTableauMaxNotons C(n) le coût de SousTableauMax sur un segment detaille n :
C(n) = 2C(n/2) + O(n) + O(1)
coût des appels récursifs
coût de ChevalMax
choix de la solution
Encore une équation récursive ! Voyons comment la résoudre...
29 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Complexité de l’algorithme récursif
I Complexité de ChevalMaxDeux boucles successives de milieu à g puis de milieu à ddonc une complexité en O(d − g) (taille du segment considéré)
I Complexité de SousTableauMaxNotons C(n) le coût de SousTableauMax sur un segment detaille n :
C(n) = 2C(n/2) + O(n) + O(1)
coût des appels récursifs
coût de ChevalMax
choix de la solution
Encore une équation récursive ! Voyons comment la résoudre...
29 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Complexité de l’algorithme récursif
I Complexité de ChevalMaxDeux boucles successives de milieu à g puis de milieu à ddonc une complexité en O(d − g) (taille du segment considéré)
I Complexité de SousTableauMaxNotons C(n) le coût de SousTableauMax sur un segment detaille n :
C(n) = 2C(n/2) + O(n) + O(1)
coût des appels récursifs
coût de ChevalMax
choix de la solution
Encore une équation récursive ! Voyons comment la résoudre...
29 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Complexité de l’algorithme récursif
I Complexité de ChevalMaxDeux boucles successives de milieu à g puis de milieu à ddonc une complexité en O(d − g) (taille du segment considéré)
I Complexité de SousTableauMaxNotons C(n) le coût de SousTableauMax sur un segment detaille n :
C(n) = 2C(n/2) + O(n) + O(1)
coût des appels récursifs
coût de ChevalMax
choix de la solution
Encore une équation récursive ! Voyons comment la résoudre...
29 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Complexité de l’algorithme récursif
I Complexité de ChevalMaxDeux boucles successives de milieu à g puis de milieu à ddonc une complexité en O(d − g) (taille du segment considéré)
I Complexité de SousTableauMaxNotons C(n) le coût de SousTableauMax sur un segment detaille n :
C(n) = 2C(n/2) + O(n) + O(1)
coût des appels récursifs
coût de ChevalMax
choix de la solution
Encore une équation récursive ! Voyons comment la résoudre...
29 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Résolution de l’équation de récurrenceIntuition : arbre des appels récursifs, avec la taille des sous-tableaux
n
n/2 n/2
n/4 n/4 n/4 n/4
1 1 1 1· · ·
D’où C(n) =O(n)
+O(n)
+O(n)...
+O(n)
C(n) = O(n log n).
I arbre de hauteur log2 nI chaque niveau coûte O(n) en tout
(pour tous les appels à ChevalMax sur des sous-tableaux demême taille)
30 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Résolution de l’équation de récurrenceIntuition : arbre des appels récursifs, avec la taille des sous-tableaux
n
n/2 n/2
n/4 n/4 n/4 n/4
1 1 1 1· · ·
D’où C(n) =O(n)
+O(n)
+O(n)...
+O(n)
C(n) = O(n log n).
I arbre de hauteur log2 nI chaque niveau coûte O(n) en tout
(pour tous les appels à ChevalMax sur des sous-tableaux demême taille)
30 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Résolution de l’équation de récurrenceIntuition : arbre des appels récursifs, avec la taille des sous-tableaux
n
n/2 n/2
n/4 n/4 n/4 n/4
1 1 1 1· · ·
D’où C(n) =O(n)
+O(n)
+O(n)...
+O(n)
C(n) = O(n log n).
I arbre de hauteur log2 nI chaque niveau coûte O(n) en tout
(pour tous les appels à ChevalMax sur des sous-tableaux demême taille)
30 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Résolution de l’équation de récurrenceIntuition : arbre des appels récursifs, avec la taille des sous-tableaux
n
n/2 n/2
n/4 n/4 n/4 n/4
1 1 1 1· · ·
D’où C(n) =O(n)
+O(n)
+O(n)...
+O(n) C(n) = O(n log n).
I arbre de hauteur log2 nI chaque niveau coûte O(n) en tout
(pour tous les appels à ChevalMax sur des sous-tableaux demême taille)
30 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais non, pas récursifI recherche dichotomique ouiI fonctions sur un ABR seulement s’il est équilibréI vérification du parenthésage non, pas d’indépendance des partiesI insertion dans un tas non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide
non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais non, pas récursifI recherche dichotomique ouiI fonctions sur un ABR seulement s’il est équilibréI vérification du parenthésage non, pas d’indépendance des partiesI insertion dans un tas non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais
non, pas récursifI recherche dichotomique ouiI fonctions sur un ABR seulement s’il est équilibréI vérification du parenthésage non, pas d’indépendance des partiesI insertion dans un tas non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais non, pas récursifI recherche dichotomique
ouiI fonctions sur un ABR seulement s’il est équilibréI vérification du parenthésage non, pas d’indépendance des partiesI insertion dans un tas non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais non, pas récursifI recherche dichotomique ouiI fonctions sur un ABR
seulement s’il est équilibréI vérification du parenthésage non, pas d’indépendance des partiesI insertion dans un tas non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais non, pas récursifI recherche dichotomique ouiI fonctions sur un ABR seulement s’il est équilibréI vérification du parenthésage
non, pas d’indépendance des partiesI insertion dans un tas non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais non, pas récursifI recherche dichotomique ouiI fonctions sur un ABR seulement s’il est équilibréI vérification du parenthésage non, pas d’indépendance des partiesI insertion dans un tas
non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
Quand divise-t-on pour régner ?
On peut parler de diviser pour régner si :I le problème initial est découpé en parties de
taille équivalente ;I chaque partie peut être résolue récursivement ;I la solution globale peut être reconstruite à
partir de la solution de chaque partie. John von Neumann(1903-1957)
Par exemple, ces algorithmes relèvent-ils du Diviser pour Régner ?I tri rapide non, parties inégales (cf tri par fusion au semestre 6)I drapeau hollandais non, pas récursifI recherche dichotomique ouiI fonctions sur un ABR seulement s’il est équilibréI vérification du parenthésage non, pas d’indépendance des partiesI insertion dans un tas non
31 / 32
Algorithmique et Analyse d’AlgorithmesDiviser pour Régner
En résumé
Aujourd’hui
I Pour accéder rapidement au maximum d’un ensemble, il suffit demaintenir une structure partiellement ordonnée.
I La structure de tas convient et elle permettra de réaliser une File àPriorités efficace.
I La stratégie diviser pour régner permet d’accélérer certainsalgorithmes à condition de pouvoir traiter récursivement unefraction des données.
La prochaine fois
I Problèmes d’optimisationI Algorithmes gloutonsI Algorithmique de graphes et problèmes de coloration
32 / 32