1

yop,

y'a des algos pour détecter façon plus efficace que la méthode naïve des blocs communs dans deux chaines ? (mais pas forcément dans le même ordre, ni bien sûr à la même position)
le but serait idéalement de détecter tous les blocs d'au moins N caractères qui existent dans les deux chaines, mais si j'en loupe qquns c'est pas gravissime (c'est pê grâce à ça qu'il est possible d'améliorer qqchose, je pensais segmenter les chaines en petits blocs et essayer de repérer des blocs qui ont une plus forte probabilité d'être semblables, ms j'ai rien codé pr le moment, et il existe peut-être déjà des solutions intelligentes pour ce genre de problème)

mci happy
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

Je pense qu'on peut adapter l'algorithme de comparaison de chaines bruitées.

Soient deux chaines A et B.

On associe des pénalités:
D(A[i]) = poids de disparition d'un élément A[i]
P(B[j]) = poids d'apparition d'un élément B[j]
S(a,b) = poids de substitution de a par b


donc la distance entre deux chaines sera:
(X et Y sont des séquences de caractere, a et b sont des caracteres, e le caractere vide)
d(aX,bY) = min (S(a,b) + d(X,Y),       // c'est soit la substitution de a et b
                D(a) + d(X,bY),       // .. soit disparition de a dans X
                P(b) + d(aX,Y))       // .. soit l'apparition de b dans Y

d(aX,e) = D(a) + d(X,e)
d(e,bY) = P(b) + d(e,Y)
d(e,e) = 0


ce qui donne en une sorte de Ada:
distance(A[1..n], B[1..m],i,j){
    if (j==m+1){
        if(i==n+1){
            return 0;
        }
        return D(A[i]) + distance (A,B,i+1,j);
    } else {
        if (i==n+1){
            return P(B[j]) + distance (A,B,i,j+1);
        }
        return min (S(A[i],B[j]) + distance(A,B,i+1,j+1),
                    D(A[i]) + distance(A,B,i+1,j),
                    P(B[j]) + distance(A,B,i,j+1));
    }
}


avec la programmation dynamique tu peux arriver à quelque chose de polynomial.

Ca c'est l'algo de base.
Maintenant, tu veux qu'il soit possible de trouver une permutation des lettres dans la chaine.
Donc à mon avis, il faut associer une distance du genre
d(aX,Ya) = ...
mais il va sans doute interferer avec d(aX,bY)..
donc il faudra prendre le min des deux. dis = min( d(aX,Ya) , d(aX,bY) )

Je ne garantis pas que ca marche, mais c'est la premiere idée qui me vient à l'esprit.
Je pense que si ca marche, tu tombera toujours sur un truc polynomial.
Tout ce qui passe pas par le port 80, c'est de la triche.

3

Ton algo fonctionne, mais ça ne détecte pas les permutations. Le problème c'est qu'il peut s'agir de deux blocs identiques de 10 caractères, dans une chaine qui en ferait 10000, et qui serait au tout début de la 1ere mais à la fin de la seconde; ton algo ne fait qu' "avancer" dans la chaine, et ne pourrait pas donc trouver 2 blocs communs aux deux chaines, qui soient l'un avant l'autre dans la 1ere chaine, et dans l'ordre inverse dans la 2eme. Bien sûr c'est cette partie qui risque de défoncer les perfs de l'algo, le reste étant traitable avec quelque chose proche de ta méthode de façon finalement assez rapide (à condition de fixer des poids égaux pour toutes les pénalités) smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

a priori la solution la plus simple serait de prendre tous les blocs de N caractères du premier fichier, mettre tout ça dans une hash table, et ensuite parcourir le 2è fichier pour voir les blocs de N caractères qui sont déjà dans la hash table ^^ (temps O(N*(n1+n2)log(n1)), espace O(N*n1))

mais si ce que tu veux c'est plutôt découper tes fichiers en un faible nombre de gros blocs identiques (de taille très supérieure à N si possible), c'est un peu différent : dans ce cas-là il vaut mieux utiliser un arbre des suffixes...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

5

ok je vais regarder de ce coté là, mci ^^ (!google arbre suffixes)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

Algorithme de Rabin-Karp
http://www.eecs.harvard.edu/~ellard/Q-97/HTML/root/node43.html

O(m x n) pour un N donné.

7

Ton algo fonctionne, mais ça ne détecte pas les permutations.

meme avec ca:
Donc à mon avis, il faut associer une distance du genre
d(aX,Ya) = ...

??
Tout ce qui passe pas par le port 80, c'est de la triche.

8

à ce moment-là si, mais implémente-le, et compare la complexité avec celle de l'algo naïf ^^

Spectras > il manque pas des images sur ta page ? ("Imagine that we want to compute ." trifus)

avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

onur> ben tu peux effectivement faire un truc qui marche avec de la programmation dynamique (avec tout simplement la distance d(X,Y) = plus long suffixe commun), mais ça prend un temps O(n1*n2) donc c'est assez lent ^^ (menfin c'est vrai que ça a l'avantage d'être simple à implémenter et de permettre "gratuitement" de détecter des blocs de taille >N smile)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

bob > c'est sans doute dû à un convertisseur html foireux, mais l'url m'a laissé supposer qu'il existait une version non convertie ^^
http://www.eecs.harvard.edu/~ellard/Q-97/PS/sq1997-c8.ps
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

11

erf bah du coup je préferais la version html parceque ça je peux pas le lire du tout :/

[edit] c'est bon j'avais encore miktex installé, j'en ai fait un pdf
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

12

avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

13

mci grin
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

14

enfin de toute façon c'est juste une amélioration du premier paragraphe de ./4 quand la fonction de hash est telle que h(xb)=f(a,b,h(ax)), et c'est même pas clair que ça soit vraiment une amélioration parce que tu as de grosses pénalités en cas de collision du hash ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

15

va falloir que je surveille la taille de ma chaine par contre, parceque la table de hash que tu te tapes elle doit être relativement violente du coup :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

16

Pour la recherche dans les chaînes, il y a également Knuth-Morris-Pratt, ou mieux, Bayer-Moore (ou Boyer-Moore, je ne sais plus).
Mais je ne suis pas sûr que ce soit super adapté à ton problème...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

17

C'est Boyer-Moore la bonne orhtographe smile [/post_utile]
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

18

Mais je ne suis pas sûr que ce soit super adapté à ton problème...
Absolument pas, en effet cheeky