G´en´eration de permutations
Licence MIAGE
Octobre 2007
On s’ineresse dans ce TP `a l’´ecriture d’un paquetage de manipulation de permutations. Etant donn´e
un entier Nstrictement positif, une permutation de taille Nest d´efinie comme une liste de N´el´ements non
n´ecessairement ordonn´es compris entre 1 et N, sans doublon. Par exemple, une permutation de taille 5 est
(1,5,4,2,3) ou bien (1,2,3,5,4). On appelle permutation identit´e la permutation dont les ´el´ements sont
tri´es par ordre croissant. Par exemple, pour une taille de 5 la permutation identit´e est (1,2,3,4,5).
Le type permutation sera d´efini ainsi
type PERMUTATION is array (POSITIVE range <>) of POSITIVE;
On voudra disposer des primitives suivantes dans le paquatage en plus de celles demand´ees dans les
questions ci-dessous:
-- met dans p la permutation identite
procedure identite (p : out PERMUTATION);
-- affiche la permtation sous la forme (1, 2, 4, 5, 3)
procedure affiche (p: in PERMUTATION);
D´enombrement
Question Pour Ndonn´e, combien existe-t-il de permutations ? On se propose d’´etablir une ´equation de
r´ecurrence pour r´esoudre cette question.
G´en´eration de permutation al´eatoire
On veut disposer d’une proc´edure dont la signature est la suivante :
procedure permutation_aleatoire (p : in out PERMUTATION);
permettant la g´en´eration al´eatoire d’une permutation.
Pour obtenir un nombre al´eatoire en ADA vous devez proc´eder ainsi (on admet que pest de type
PERMUTATION) :
....
-- definir le sous-intervalle sur lequel on veut tirer un nombre aleatoire
subtype INTERVALLE is POSITIVE range p’range;
-- creer un paquetage de fonctions de generation de nombres aleatoires
package RANDOM_INTERVALLE is new Ada.Numerics.Discrete_Random(INTERVALLE);
use Random_Intetervalle;
-- declarer la graine initialisant le generateur
seed : GENERATOR;
....
begin
....
-- initialise le generateur
reset(seed);
1
....
-- met dans n un nombre aleatoire tire sur INTERVALLE
n := random(seed);
....
Question
1. Trouver un algorithme
2. Impl´ementer et tester
3. Donner la complexit´e en espace et en temps
G´en´eration de toutes les permutations
Le probl`eme suivant est d’ˆetre capable de g´en´erer l’ensemble des permutations qui existent pour une taille
Ndonn´ee. On s’int´eresse `a cela afin d’´evaluer la complexit´e moyenne d’algorithme.
Imaginer un algorithme qui r´ealise ce travail n’est pas ais´e. Lorsque nous ´enum´erons `a la main un
ensemble de permutations `a partir de la permutation identit´e, nous proc´edons de mani`ere syst´ematique.
C’est ce processus que l’algorithme donn´e apr`es, capable de donner la permutation suivante, reproduit.
Mais avant cela nous aurons besoin d’une procedure annexe :
procedure foo (T : in out PERMUTATION; P, Q : POSITIVE) is
Tmp : POSITIVE;
begin
for I in P .. Q - 1 loop
for J in I+1 .. Q loop
if T(I) > T(J) then
Tmp := T(J);
T(J) := T(I);
T(I) := Tmp;
end if;
end loop;
end loop;
end Foo;
Question Que fait foo ?
Algorithme de g´en´eration de la permutation suivante :
1. cherche le plus grand indice tel que p(i)< p(i+ 1)
2. chercher l’indice jtel que p(j) est le plus petit ´el´ement parmi p(i+ 1)..p(N)
v´erifiant p(j)> p(i)
3. ´echanger les ´el´ements iet j
4. ex´ecuter foo sur p(i+ 1..N)
Question
1. d´erouler l’algorithme `a la main pour g´en´erer les deux permutations suivantes de (1,3,2,4)
2. impl´ementer et tester l’algorithme
3. donner la complexit´e en espace et en temps de l’algorithme
2
1 / 2 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !