1Fermer3
onurLe 13/10/2006 à 03:30
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.