Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1787 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  [Algo] + longue Sequence commune à 2 sequences

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Algo] + longue Sequence commune à 2 sequences

n°406985
farib
Posté le 25-05-2003 à 11:07:33  profilanswer
 


pour faire cet algo je procede en construisant un tableau qui donne les longueurs des plus longues sous chaines communes des sous-chaines  
 
, determinees par les indices du tableau, puis en lisant la derniere ligne il est facile de reconstituer la plus longue sous  
 
chaine. Je suis ptet pas super clair mais sans doute ceux qui connaissent cet algorithme me comprendront
 


$ ./plsc.exe abcdefghijkl abbcdfghj
horizontalement : abbcdfghj
verticalement   : abcdefghijkl
0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1
0 1 2 2 2 2 2 2 2 2
0 1 2 2 3 3 3 3 3 3
0 1 2 2 3 4 4 4 4 4
0 1 2 2 3 4 4 4 4 4
0 1 2 2 3 4 5 5 5 5
0 1 2 2 3 4 5 6 6 6
0 1 2 2 3 4 5 6 7 7
0 1 2 2 3 4 5 6 7 7
0 1 2 2 3 4 5 6 7 8
0 1 2 2 3 4 5 6 7 8
0 1 2 2 3 4 5 6 7 8
La plus longue sous-chaine est abcdfghj


 
la question est : c'est une complexité m x n ,c'est pas si mal, mais en memoire ca bouffe bcp. En fait il n'est pas  
 
nécessaire de sauvegarder tout le tableau, donc je peux ne sauvegarder que la derniere colonne remplie a chaque fois, ca fera  
 
une belle optimisation de memoire (m+n au lieu de m*n).  
Sinon Y a t-il un autre algo plus effiace que m*n ( nivo complexite, pas memoire)?
 
mon code, sous license GPL :D

Code :
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std ;
  5. int main(int argc, char *argv[])
  6. {
  7. if (argc != 3 ){ cout << "erreur d'argument" << endl ; return 0;}
  8. string Chaine_X = argv[1];
  9. string Chaine_Y = argv[2];
  10. vector< vector<int> > Tableau_K(Chaine_X.length()+1) ;
  11. for (int i = 0;  i <= Chaine_X.length() ; i++)
  12. {
  13.  Tableau_K[i]=vector<int>(Chaine_Y.length()+1);
  14.  fill(Tableau_K[i].begin(),Tableau_K[i].end(),0);
  15. }
  16. for ( int i = 1 ; i <= Chaine_X.length() ; i++)
  17. for ( int j = 1 ; j <= Chaine_Y.length() ; j++)
  18. if (Chaine_X[i-1]!=Chaine_Y[j-1] && Tableau_K[i-1][j]==Tableau_K[i][j-1] && Tableau_K[i-1][j]==Tableau_K[i-1][j-1] )
  19. {
  20.  Tableau_K[i][j]=Tableau_K[i-1][j-1] ;
  21. }
  22. else
  23. {
  24.  Tableau_K[i][j]=Tableau_K[i-1][j-1]+1 ;
  25. }
  26. cout << "horizontalement : " << Chaine_Y << endl;
  27. cout << "verticalement   : " << Chaine_X << endl;
  28. for ( int i = 0 ; i <= Chaine_X.length() ; i++)
  29. {for ( int j = 0 ; j <= Chaine_Y.length() ; j++) cout << Tableau_K[i][j] << " ";cout << endl;}
  30. string PLSC="";
  31. for (int i = 1; i <= Chaine_Y.length(); i++)
  32.  if (Tableau_K[Chaine_X.length()][i]==Tableau_K[Chaine_X.length()][i-1]+1)
  33.   PLSC+= Chaine_Y[i-1];
  34. cout << "La plus longue sous-chaine est " << PLSC << endl;
  35. return 0;
  36. }

mood
Publicité
Posté le 25-05-2003 à 11:07:33  profilanswer
 

n°406986
Taz
bisounours-codeur
Posté le 25-05-2003 à 11:20:06  profilanswer
 

je regarde l'alog, mais niveau implémentation, y a du boulot!

n°406987
farib
Posté le 25-05-2003 à 11:25:51  profilanswer
 

++Taz a écrit :

je regarde l'alog, mais niveau implémentation, y a du boulot!


je sais. LA c'est l'étape : "ca marche".
 
ensuite, je pase à l'étape : "çai bô" et "çai rapide"

n°406993
Taz
bisounours-codeur
Posté le 25-05-2003 à 11:30:51  profilanswer
 

putain, sur google, y a plein de resultat avec ton algo en m*, mais des fois est evoqué un algo en temps pseudo linéaire

n°407000
Evadream -​jbd-
Posté le 25-05-2003 à 11:44:40  profilanswer
 

J'ai trouvé une page qui pourrait peut-être t'intéressé :
 
http://www.crpgl.lu/cortina/Details/LCS.html
 
