Algorithmique et Analyse d'Algorithmes - L3 Info Cours 9 ... · Algorithmique et Analyse...

Post on 10-Oct-2020

6 views 3 download

Transcript of Algorithmique et Analyse d'Algorithmes - L3 Info Cours 9 ... · Algorithmique et Analyse...

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