Algorithmes et Structures de Données

Programming, Data Structures, Algorithms · course

Voir tous les documents en programmation

Friday December 14, 2012

Algorithmes et Structures de Données

2012/2013

Semestre 1

Dr. Chiraz Ben Abdelkader

TD / Listes & Arbres

ADT Liste itérative

Type Liste

Utilise Entier, Elément, Place

Opérations

Liste_vide : → Liste

ième : Liste X Entier → Elément

longueur : Liste

supprimer : Liste X Entier → Liste

insérer : Liste X Entier X Elément → Liste

accès : Liste x Entier → Place

succ : Place → Place

contenu : Place → Elément

Pré-Conditions

ième(l, k) est défini ssi 1 ≤ k ≤ longueur(l)

(avec l : Liste, e : Elément, k : Entier)

supprimer(l, k) est défini ssi 1 ≤ k ≤ longueur(l)

insérer(l, k, e) est défini ssi 1 ≤ k ≤ longueur(l) + 1

Axiomes

longueur(liste-vide) = 0

(avec l : Liste, e : Elément, k : Entier)

longueur(insérer(l,i,e)) = longueur(l) + 1

ième(insérer(l,i,e),i) = e

l ≠ Liste_vide() & 1 ≤ k ≤ longueur(l)

longueur(supprimer(l, k)) = longueur(l) - 1

1 ≤ k ≤ longueur(l) + 1

longueur(insérer(l, k, e)) = longueur(l) + 1

l≠Liste_vide() & 1 ≤ k ≤ longueur(l) & 1 ≤ i < k

ième(supprimer(l, k), i) = ième(l, i)

l≠Liste_vide() & 1 ≤ k ≤ longueur(l) & k ≤ i ≤ longueur(l) - 1

Publicité

ième(supprimer(l, k), i) = ième(l, i+1)

1 ≤ k ≤ longueur(l) + 1 & 1 ≤ i < k

ième(insérer(l, k, e), i) = ième(l, i)

1 ≤ k ≤ longueur(l) + 1 & k = i

ième(insérer(l, k, e), i) = e

1 ≤ k ≤ longueur(l) + 1 & k < i ≤ longueur(l) + 1

ième(insérer(l, k, e), i) = ième(l, i - 1)

ADT Liste Récursive

Type Liste

Utilise Entier, Elément, Place

Opérations

Liste_vide : → Liste

fin : Liste → Liste

cons : Elément X Liste → Liste

premier : Liste → Elément

tète : Liste → Place

succ : Place → Place

contenu : Place → Elément

Pré-Conditions

(avec l : Liste, e : Elément)

tête(l) est défini ssi l ≠ Liste_vide()

fin(l) est défini ssi l ≠ Liste_vide()

premier(l) est défini ssi l ≠ Liste_vide()

Axiomes

(avec l : Liste, e : Elément, k : Entier)

premier(cons(e, l)) = e

fin(cons(e, l)) = l

longueur(Liste_vide()) = 0

longueur(cons(e,l)) ≡

longueur(l) + 1

ADT Pile

Type Pile

Publicité

Utilise Entier, Elément

Opérations

Pile_vide: → Pile

Est_vide: Pile → booléen

empiler: Pile, élément → Pile

dépiler: Pile → File

sommet: Pile → élément

Pré-Conditions

(avec p : Pile, e : Elément)

dépiler(p) est définie ssi Est_vide(p)=faux

sommet(p) est définie ssi Est_vide(p)=faux

Axiomes

(avec p : Pile, e : Elément)

dépiler(empiler(p,e)) = p

sommet(empiler(p,e)) = e

Est_vide(Pile_vide()) = vrai

Est_vide(empiler(p,e)) = faux

ADT File

Type File

Utilise Entier, Elément

Opérations

File_vide: → File

Est_vide: File → Booléen

enfiler: File, Elément → File

défiler: File → File

sommet: File → Elément

Pré-Conditions

(avec p : File, e : Elément)

défiler(f) est définie ssi Est_vide(f) = faux

permier(f) est définie ssi Est_vide(f) = faux

Axiomes

(avec f : File, e : Elément)

défiler(enfiler(f,e)) = p

sommet(enfiler(f,e)) = e

Est_vide(File_vide()) = vrai

Est_vide(enfiler(f,e)) = faux

