Exercices d'algo

(Cliquez-ici pour accéder à la version originale de cette discussion avec couleurs et images)







Posted by: Morpheus

Salut,
J'aurais besoin d'aide pour les 3 exercices suivants.
Merci d'avance à ceux qui m'aideront.


Exercice 1
Tri de suffixe
On considère une table de caractères,y,de dimension n.Le but de cet exercice est de calculer la table Pos de dimension n pour laquelle

y[Pos[0]..n-1]<y[Pos[1]..n-1]<....<y[Pos[n-1]..n-1]

ou y[i...n-1] = y[i]y[i+1]...y[n-1] désigne le suffixe de y qui est à la position i.
La table fournit ainsi les suffixes non vides de y en ordre croissant (pour l'ordre lexicographique).

1)Ecrire en C le code de la fonction strcmp de prototype
int strcmp(const char *s, const char *t);

Code:
int strcmp(const char*s, const char*t) { while(*s==*t) if(*s=='\0') return 0; if(*s < *t) return -1; return 1; }


2)Ecrire en C une fonction d'en-tete
int Partage(int d, int f, int p) qui appliquée aux suffixes dont les positions sont Pos[d], Pos[d+1], ..., Pos[f] et au pivot y[Pos[p]...n-1] = z (d\le p\le f), effectue le "partage" des suffixes considérés selon le pivot (en modifiant Pos) et produit le plus petit indice k (d\le k\le f) pour lequel y[Pos[k]...n-1] = z

Code:
void echanger(char **s, char **t) { char *tmp; tmp = *s; *s = *t; *t = tmp; } int Partage(int i,int f,int d) { char *Pos; int g=i,d=j; echanger(&Pos[p],&Pos[f]); char pivot = Pos[f]; do { while(Pos[g]< pivot) g=g+1; while(d >= g && Pos[d] >=pivot) d=d-1; if(g < d) { echanger(&Pos[g],&Pos[d]); g=g+1; d=d-1; } }while(g>d) return g; }



3)Ecrire un algorithme de classement des suffixes de y qui produit la table Pos en utilisant la fonction de partage du 2. Quelle table Pos obtient-on avec y = "abracadabra" ?

4)Donnez une majoration asymptotique des temps d'execution de
Partage(d,f,p) et de l'algorithme de classement. Quel peut etre son temps moyen d'éxécution en supposant que le temps moyen pour comparer 2 suffixes est O(logn)[/b]



Posted by: Morpheus

Exercice 2

Arbres feuillus
Les arbres considérés dans cet exercice sont des arbres binaires feuillus (complets) dont les noeuds sont des entiers . À un tel arbre A on associe le mot
 Str(A)=\left\{\begin{matrix} 1 &amp; \mbox{si }A\mbox{ est reduit a une feuille} \\ 0Str(G)Str(D) &amp; \mbox{si }A=(r,G,D)\mbox \end{matrix}\right.

ou r est la racine de A, G son sous-srbre gauche et D son sous-abre droit.

1)Calculer Str((1,(2,(3),(4)),(5))) et Str((1,(2),(3,(4),(5))))
Dessinez les arbres qui correspondent aux mots 0001111 et 0101011

Str((1,(2,(3),(4)),(5)))
00111

Str((1,(2),(3,(4),(5))))
01011

2)Soit x = Str(A) et y = Str(B) pour 2 arbres A et B
Montrez que x = y si et seulement si A et B sont égaux à la numérotaion près de leurs noeuds (autrement dit, s'il existe une bijection entre les noeuds qui respecte la structure de l'arbre)
*si A = B on a Str(A) = Str(B) et donc x=y
*si x = y on a Str(a) = Str(B) et donc A = B


3)Indiquer comment mémoriser dans un fichier le code obtenu par la méthode de Huffman , en adaptant la fonction Str à appliquer à l'arbre de Huffman de codage

Pour mémoriser dans un fichier le code obtenu,il suffit d'indiquer que la valeur 0 correspond à un noeud et 1 à une feuille.
En parcourant la suite binaire on pourra reconstituer l'arbre.

4)Ecrire une fonction C qui produit sur la sortie standart x = Str(A) pour un arbre A
Code:
typedef struct noeud { int val; struct noeud *g,d; }Noeud ; typedef Noeud *Arbre; void Str(Arbre A) { printf('0'); while(A->g->g !=NULL) { printf('0'); A = A->g; } printf('1'); while(A->d->d !=NULL) { printf('0'); A = A->d; } printf('1'); }


5)Ecrire une fonction C qui, à partir d'un mot binaire Str(A) sur l'entée standart ,reconstruit l'arbre A



Posted by: Morpheus

Exercice 3

Sous-mots

Soient 2 mots x et y supposés déclarés en C par:

char x[100]; char y[100];

1)Écrire en C une fonction qui teste si x est un sous-mot de y

2)Ecrire en C une fonction qui calcule lsc(x,y),la longueur maximale des sous-mots communs à x et y

3)Calculer la table Tx,y relative aux mots x = agctga et y = cagatcagag et définie par :

Tx,y[i,j] = lsc(x[0]x[1]...x[i-1],y[0]y[1]...y[j-1])

ou i = 0,1...|x| et j= 0,1...|y|.(Pour i = 0 on convient x[0]x[1]...x[i-1] est le sous mot vide; meme convention avec y[0]y[1]...y[j-1] quand j = 0)

4)Quels sont les plus longs sous-mots communs à agctga et cagatcagag?.
Indiquer comment calculer un sous mot commun à x et y et de longeur lsc(x,y) à partir de la table Tx,y



Posted by: N_comme_Nul

Salut !

Rien que ça ?

Je vais voir ce que je peux faire



Posted by: N_comme_Nul

Pour l'implémentation de la fonction strcmp, il en existe des tonnes. Je te file celle de Solaris , celle de FreeBSD est presque pareille :
Code:
/* Comparaison des chaines s et t comme suit : s>t: >0 s==t: 0 s<t: <0 */ int strcmp(const char *s, const char *t) { if (s == t) return (0); while (*s == *t++) if (*s++ == '\0') return (0); return (*(unsigned char *)s - *(unsigned char *)--t); }




Posted by: N_comme_Nul

Ta notion de "suffixe", c'est en fait la notion de "sous-chaîne" ?

Dis-moi si je me trompe :
si l'on a
Code:
y[]="maison"

alors on devra trouver
Code:
pos[]={1,2,0,5,4}

ce qui correspond à
"aison" \leq "ison" \leq "maison" \leq "n" \leq "on" \leq "son"

L'énoncé de l'exercice 1 est pénible ! Si je faisais de l'info avec ce genre d'écriture ça serait C'aurait été plus simple de tout faire soi-même et non de passer par cette fonction "Partage".



Posted by: Morpheus

Citation:
Posté par N_comme_Nul
Ta notion de "suffixe", c'est en fait la notion de "sous-chaîne" ?

Dis-moi si je me trompe :
si l'on a
Code:
y[]="maison"

alors on devra trouver
Code:
pos[]={1,2,0,5,4}

ce qui correspond à
"aison" \leq "ison" \leq "maison" \leq "n" \leq "on" \leq "son"

L'énoncé de l'exercice 1 est pénible ! Si je faisais de l'info avec ce genre d'écriture ça serait C'aurait été plus simple de tout faire soi-même et non de passer par cette fonction "Partage".

Citation:
Posté par N_comme_Nul
Ta notion de "suffixe", c'est en fait la notion de "sous-chaîne" ?

Oui,c'est bien cela



Posted by: Morpheus

Il n' y a personne qui sache comment répondre aux questions des exos?



Posted by: N_comme_Nul

Salut !

Cela fait ( au moins ) sur 3 fora que tu postes ces exercices.
Personne, apparemment, ne te répond (et pour l'implémentation du strcmp, franchement, un p'tit coup de google et on en parlait plus, c'est ce que j'ai fait d'ailleurs dans un précédent post). Je pense deviner pourquoi : tu mets des tartines d'énoncés sans rien montrer de ce que TOI tu as fait. Un peu de courage ! Ne laisse pas les autres faire tes exercices ... sinon à quoi bon, tu ne progresseras jamais.

Georg.



Posted by: Morpheus

Citation:
Posté par N_comme_Nul
Salut !

Cela fait ( au moins ) sur 3 fora que tu postes ces exercices.
Personne, apparemment, ne te répond (et pour l'implémentation du strcmp, franchement, un p'tit coup de google et on en parlait plus, c'est ce que j'ai fait d'ailleurs dans un précédent post). Je pense deviner pourquoi : tu mets des tartines d'énoncés sans rien montrer de ce que TOI tu as fait. Un peu de courage ! Ne laisse pas les autres faire tes exercices ... sinon à quoi bon, tu ne progresseras jamais.

Georg.


Salut,
je viens de mettre mes réponses mais il faut remonter au sujet.
Si tu as un avis sur ce que j'ai fait n'hésite pas.











-