TD 2 : Structures de données et algorithmes élémentaires
Les méthodes de tous les exercices doivent être écrites
dans les classes fournies en annexe
(télécharger ces classes)
.
Donnez pour chaque méthode son en-tête et sa complexité, et accompagnez
chaque itération de son invariant.
EXERCICE 1
Le principe de la recherche dichotomique consiste à couper la tranche de
tableau dans laquelle on cherche en deux demi-tranches de même
taille, et à chercher éventuellement la clef dans l'une seulement de ces
demi-tranches. On peut généraliser cette technique en coupant une tranche
en k tranches de même taille. Dans cet exercice, on étudie le cas k =
3 qui constitue une recherche trichotomique.
Comparez la complexité en nombre de comparaisons entre les clefs dans le
pire des cas pour les recherches dichotomique et trichotomique.
Ecrivez la méthode chercher de la classe Recherche qui
recherche un objet de clef donnée dans un tableau trié en effectuant une
recherche trichotomique.
EXERCICE 2
Un programme source Java est un texte qui obéit à
certaines règles syntaxiques. En particulier, les caractéres de
regroupement (les caractères '('
, '{'
et '['
)
apparaissent toujours par deux, un caractère ouvrant et le
caractère fermant correspondant. Par exemple, le texte suivant est un
fragment de source Java (syntaxiquement) correct :
public void affecter(Object x) { table[i.suivant()] = x; }
Chaque caractère de regroupement ouvrant est suivi du caractère fermant
correspondant. On dit alors que le texte est équilibré.
En supposant que le fragment de source Java à tester est dans la
chaîne de caractères s, écrivez la méthode equilibree de la classe ChaineEquilibree qui teste si le texte qui est
dans s est équilibré.
S'assurer que, pour chaque caractère de regroupement, il y a autant de
caractères ouvrants et fermants ne suffit pas : par exemple le texte
``({)[}]'' n'est pas équilibré...
EXERCICE 3
Etant donnée une suite d'entiers S strictement croissante et un
entier n, n > 0, on cherche les valeurs x et y de S telles que y =
x+n. Par exemple, si n = 3 et si la suite S contient 1, 3, 5, 6, 9, 10,
11, 12, 14, 16, les couples (x,y) vérifiant y = x+n sont (3,6),
(6,9), (9,12) et (11,14).
En supposant que l'attribut s de la classe PairesSuite est une
suite strictement croissante contenant des valeurss de type int,
écrivez la méthode afficherLesPaires(int n) qui affiche tous les
couples d'éléments x et y de S tels que y = x + n. Ecrivez ensuite la méthode de même profil de la
classe PairesTableau qui fait la même chose quand la suite est
stockée dans un tableau.
Dans la première méthode, utilisez une file pour stocker les entiers x
tels que x + n > s.valeurCourante(). Dans la deuxième
méthode, c'est une partie du tableau qui joue le rôle de la file...
EXERCICE 4
Dans une gare de chemin de fer, on dispose d'un système rudimentaire pour
composer un train, système illustré par la figure suivante :
Les wagons sont initialement sur la voie A. On désire composer le train sur
la voie B, en utilisant la voie C, qui agit comme une pile. On suppose qu'on
fait passer tous les wagons de la voie A vers la voie B, et que les n
wagons en question sont numérotés de 0 à n-1. Les seules actions
permises sont :
-
le décrochage du wagon de tête (le plus à gauche) de la voie A
et son envoi sur la voie C, ce qui revient à empiler un wagon. On
symbolise cette manoeuvre par la lettre 'E'.
- le décrochage du wagon de tête (celui du haut) de la voie C, son
envoi sur la voie B et son accrochage en queue de rame (au wagon le plus
à droite), ce qui revient à dépiler un wagon. On symbolise
cette manoeuvre par la lettre 'D'.
Une suite d'actions composant un train peut être symbolisée par une
suite de 'E' et de 'D' (une chaîne de caractères). On
appelle une telle chaîne une commande, car elle peut être
interprétée par un robot pour permuter les wagons de la voie A vers
la voie B. Par exemple, on réalise la permutation de la figure
précédente qui fait passer les wagons de la voie A dans l'ordre 0, 1, 2,
3 vers la voie B dans l'ordre 1, 2, 0, 3, avec la commande ``EEDEDDED''. Une
chaîne quelconque formée de 'E' et de 'D' n'est pas nécessairement
une commande. Par exemple, les chaînes ``DEEDD'', ``EEDDDED'' et
``EDEED'' ne sont pas des commandes, et les chaînes ``EDEEDD'' et
``EEDDEDEEDD'' ne sont pas des commandes valides pour permuter 4 wagons.
· Ecrivez la méthode valide(String s, int n) de la classe
Train qui teste si s est une commande valide pour permuter n wagons.
On ne peut pas dépiler dans une pile vide et on peut empiler plusieurs
éléments à la suite.
· En considérant qu'un train de n wagons est une permutation de
0, 1,..., n-1, stockée dans un tableau, écrivez la
méthode valide(int[] t) de la classe Train qui teste si t[0], t[1],...,t[t.length - 1], est une permutation de 0, 1,..., t.length - 1.
Utilisez un tableau de booléens pour savoir si t contient bien une et
une seule fois tous les entiers 0, 1,..., t.length - 1.
· Montrez que si l'ordre initial des wagons (de gauche à droite)
sur la voie A est 0, 1,..., n-1, on peut les arranger dans
l'ordre p0, p1,..., pn-1 si, et seulement si, il
n'existe pas d'indices i, j et k tels que i < j < k et pj < pk <
pi.
Les inégalités pj < pk < pi donnent l'ordre des wagons pi,
pj et pk sur la voie A, alors que les inégalités i < j < k
donnent l'ordre de ces mêmes wagons sur la voie B.
· En considérant que voieA et voieB donne respectivement
l'ordre des wagons sur la voie A et sur la voie B après permutation,
écrivez la méthode commande(int[] voieA, int[] voieB) de la classe
Train qui retourne la commande (un objet du type String) qui
réalise la permutation correspondante. Notez que la permutation voieA
est quelconque et pas nécessairement la permutation 0, 1,...,
n-1. On suppose que voieA et voieB sont correctes et
compatibles (on peut effectivement permuter voieA en voieB).
L'algorithme consiste à composer la permutation voieB en
utilisant voieA et une pile. On ne doit lire les éléments de voieB et de voieA qu'une seule fois.
This document was translated from LATEX by
HEVEA.