ADT Arbre Binaire

Publicité

Type Arbre Binaire

Utilise Elément, Noeud

Opérations

Arbre_vide: → Arbre Binaire

Est_vide: Arbre Binaire → Booléen

<- , - , - ,> : Nœud x Arbre Binaire x Arbre Binaire → Arbre Binaire

racine: Arbre Binaire → Nœud

gauche : Arbre Binaire → Arbre Binaire

droit : Arbre Binaire → Arbre Binaire

contenu : Nœud → Elément

Exercices

Listes

1) Les formulations des types abstraits (ADT) Liste Itérative et Liste Récursive sont en fait

équivalentes, donc :

a. Exprimer premier, fin, et cons en fonction de ième, insérer et supprimer

b. Exprimer ième, insérer, supprimer, et longueur en fonction de premier, fin, et cons

2) Donner un algorithme récursif pour chacun des opérations suivantes de Liste Iterative :

longueur, ième, insérer, supprimer.

3)

Implémenter chacun les opérations nouvelles suivantes pour le type abstrait Liste Itérative

basé sur la représentation chainée :

a. Concaténation de deux listes l1 et l2; le résultat est stocké dans une nouvelle liste l3.

La signature de cette opération est donc :

concat: Liste x Liste  Liste

b. Chercher la dernière occurrence d’un élément donné et retourner sa place dans la

liste (0 s’il n’est pas dans la liste). La signature de cette opération est donc :

rechercher: Liste x Elément Entier

c.

Inverser une liste, c’est-à-dire le premier élément devient le dernier, le second

élément devient l’avant-dernier, etc.

inverser: Liste  Liste

La signature de cette opération est donc :

d. Trier les éléments d’une liste. On suppose que Elément est un type article qui

contient un champ key de type réel. Les éléments doivent être triés selon la valeur

de ce champ.

4) Modifier la représentation contigue du type abstrait Liste Itérative en utilisant un tableau

dynamique (à la place du tableau statique), ensuite implémenter toutes ses opérations en se

Publicité

basant sur cette nouvelle représentation.

5) Modifier la représentation chainée du type abstrait Liste Itérative en utilisant une chaine

double-enchainée, ensuite implémenter toutes ses opérations basé sur cette nouvelle

représentation.

6) Modifier la représentation chainée du type abstrait Liste Itérative en utilisant une chaine

circulaire, ensuite implémenter toutes ses opérations en se basant sur cette nouvelle

représentation.

Piles

1) En utilisant les procédures et fonctions de manipulation du type Pile, écrire une procédure qui

enlève le ième élément d’une pile et laisse les autres éléments inchangés. La signature de cette

opération est donc : Procédure Enlever(p : Pile, i : Entier  p : Pile)

2) Lorsqu'on utilise un éditeur de texte, on dispose d'une touche qui permet d'effacer le caractère

que l'on vient de frapper (par exemple "BackSpace"). Notons '#' ce caractère.

Une autre touche permet de tout effacer jusqu'au début de la ligne. Notons '%' ce caractère.

On suppose aussi que la fin d'une ligne sera indiquée par la touche '$'.

Exemple :

"Jem# m'euh%Je m'#euh## suit#s trop#mp&#é$"

sera lu comme

"Je me suis trompé"

Ecrire un algorithme qui permette de lire une ligne de texte avec ce mécanisme en utilisant une

Pile. On écrira deux procédures une procédure LireLigne(P) et une procédure EcrireLigne(P).

On supposera que l'on ne saisit qu'une seule ligne de texte, de longueur quelconque.

Files

1) Fusionner deux files ordonnées d’entiers pour obtenir une file ordonnée d’entiers.

2) Les coefficients d’un polynôme et les exposants sont stockes dans une file. Ecrire un algorithme

Evaluer_polynome pour évaluer un polynôme, étant donné une file f contenant le polynôme et

une valeur x de type réel. On suppose que l’expression du plus haut degré ne dépasse pas 10.

Remarque importante : Toute manipulation d’une file doit passer par les opérations du type

abstrait File (c.a.d on ne doit pas manipuler une file par d’autres opérations qu’on a pas défini dans le

type abstrait File).

Arbres Binaires

5/

Evaluation d'expressions arithmétiques

Arbres Binaires de Recherche