Je n'ai pas apercu de calcul complexité, mais ca semble balayer pas mal de type de solutions !
 
 
@+

n°407002
Taz
bisounours-codeur
Posté le 25-05-2003 à 11:50:37  profilanswer
 

c'est le meme aglo qui est expliqué

n°407004
Evadream -​jbd-
Posté le 25-05-2003 à 11:54:56  profilanswer
 

Ok, je sors.

n°407012
Taz
bisounours-codeur
Posté le 25-05-2003 à 12:23:25  profilanswer
 

http://www.csse.monash.edu.au/~llo [...] 6.IPL.html
 
meme algo, à un truc pres, qui donne un bon boost apparemment

n°407044
farib
Posté le 25-05-2003 à 13:55:03  profilanswer
 

++Taz a écrit :

http://www.csse.monash.edu.au/~llo [...] 6.IPL.html
 
meme algo, à un truc pres, qui donne un bon boost apparemment


 
merci bien, je sens que je v passer un bon bout de temps là-dessus  le comprendre. De la m^me maniere qu'il a fallut qq heures pour comprendre mon algo qui s'implémente en qq misérables   lignes de code

n°407050
Taz
bisounours-codeur
Posté le 25-05-2003 à 14:05:36  profilanswer
 

:D

mood
Publicité
Posté le 25-05-2003 à 14:05:36  profilanswer
 

n°407067
farib
Posté le 25-05-2003 à 14:48:34  profilanswer
 

bon la j'ai compris  ou était l'astuce, masi j'ai pas encore compris pourquoi effectivement ca marchait
 

Citation :


Each segment extends from the position of a 1 in rowi-1 rightward to the position to the left of the next 1. If the left-hand bit of rowi-1 is zero, the left-most segment extends from the left of the bi-string to the position left of the first 1. Rowi is formed by setting only the right-most 1 bits in each segment of the bi-string. If a segment is all zero, the bit defining the left end of the segment should be set in rowi (that is the segmenting bit in rowi-1). This can be ensured by first or-ing rowi-1 into the bi-string.


 
je comprend que la c genial, mais je comprend pas pkoi
 
 
par la suite, y'a encore 2-3 optimsation que je dois comprendre, mé c pas facile

n°407070
Taz
bisounours-codeur
Posté le 25-05-2003 à 14:52:28  profilanswer
 

ben comme toutes les optimsiations aggressives, c'est cahud...
 
quand t'auras besoin de conseil d'implémentation, n'hesite pas

n°407082
farib
Posté le 25-05-2003 à 15:19:55  profilanswer
 

bon, la g compris ce qu'il faillait faire, mais je demande que le taré qui a mis au point cette technique soit interné en maison de repos.  :D  
 
 
sinon, nivo implémentation, je vois pas ce que tu me reproches ? ( sans doute as-tu raison mais je suis aveugle)

n°407095
farib
Posté le 25-05-2003 à 15:38:49  profilanswer
 

y'a juste son point 2.3 ke je capte pas, pour prendre une LCS il suffit de lire la dernière ligne, et pourtant lui il fait une technique super compliquée...

n°407410
Taz
bisounours-codeur
Posté le 25-05-2003 à 23:50:16  profilanswer
 

doit y avoir un moyen d'améliorer les choses si les chaines sont pas de meme longueur   [:spamafote]

n°407418
farib
Posté le 26-05-2003 à 00:09:07  profilanswer
 

pour ce qui est de de trouver une PLSC, il suffit de "lire" une dernieres ligne ou colonne


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°407428
Taz
bisounours-codeur
Posté le 26-05-2003 à 00:33:34  profilanswer
 

en tout cas je sais pas si tu as vu, mais avec seulement les 2 dernières lignes, on fait tout le boulot sans problèmes

n°407434
Taz
bisounours-codeur
Posté le 26-05-2003 à 00:49:27  profilanswer
 

hey, mais j'ai bien l'impression que l'algo foire dis-donc?

n°407467
Angel_Doog​las
Le dernier des humains
Posté le 26-05-2003 à 04:47:09  profilanswer
 

farib a écrit :


 
 
 
la question est : c'est une complexité m x n ,c'est pas si mal, mais en memoire ca bouffe bcp. En fait il n'est pas  
 
nécessaire de sauvegarder tout le tableau, donc je peux ne sauvegarder que la derniere colonne remplie a chaque fois, ca fera  
 
une belle optimisation de memoire (m+n au lieu de m*n).  
Sinon Y a t-il un autre algo plus effiace que m*n ( nivo complexite, pas memoire)?
 
 


 
Non, la complexite restera de l'ordre m*n.

n°407489
farib
Posté le 26-05-2003 à 08:25:01  profilanswer
 

++Taz a écrit :

hey, mais j'ai bien l'impression que l'algo foire dis-donc?


lekel ?


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°407490
farib
Posté le 26-05-2003 à 08:26:17  profilanswer
 

++Taz a écrit :

en tout cas je sais pas si tu as vu, mais avec seulement les 2 dernières lignes, on fait tout le boulot sans problèmes


vivi, puis qu'elles indiquent les lettres a prendre dans l'autre chaine pour former la PLSC


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°407553
Taz
bisounours-codeur
Posté le 26-05-2003 à 10:15:08  profilanswer
 

ben regarde ton exemple

n°407784
farib
Posté le 26-05-2003 à 12:26:23  profilanswer
 

++Taz a écrit :

ben regarde ton exemple


 
bah il est coherent.


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°407787
Taz
bisounours-codeur
Posté le 26-05-2003 à 12:28:27  profilanswer
 

abcdefghijkl abbcdfghj
 
 
abcdfghj n'est pas dans abcdefghijkl  
abcdfghj n'est pas dans abbcdfghj
 
c'est pas ce que j'appelle etre en "commun"

n°407807
farib
Posté le 26-05-2003 à 12:45:19  profilanswer
 

++Taz a écrit :

abcdefghijkl abbcdfghj
 
 
abcdfghj n'est pas dans abcdefghijkl  
abcdfghj n'est pas dans abbcdfghj
 
c'est pas ce que j'appelle etre en "commun"
 


tu ne connais pas le probleme
 
en fait ce probleme de plsc c'est la plus longue sous chaine obtenue en supprimant si necessaires de elements de la chaine 1 ou 2, c'est pour cela que ca devient interessant, avec ta definition c trivial
 
( application : diff, en considerant qu'une ligne de code est un symbole )


Message édité par farib le 26-05-2003 à 12:45:59

---------------
Bitcoin, Magical Thinking, and Political Ideology
n°407813
Taz
bisounours-codeur
Posté le 26-05-2003 à 12:51:27  profilanswer
 

avec ma definition c'est pas trivial, mais la tienne je la comprends pas, on dirait l'interesction d'ensemble

n°408353
farib
Posté le 26-05-2003 à 19:31:02  profilanswer
 

++Taz a écrit :

avec ma definition c'est pas trivial, mais la tienne je la comprends pas, on dirait l'interesction d'ensemble


avec ta définition ca se fait de maniere quasi-linéraire
 
moi c'est la plus longue sous chaine commune en supprimant des élements
 
application : tu veux comparer deux chaines d'adn, une originale et une mutée. la mutée, elle aura des segments insérés, supprimes, ou remplacés. masi grace a l'algo tu retrouve la plsu longue chaien commune.


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°408656
Angel_Doog​las
Le dernier des humains
Posté le 27-05-2003 à 00:03:32  profilanswer
 

farib a écrit :


avec ta définition ca se fait de maniere quasi-linéraire
 
moi c'est la plus longue sous chaine commune en supprimant des élements
 
application : tu veux comparer deux chaines d'adn, une originale et une mutée. la mutée, elle aura des segments insérés, supprimes, ou remplacés. masi grace a l'algo tu retrouve la plsu longue chaien commune.


 
Et  la je pense qu'il n'y a plus de probleme de "definition".

n°408681
farib
Posté le 27-05-2003 à 00:36:44  profilanswer
 

le probleme c'est qu'on l'appelle plsc


Message édité par farib le 27-05-2003 à 00:37:06

---------------
Bitcoin, Magical Thinking, and Political Ideology
n°408689
Angel_Doog​las
Le dernier des humains
Posté le 27-05-2003 à 00:43:37  profilanswer
 

Ce qui est qualifie de sous chaine ici est en fait la plus longue chaine commune possible avec gaps:
En reprenant ton exemple:
 

abbcdfghj
ab-cd-fgh-j--
abcdefghijkl

n°408713
Taz
bisounours-codeur
Posté le 27-05-2003 à 07:16:11  profilanswer
 

__avec__ des gaps... la notion de chaine/sequence en prends un coup... mais si ça te satisfait   [:spamafote]

n°409036
Angel_Doog​las
Le dernier des humains
Posté le 27-05-2003 à 11:59:09  profilanswer
 

Sans gaps, on ne s'en sort pas dans les sequences biologiques. Par contre cette maniere de faire n'est absolument pas interressante pour trouver des alignements biologiquement satisfaisants.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  [Algo] + longue Sequence commune à 2 sequences

 

Sujets relatifs
Algo pour conversion Timestamp <-> Date ISOalgo de conversion d image 16 bits en 24 bits
[HTML] Problème d'esthétique : déformation de page avec url tro longueAlgo QuickSearch
[Oracle] utiliser une sequence dans une insertion[Algo] Affichage d'un tableau dans un format particulier
[algo] tri de liste+retirer les doublonsAlgo de prim, kruskal et dijskra
[Algo] Détecter l'orientation d'une image (et étapes intermédiaires)Algo de Dijkstra en C : j'y arrive pas !!!!
Plus de sujets relatifs à : [Algo] + longue Sequence commune à 2 sequences


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR