[Algo] + longue Sequence commune à 2 sequences

+ longue Sequence commune à 2 sequences [Algo] - Algo - Programmation

Marsh Posté le 25-05-2003 à 11:07:33    


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. }

Reply

Marsh Posté le 25-05-2003 à 11:07:33   

Reply

Marsh Posté le 25-05-2003 à 11:20:06    

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

Reply

Marsh Posté le 25-05-2003 à 11:25:51    

++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"

Reply

Marsh Posté le 25-05-2003 à 11:30:51    

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

Reply

Marsh Posté le 25-05-2003 à 11:44:40    

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 !
 
 
@+

Reply

Marsh Posté le 25-05-2003 à 11:50:37    

c'est le meme aglo qui est expliqué

Reply

Marsh Posté le 25-05-2003 à 11:54:56    

Ok, je sors.

Reply

Marsh Posté le 25-05-2003 à 12:23:25    

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

Reply

Marsh Posté le 25-05-2003 à 13:55:03    

++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

Reply

Marsh Posté le 25-05-2003 à 14:05:36    

:D

Reply

Marsh Posté le 25-05-2003 à 14:05:36   

Reply

Marsh Posté le 25-05-2003 à 14:48:34    

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

Reply

Marsh Posté le 25-05-2003 à 14:52:28    

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

Reply

Marsh Posté le 25-05-2003 à 15:19:55    

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)

Reply

Marsh Posté le 25-05-2003 à 15:38:49    

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...

Reply

Marsh Posté le 25-05-2003 à 23:50:16    

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

Reply

Marsh Posté le 26-05-2003 à 00:09:07    

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


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-05-2003 à 00:33:34    

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

Reply

Marsh Posté le 26-05-2003 à 00:49:27    

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

Reply

Marsh Posté le 26-05-2003 à 04:47:09    

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.

Reply

Marsh Posté le 26-05-2003 à 08:25:01    

++Taz a écrit :

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


lekel ?


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-05-2003 à 08:26:17    

++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
Reply

Marsh Posté le 26-05-2003 à 10:15:08    

ben regarde ton exemple

Reply

Marsh Posté le 26-05-2003 à 12:26:23    

++Taz a écrit :

ben regarde ton exemple


 
bah il est coherent.


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-05-2003 à 12:28:27    

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

Reply

Marsh Posté le 26-05-2003 à 12:45:19    

++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
Reply

Marsh Posté le 26-05-2003 à 12:51:27    

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

Reply

Marsh Posté le 26-05-2003 à 19:31:02    

++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
Reply

Marsh Posté le 27-05-2003 à 00:03:32    

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".

Reply

Marsh Posté le 27-05-2003 à 00:36:44    

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
Reply

Marsh Posté le 27-05-2003 à 00:43:37    

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

Reply

Marsh Posté le 27-05-2003 à 07:16:11    

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

Reply

Marsh Posté le 27-05-2003 à 11:59:09    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed