• Aucun résultat trouvé

1. Classe Liste

N/A
N/A
Protected

Academic year: 2022

Partager "1. Classe Liste"

Copied!
4
0
0

Texte intégral

(1)

LPSIL Ann´ ee 2008-2009 TD Algorithmique - Feuille 4

Listes

On calculera la complexit´ e de chacune des m´ ethodes.

1. Classe Liste

Pour chaque exercice, ´ ecrire les m´ ethodes dans la classe Liste (cas de la liste vide, appel sur la tˆ ete), et dans la classe Chainon (cas du dernier chainon, appel r´ ecursif sur le reste).

• Ecrire la m´ ethode “public String toStringIter()” qui renvoie une chaine de caract` eres d´ ecrivant tous les ´ el´ ements de la liste de fa¸ con it´ erative.

• Ecrire la m´ ethode “public Object chercheElement(int i)” qui renvoie le i

eme

´ el´ ement de la liste (on suppose que l’on num´ erote ` a partir de 0).

• Ecrire la m´ ethode “public void supprimerElement(int i)” qui supprime le i

eme

´ el´ ement de la liste.

• Ecrire la m´ ethode “public Liste intersection(Liste l)” qui renvoie une liste contenant les

´ el´ ements qui appartiennent ` a la fois ` a this et ` a l. Par exemple, si l1 = {“un”, “deux”,

“trois”} et l2 = { “trois”, “quatre”, “un”, “huit”, “cinq”} alors l1.intersection(l2) doit contenir “un” et “trois”.

2. Listes ordonn´ ees

• Ecrire la m´ ethode “public ObjetAClef cherche(int c, int i)” qui renvoie le i

eme

´ el´ ement de clef c le plus ` a gauche.

• Ecrire la m´ ethode r´ ecursive “public ListeOrdonnee fusionneRecursif(ListeOrdonnee l)”

telle que l1.fusionneRecursif(l2) renvoie la liste qui contient les ´ el´ ements de l1 et ceux de l2 tri´ es par ordre croissant.

3. Ensembles

On peut repr´ esenter les ensembles par des listes ordonn´ ees. Dans le cas d’un ensemble les objets sont des entiers et la liste ordonn´ ee ne peut pas contenir deux fois le mˆ eme ´ el´ ement.

• Impl´ ementer les op´ erations ´ el´ ementaires appartient, union et estInclus sur les ensembles dans la classe “Ensemble” donn´ ee en annexe. Commenter chaque m´ ethode en notant les ant´ ec´ edents et cons´ equents, et la complexit´ e dans le pire des cas.

Exemples :

appartenance : 5 appartient ` a {3, 5, 8, 17}, 4 n’appartient pas ` a {3, 5, 8, 17}

union : {3, 5, 8, 17} union {2, 3, 4, 5, 9, 17, 19} vaut {2, 3, 4, 5, 8, 9, 17, 19}

inclusion : {3, 4, 9, 19} est inclus dans {2, 3, 4, 5, 9, 17, 19}

• Expliquer pourquoi il est int´ eressant d’utiliser des listes ordonn´ ees plutˆ ot qu’un tableau ou un vecteur pour coder les ensembles

1

(2)

Annexes

--- CLASSES ChainonEnsemble et Ensemble

--- public class ChainonEnsemble {

protected int element; // l’´el´ement

protected ChainonEnsemble reste; // le lien vers le chainage suivant /**

* Construit un ensemble `a un ´el´ement.

*/

public ChainonEnsemble(int x) { reste = null;

element = x;

}

/** Constructeur priv´e pour les m´ethodes r´ecursives qui construisent des ChainonEnsembles (union, intersection) */

protected ChainonEnsemble(int x,ChainonEnsemble r) { reste = r;

element = x;

} /**

* Teste si le chainon est le dernier

*/

public boolean dernier() { return (reste == null);

} /**

* Accroche un nouveau Maillon contenant l’objet x <br>

* ant´ec´edent : la liste est tri´ee par ordre croissant et ne contient deux fois la m^eme valeur <br>

* cons´equent : la liste contient x, est tri´ee par ordre croissant et ne contient deux fois la m^eme valeur <br>

* complexite : O(n)<br>

*/

public void ajouter(int x) { if (dernier())

reste = new ChainonEnsemble(x);

else if (reste.element > x)

reste = new ChainonEnsemble(x,reste);

else if (x > reste.element) reste.ajouter(x);

// si x est d´ej`a dans la liste on ne fait rien }

/**

* ant´ec´edent : c est un entier

* cons´equent : true s’il y a un ´el´ement de clef c dans l’ensemble this

* complexit´e :

*/

public boolean appartient(int c) { // A COMPLETER

} /**

* ant´ec´edent : l est un ensemble <br>

* cons´equent : true si tous les ´el´ements de this sont aussi dans l

* complexit´e : theta(l1 + l2) o`u l1 et l2 sont les longueurs des deux ensembles

*/

public boolean estInclus(ChainonEnsemble l) { // A COMPLETER

} /**

2

(3)

* ant´ec´edent : l est un ensemble <br>

* cons´equent : un ensemble contenant les ´el´ements de l et ceux de this <br>

* complexit´e :

*/

public ChainonEnsemble union(ChainonEnsemble l) { // A COMPLETER

} /**

* ant´ec´edent : l est un ensemble <br>

* cons´equent : un ensemble contenant les ´el´ements qui appartiennent `a la fois `a l et `a this <br>

* complexit´e :

*/

public ChainonEnsemble intersection(ChainonEnsemble l) { // A COMPLETER

}

public String toString() {

if (dernier()) return element + "";

else return element + " -> " + reste.toString();

} }

--- /** Une classe pour les ensembles <br>

* Un ensemble est repr´esent´e comme une ListeOrdonnee. Il ne peut pas y avoir deux fois le m^eme ´el´ement

*/

public class Ensemble {

private ChainonEnsemble tete; // le lien vers le chainage /**

* Construit un ensemble vide.

*/

public Ensemble() { tete = null;

}

/** Constructeur priv´e pour les m´ethodes r´ecursives qui construisent des Ensembles (union, intersection) */

private Ensemble(ChainonEnsemble c) { tete = c;

} /**

* Teste si l’ensemble est vide

*/

public boolean vide() { return (tete == null);

}

private void ajouterDebut(int x) { if (vide())

tete = new ChainonEnsemble(x);

else tete = new ChainonEnsemble(x,tete);

} /**

* Accroche un nouveau Maillon contenant l’objet x <br>

* ant´ec´edent : la liste est tri´ee par ordre croissant et ne contient deux fois la m^eme valeur <br>

* cons´equent : la liste contient x, est tri´ee par ordre croissant et ne contient deux fois la m^eme valeur <br>

* complexite : O(n)<br>

*/

public void ajouter(int x) { if (vide()|| x<tete.element)

ajouterDebut(x);

else if (x > tete.element) tete.ajouter(x);

// si x est d´ej`a dans la liste on ne fait rien }

3

(4)

/**

* ant´ec´edent : c est un entier

* cons´equent : true s’il y a un ´el´ement de clef c dans l’ensemble this

* complexit´e :

*/

public boolean appartient(int c) { // A COMPLETER

} /**

* ant´ec´edent : l est un ensemble <br>

* cons´equent : true si tous les ´el´ements de this sont aussi dans l

* complexit´e :

*/

public boolean estInclus(Ensemble l) { // A COMPLETER

} /**

* ant´ec´edent : l est un ensemble <br>

* cons´equent : un ensemble contenant les ´el´ements de l et ceux de this <br>

* complexit´e :

*/

public Ensemble union(Ensemble l) { // A COMPLETER

} /**

* ant´ec´edent : l est un ensemble <br>

* cons´equent : un ensemble contenant les ´el´ements qui appartiennent `a la fois `a l et `a this <br>

* complexit´e :

*/

public Ensemble intersection(Ensemble l) { // A COMPLETER

}

public String toString() { if (vide()) return " VIDE ";

else return tete.toString();

} }

4

Références

Documents relatifs

[r]

Ecrire un programme qui permet de saisir une chaine CH alphabétique majuscule et d’aficher si cette chaine est sommet palindrome ou non.. Une chaine est dite palindrome

I On fournit ici une nouvelle fa¸con de caract´ eriser les nombres premiers.. I On doit pour cela utiliser une notion de reste

Le fichier joint contient les donn´ ees permettant de tracer le spectre d’´ emission du soleil (i.e.. En utilisant la fonction indice max(liste) d´

• Ecrire la m´ ethode r´ ecursive “public String reverse(String s)” qui renvoie la chaine s ´ ecrite en sens inverse.. En d´ eduire une version it´ erative de la m´

Compl´eter le programme pour d´eterminer le nombre de caract`eres de chacun des mots contenus dans ce texte. D`es que la longueur d’un mot est connue, affichez en

Le programme devra dire si l’utilisateur a trouv´ e ou pas le nombre, si l’utilisateur ne le trouve pas, le programme devra indiquer si le nombre saisi est trop grand ou trop

Dans un premier temps, on r´ epondra aux questions ` a l’´ ecrit puis pour v´ erifier que nos algorithmes sont bien ´ ecrits, on les programmera sur machine.. Exercice