1 / 93

Algorithme et structure de données

Algorithme et structure de données. IUP1 Miage. Structure de donnée composée. Une entité qui possède plusieurs attribut (ou champs) Exemple : Un individu à un nom , un prénom et un numéro Une voiture à une marque , une puissance , une valeur , …. Les Fractions.

masao
Download Presentation

Algorithme et structure de données

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algorithme et structure de données IUP1 Miage

  2. Structure de donnée composée Une entité qui possède plusieurs attribut (ou champs) Exemple : • Un individu à un nom, un prénom et un numéro • Une voiture à une marque, une puissance, une valeur, …

  3. Les Fractions Une fraction a un numérateur et un dénominateur ; les attributs sont de type entier class Fraction { public int numerateur ; public int denominateur ; }

  4. Comment accéder aux attributs ? class Fraction { public int numerateur; public int denominateur; } public class Test { … main(…){ Fraction f = new Fraction(); f.numerateur=13; f.denominateur=21; S.o.p(f.numerateur/f.denominateur); }

  5. La classe Fraction les attributs sont de type entier, leur valeur initiale est un nombre entier aléatoire (non nul pour le dénominateur !) class Fraction { private final int Max=100; public int numerateur=(int) (Math.random()*Max); public int denominateur=(int) (Math.random()*(Max-1))+1; }

  6. La classe Fraction Une fraction est capable de répondre au message toString() qui retourne une description de la fraction sous la forme d’une String "numerateur/denominateur=valeur " public String toString(){ return numerateur+"/"+denominateur+"="+numerateur/(double)denominateur; }

  7. Comment ce servir da la classe Fraction ? public class Test { … main(…){ Fraction f = new Fraction(); S.o.p(f); } > java Test 13/26=0.5

  8. Comment ce servir da la classe Fraction ? public class Test { … main(…){ Fraction f = new Fraction();S.o.p(f); f.numerateur = 6 ; f.denominateur = 2 ; S.o.p(f); } > java Test 71/22=3.227272727272727 6/2=3.0

  9. Un tableau de Fractions … main(…){ Fraction[] tab=new Fraction[4] ; for(int i=0;i< tab.length;i++){ tab[i]=new Fraction(); S.o.p(tab[i]); } }

  10. Structure de Liste chaînée • Un élément d’une liste possède un attribut valeur (de type entier) et un attribut suivant de type élément • C’est bien une définition récursive ! • Avantage : le nombre d’éléments est variable et les éléments sont créés (ou supprimés) à la demande pendant l’exécution

  11. Élément d’une liste chaînée class Element { public int valeur ; public Elementsuivant ; }

  12. Structure de Liste chaînée • Une liste possède un seul attribut tete de type Element qui représente le premier élément de la liste • Une Liste est initialement vide (la valeur de l’attribut tete est null) class Liste { public Element tete = null ; }

  13. Quatre listes chaînées

  14. Construire une liste vide class Test { … main(…){ Liste l = new Liste() ; S.o.p(l); } } > java Test [ ]

  15. Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); Element e=new Element(); e.valeur=99;e.suivant=null ; l.tete=e; S.o.p(l); } > java Test [ ] [ 99 ]

  16. Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); Element e1 = new Element(); e1.valeur=99;e1.suivant=null ; l.tete=e1;S.o.p(l); Element e2 = new Element(); e2.valeur=100;e2.suivant=l.tete ; l.tete=e2;S.o.p(l); } > java Test [ ] [ 99 ] [ 100 99 ]

  17. Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); Element e1 = new Element(); e1.valeur=99;e1.suivant=null ; l.tete=e1;S.o.p(l); Element e2 = new Element(); e2.valeur=100;e2.suivant=l.tete ; l.tete=e2;S.o.p(l); Element e3 = new Element(); e3.valeur=101;e3.suivant=l.tete ; l.tete=e3;S.o.p(l); } > java Test [ ] [ 99 ] [ 100 99 ] [ 101 100 99 ]

  18. Ajouter un nouvel élément en tête de la liste Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); //l.tete=null Element e1 = new Element(); e1.valeur=99;e1.suivant=l.tete ; l.tete=e1;S.o.p(l); Element e2 = new Element(); e2.valeur=100;e2.suivant=l.tete ; l.tete=e2;S.o.p(l); } > java Test [ ] [ 99 ] [ 100 99 ]

  19. voidajouterEnTete(Element e) • Méthode qui ajoute un nouvel élément en tête de la liste (celle qui reçoit le message) class Liste { public Element tete = null ; void ajouterEnTete(Element e){ e.suivant=this.tete ; this.tete=e; } }

  20. Créer une liste de 10 éléments … class Element { public int valeur = (int) (Math.random()*100); public Element suivant ; } class Test { … main(…) { Liste l= new Liste() ; S.o.p(l); for(int i=0; i<10 ; i++) l.ajouterEnTete(new Element()) ; S.o.p(l); } } > java Test [ ] [ 65 32 66 33 55 51 12 36 11 83 ]

  21. String toString() Méthode qui retourne une description de la liste (celle qui reçoit le message) sous la forme d’une String "[valeurDeTete..valeurDeQueue]"  class Test { … main(…) { Liste l = new Liste() ; for(int i=0;i<10;i++) l.ajouterEnTete(new Element()) ; S.o.p(l); S.o.p(l.toString()); } }

  22. String toString() class Liste { public Element tete = null ; String toString(){ String s="[ "; for(Element p=tete;p!=null;p=p.suivant) s+=p.valeur+" "; return s+="]"; } }

  23. Recherche dans une liste class Test { … main(…) { Liste l= new Liste() ; for(int i=0;i<10;i++) l.ajouterEnTete(new Element()); S.o.p("20 in " + l + " is " + l.estDans(20)); } } > java Test 20 in [ 49 34 3 49 56 37 73 67 82 99 ] is false > java test 20 in [ 16 20 84 5 97 24 26 18 58 84 ] is true

  24. Recherche dans une liste boolean estDans(int x) { Element p=tete; while (p != null && p.valeur != x) p = p.suivant; return !(p == null) ; }

  25. Retirer le premier élément class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++){ l.ajouterEnTete(new Element()); } S.o.p(l);l.retirerEnTete();S.o.p(l); } } > java Test [ 33 74 44 73 20 29 47 51 11 36 ] [ 74 44 73 20 29 47 51 11 36 ]

  26. Retirer le premier élément void retirerEnTete(){ if (! listeVide()) tete=tete.suivant; }

  27. Suppression de la première occurrence class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++) { l.ajouterEnTete(new Element()); } S.o.p(l); l.supprimer(20) ; S.o.p(l); } } > java Test [ 48 71 76 3 13 72 85 0 56 90 ] [ 48 71 76 3 13 72 85 0 56 90 ] > java Test [ 37 7 20 26 6 5 57 80 0 87 ] [ 37 7 26 6 5 57 80 0 87 ]

  28. Suppression de la première occurrence de v void supprimer(int v){ Element p=tete; if (tete != null){ if (tete.valeur==v) { retirerEnTete();} else { while (p.suiv!=null && p.suiv.valeur!=v) p=p.suiv; if (p.suiv!=null) p.suiv=p.suiv.suiv; } } }

  29. Suppression de la première occurrence P P

  30. Retirer le dernier élément class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++){ l.ajouterEnTete(new Element()); } S.o.p(l);l.retirerEnQueue();S.o.p(l); } } > java Test [ 33 74 44 73 20 29 47 51 11 36 ] [ 33 74 44 73 20 29 47 51 11 ]

  31. Retirer le dernier élément void retirerEnQueue(){ if (! listeVide()) if (tete.suivant==null) // un seul element tete=null; else{ // au moins deux elements Element p=tete; while (p.suivant.suivant!=null) p=p.suivant; p.suivant=null; } }

  32. Ajouter en queue class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++) { l.ajouterEnTete(new Element()); } S.o.p(l); l.ajouterEnQueue(new Element()); S.o.p(l); } } > java Test [ 96 21 38 79 99 6 67 4 78 45 ] [ 96 21 38 79 99 6 67 4 78 45 33 ]

  33. Ajouter en queue void ajouterEnQueue(Element e){ Element p=tete; if (listeVide()) { e.suivant=this.tete ; this.tete=e; } else { // au moins un element while (p.suivant!=null) p=p.suivant; p.suivant=e; e.suivant=null; } }

  34. Insertion d'un élément dans la liste en maintenant l'ordre croissant class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++) l.inserer(new Element()); S.o.p(l); } } > java Test [ 0 20 38 39 41 58 63 79 92 92 ] > java Test [ 3 14 33 36 46 52 62 70 71 73 ]

  35. Insertion d'un élément dans la liste en maintenant l'ordre croissant void inserer(Element nouveau) { int v= nouveau.valeur ; if (tete == null || tete.valeur > v) { nouveau.suivant = tete ; tete = nouveau; } else { // On recherche la position ou insérer la valeur Element precurseur = tete; Element curseur = tete.suivant; while(curseur != null && curseur.valeur < v) { precurseur = curseur ; curseur = curseur.suivant; } precurseur.suivant = nouveau ; nouveau.suivant = curseur; } }

  36. La classe Personne Une personne possède : • un attribut numero (de type int) • un attribut nom (de type String) • un attribut suivant (de type Personne)

  37. La classe Personne class Personne { public int numero ; public String nom ; public Personne suivant ; public String toString(){ return "("+numero+","+nom+")"; } }

  38. La classe ListeDePersonnes class ListeDePersonnes { public Personne tete = null ; public String toString(){ String s="[ "; for(Personne p=tete;p!=null;p=p.suivant) s+=p.toString()+" "; return s+="]"; } }

  39. Liste de Personnes triée sur le numéro On suppose que la liste est triée par ordre croissant des numéros de personne void inserer(Personne p) Méthode qui ajoute un nouvel élément p dans la liste (celle qui reçoit ce message) en conservant l’ordre des numéros

  40. Liste de Personnes triée sur le numéro class Test { … main(…){ ListeDePersonnes l = new ListeDePersonnes(); Personne p ; for(int i=0; i<5 ; i++) { p=new Personne(); p.numero=(int) (Math.random()*100); p.nom=Console.readLine("Le Nom ?"); l.inserer(p); } S.o.p(l); } } > java Test [ (17,tutu) (22,toto) (39,titi) (45,tete) (95,tata) ]

  41. void inserer(Personne nouveau) void inserer(Personne nouveau) { int v= nouveau.numero ; // On teste si la liste est vide if (tete == null || tete.numero > v) { nouveau.suivant = tete ; tete = nouveau; } else { // On recherche la position ou insérer la valeur Personne precurseur = tete; Personne curseur = tete.suivant; while(curseur != null && curseur.numero < v) { precurseur = curseur; curseur = curseur.suivant; } precurseur.suivant = nouveau; nouveau.suivant = curseur; } }

  42. Liste de Personnes triée sur le nom On suppose que la liste est triée par ordre croissant des noms de personne void inserer2(Personne p) Méthode qui ajoute un nouvel élément p dans la liste (celle qui reçoit ce message) en conservant l’ordre des noms

  43. void inserer2(Personne nouveau) void inserer2(Personne nouveau) { String v = nouveau.nom ; if (tete == null || tete.nom.compareTo(v)>0) { nouveau.suivant = tete; tete = nouveau; } else { // On recherche la position ou insérer la valeur Personne precurseur = tete; Personne curseur = tete.suivant; while(curseur != null && curseur.nom.compareTo(v)<0) { precurseur = curseur; curseur = curseur.suivant; } precurseur.suivant = nouveau; nouveau.suivant = curseur; } }

  44. Liste chaînée circulaire • On suppose qu’il existe au moins un élément • Le dernier « pointe »  sur le premier • Comment détecter le dernier élément ?

  45. Liste chaînée circulaire

  46. Créer une liste circulaire e tete

  47. Créer (construire) une liste circulaire class ListeCirculaire { public Element tete ; public ListeCirculaire(){ Element e = new Element(); tete = e ; e.suivant = tete ; } }

  48. Créer (construire) une liste circulaire class Test { … void main(…){ ListeCirculaire lc=new ListeCirculaire(); S.o.p(lc); } } > java Test [ 83 ]

  49. void ajouterEnTete(Element e) class Test { … void main(…){ ListeCirculaire lc=new ListeCirculaire(); for(int i=0; i<5 ; i++) lc.ajouterEnTete(new Element()); S.o.p(lc); } } > java Test [ 68 61 26 12 92 94 ]

  50. void ajouterEnTete(Element e) class ListeCirculaire { public Element tete ; public ListeCirculaire(){…} public Element dernierElement(){ Element p=tete;while(p.suivant!=tete) p=p.suivant; return p; } public void ajouterEnTete(Element e){ Element d=this.dernierElement(); e.suivant=this.tete ; this.tete=e; d.suivant=tete; }

More Related