TRIS EN PROLOG - perso.liris.cnrs.fr .Tris par s©lection Tri par insertion Tri par fusion TRIS EN

  • View
    230

  • Download
    0

Embed Size (px)

Text of TRIS EN PROLOG - perso.liris.cnrs.fr .Tris par s©lection Tri par insertion Tri par fusion TRIS...

  • Tris par slection Tri par insertion Tri par fusion

    TRIS EN PROLOG

  • N. Guin Licence Lyon1 - UE LIFprolog

    TRI : QUEL EST LE PROBLME RSOUDRE ?

    Soit une liste de nombres : [5,2,14,1,6]

    On veut construire une liste trie de ces lments : [1,2,5,6,14]

    2

  • N. Guin Licence Lyon1 - UE LIFprolog

    ALGORITHMES DE TRI

    Tris par slection du minimum tri-minimum tri-bulles

    Tri par insertion Tri par fusion Tri rapide Tri par tas

    3

  • N. Guin Licence Lyon1 - UE LIFprolog

    PRINCIPE DES TRIS PAR SLECTION

    On cherche le minimum de la liste trier On le met au dbut de la liste quon construit Puis on recommence avec la liste trier prive

    du minimum

    4

  • N. Guin Licence Lyon1 - UE LIFprolog

    EXERCICE : TRI DU MINIMUM

    Dfinir le prdicat minimum(L,X), qui calcule le minimum X de la liste de nombres L.

    Dfinir le prdicat enleve(X,L1,L2), qui construit la liste L2, qui est la liste L1 laquelle on a enlev la premire occurrence de llment X.

    Utiliser les deux prdicats prcdents pour dfinir le prdicat tri_min(L,Lt), qui construit la liste trie Lt partir de la liste de nombres L.

    5

  • N. Guin Licence Lyon1 - UE LIFprolog

    TRI BULLES (TP)

    Le tri bulles applique le principe du tri par slection, mais utilise un seul prdicat bulle, qui slectionne le minimum et lenlve de la liste en un seul passage

    Le prdicat bulle(L1,L2) construit la liste L2, qui contient les mmes lments que la liste L1, mais dont le premier lment est infrieur tous les autres lments de la liste (le minimum)

    6

  • N. Guin Licence Lyon1 - UE LIFprolog

    Principe : on trie rcursivement la liste prive du premier lment, puis on y insre le premier lment

    Exemple :

    TRI PAR INSERTION : PRINCIPE

    [5,2,14,1,6] enlever le premier

    [1,2,6,14]

    [2,14,1,6]

    tri-insertion

    [1,2,5,6,14] insrer 5

    tri-insertion

    7

  • N. Guin Licence Lyon1 - UE LIFprolog

    Principe : on compare llment insrer avec le premier lment de la liste

    Exemple : insrer 5 dans [1,2,6,14]

    INSERTION DANS UNE LISTE TRIE

    5 [6,14] < [5,6,14]

    5 [2,6,14] > [2,5,6,14]

    5 [1,2,6,14] > [1,2,5,6,14]

    8

  • N. Guin Licence Lyon1 - UE LIFprolog

    PRDICAT RALISANT LINSERTION

    insertion(X,L,L1) insre llment X dans L pour donner L1 insertion(X,[],[X]). insertion(X,[Y|L],[X,Y|L]):- X=Y,

    insertion(X,L,L1).

    9

  • N. Guin Licence Lyon1 - UE LIFprolog

    PRDICAT RALISANT LE TRI

    tri_insertion(L,L1) construit la liste trie L1 des lments de L tri_insertion([],[]). tri_insertion([X|L],LT):-

    tri_insertion(L,L1), insertion(X,L1,LT).

    10

  • N. Guin Licence Lyon1 - UE LIFprolog

    TRI PAR FUSION : LAPPROCHE DIVISER POUR RGNER

    Structure rcursive : pour rsoudre un problme donn, lalgorithme sappelle lui-mme rcursivement une ou plusieurs fois sur des sous problmes trs similaires

    Le paradigme diviser pour rgner donne lieu trois tapes chaque niveau de rcursivit : diviser, rgner, combiner

    11

  • N. Guin Licence Lyon1 - UE LIFprolog

    DIVISER POUR RGNER : 3 TAPES

    Diviser le problme en un certain nombre de sous problmes

    Rgner sur les sous-problmes en les rsolvant rcursivement Si la taille dun sous-problme est assez rduite, on peut le rsoudre directement

    Combiner les solutions des sous-problmes en une solution complte pour le problme initial

    12

  • N. Guin Licence Lyon1 - UE LIFprolog

    TRI PAR FUSION : LE PRINCIPE

    Diviser : diviser la squence de n lments trier en deux sous-squences de n/2 lments

    Rgner : trier les deux sous squences rcursivement laide du tri par fusion

    Combiner : fusionner les deux sous-squences tries pour produire la rponse trie

    13

  • N. Guin

    UN EXEMPLE

    3 2 5 1

    3 2 5 1

    3 2 5 1

    2 3 1 5

    1 2 3 5

    diviser

    fusionner

    Licence Lyon1 - UE LIFprolog

    14

  • N. Guin Licence Lyon1 - UE LIFprolog

    DIVISER LA LISTE EN DEUX SOUS-LISTES

    [a,b,c,d,e,f] Enlever les deux premiers

    [.,.] [.,.]

    [c,d,e,f]

    divise

    [a,.,.] [b,.,.]

    divise

    Principe :

    15

  • N. Guin Licence Lyon1 - UE LIFprolog

    PRDICAT DE PARTAGE DUNE LISTE EN DEUX SOUS-LISTES

    Le prdicat divise(L,L1,L2) divise la liste L en deux sous-listes de taille identique divise([],[],[]). divise([X],[X],[]). divise([X,Y|L],[X|L1],[Y|L2]) :- divise(L,L1,L2).

    16

  • N. Guin Licence Lyon1 - UE LIFprolog

    FUSIONNER DEUX LISTES TRIES

    [2,5,7] [1,3,4,8] [2,5,7] [3,4,8] 1

  • N. Guin Licence Lyon1 - UE LIFprolog

    PRDICAT DE FUSION

    Le prdicat fusion(L1,L2,L) fusionne les deux listes tries L1 et L2 pour construire la liste trie L

    fusion([],L,L). fusion(L,[],L). fusion([X|L1],[Y|L2],[X|L]) :- X=Y,

    fusion([X|L1],L2,L).

    18

  • N. Guin Licence Lyon1 - UE LIFprolog

    PRDICAT DE TRI PAR FUSION

    Le prdicat tri_fusion(L,L1) construit la liste trie L1 des lments de L

    trifusion([],[]). trifusion([X],[X]). trifusion([X,Y|L],T3) :-

    divise([X,Y|L],L1,L2), trifusion(L1,T1), trifusion(L2,T2),

    fusion(T1,T2,T3). 19

  • Arbres binaires Reprsentation des arbres Parcours darbres Arbres ordonns

    ARBRES EN PROLOG

  • N. Guin Licence Lyon1 - UE LIFprolog

    QUOI SERVENT LES ARBRES ?

    Les arbres, comme les listes, permettent de reprsenter un nombre variable de donnes

    Le principal avantage des arbres par rapport aux listes est quils permettent de ranger les donnes de telle sorte que les recherches soient plus efficaces

    21

  • N. Guin Licence Lyon1 - UE LIFprolog

    DFINITION

    Un arbre est soit un nud, soit un arbre vide Un nud a des fils qui sont eux aussi des arbres Si tous les fils dun nud sont vides, alors le

    nud est qualifi de feuille Les nuds portent des valeurs, ce sont les

    donnes que lon veut stocker Si tous les nuds de larbre ont n fils, alors

    larbre est dit n-aire

    22

  • N. Guin Licence Lyon1 - UE LIFprolog

    EXEMPLE DARBRE

    6

    4 9

    1 8

    Racine

    Feuilles

    23

  • N. Guin Licence Lyon1 - UE LIFprolog

    ARBRES BINAIRES

    Un arbre binaire est : soit larbre vide soit un nud qui a exactement deux fils

    (ventuellement vides)

    24

  • N. Guin Licence Lyon1 - UE LIFprolog

    REPRSENTATION DES ARBRES BINAIRES

    Nous choisissons dutiliser les listes pour reprsenter les arbres

    Un arbre vide sera reprsent par la liste vide [] Un nud sera une liste de 3 lments

    le premier est sa valeur le deuxime son fils gauche le troisime son fils droit

    25

  • N. Guin

    EXEMPLE DE REPRSENTATION DUN ARBRE BINAIRE

    6

    4 9

    1 8

    [6,[4,[1,[],[]],[8,[],[]]],[9,[],[]]]

    Licence Lyon1 - UE LIFprolog

    26

  • EXERCICE

    Dfinir un prdicat qui vrifie quune liste reprsente bien un arbre binaire.

    N. Guin Licence Lyon1 - UE LIFprolog

    27

  • N. Guin Licence Lyon1 - UE LIFprolog

    PARCOURS DARBRES

    Un arbre contient un ensemble de donnes Pour utiliser ces donnes, il faut parcourir

    larbre : en profondeur ou en largeur

    28

  • N. Guin Licence Lyon1 - UE LIFprolog

    PARCOURS EN LARGEUR

    6

    4 9

    1 8

    29

  • N. Guin Licence Lyon1 - UE LIFprolog

    PARCOURS EN PROFONDEUR : UN EXEMPLE

    6

    4 9

    1 8

    30

  • N. Guin Licence Lyon1 - UE LIFprolog

    PARCOURS EN PROFONDEUR : PRINCIPE

    Parcourir un arbre en profondeur consiste passer ses nuds en revue, en commenant toujours par le mme fils, et en descendant le plus profondment possible dans larbre

    Lorsque lon arrive sur un arbre vide, on remonte jusquau nud suprieur et on redescend dans le fils encore inexplor

    31

  • N. Guin Licence Lyon1 - UE LIFprolog

    POUR CRIRE UN ALGORITHME QUI EFFECTUE UN PARCOURS EN PROFONDEUR Pour crire un prdicat P, sur un arbre A

    Si A est vide, on retourne une valeur constante

    Si A nest pas vide : on rappelle P sur les deux fils de A, ce qui retourne deux rsultats : Rg et Rd

    puis on retourne un rsultat qui ne dpend que de Rg, Rd et de la valeur de A

    32

  • N. Guin Licence Lyon1 - UE LIFprolog

    EXEMPLE : SOMME DES VALEURS DUN ARBRE DE NOMBRES

    somme([],0). somme([N,G,D],M) :-

    somme(G,N1), somme(D,N2), M is N+N1+N2.

    33

  • N. Guin

    FONCTIONNEMENT SUR UN EXEMPLE

    6

    4 9

    1 8 0 0

    1 8

    13

    0 0

    9

    28

    0 0

    Licence Lyon1 - UE LIFprolog

    34

  • EXERCICES

    Dfinir un prdicat qui calcule la hauteur dun arbre binaire : La hauteur dune feuille est zro La hauteur dun nud est

    1+max(hauteur_fils_gauche, hauteur_fils_droit) Dfinir un prdicat qui calcule le maximum dun

    arbre binaire de nombres. Dfinir un prdicat qui calcule la liste rsultant du

    parcours infixe d'un arbre binaire.

    N. Guin Licence Lyon1 - UE LIFprolog

    35

  • N. Guin Licence Lyon1 - UE LIFprolog

    MODIFICATION ET CRATION DARBRES

    Exemple : crire un prdicat qui ajoute 1 tous les nuds dun arbre qui contient des nombres

    Il ne sagit pas dune modification (ajouter 1), mais dune cration : crire un prdicat qui construit un arbre identique celui donn, ma