Salut chers Developpeurs,
Je suis entrain d'ecrire un Levenshtein distance en Ada, En fait le levenshtein normal fonctionne mais pour les lignes de produits je voudrais ne pas tenir compte du coût de suppression. et pour cela j'ai voulu transformer le code c++ suivant en Ada :
Et voila mon essai de tranformation en Ada a la seule difference que le coût de suppression est egal a 0:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 #include <iostream> #include <string> using std::cout; using std::cin; using std::endl; int Min(const int a, const int b) { int Minimum = a; if( Minimum > b ) Minimum = b; return Minimum; } unsigned int edit_distance( const std::string& s1, const std::string& s2 ) { const unsigned int cost_del = 0; const unsigned int cost_ins = 1; const unsigned int cost_sub = 1; unsigned int n1 = s1.length(); unsigned int n2 = s2.length(); unsigned int* p = new unsigned int[n2+1]; unsigned int* q = new unsigned int[n2+1]; unsigned int* r; p[0] = 0; for( unsigned int j = 1; j <= n2; ++j ) p[j] = p[j-1] + cost_ins; for( unsigned int i = 1; i <= n1; ++i ) { q[0] = p[0] + cost_del; for( unsigned int j = 1; j <= n2; ++j ) { unsigned int d_del = p[j] + cost_del; unsigned int d_ins = q[j-1] + cost_ins; unsigned int d_sub = p[j-1] + ( s1[i-1] == s2[j-1] ? 0 : cost_sub ); q[j] = Min( Min( d_del, d_ins ), d_sub ); } r = p; p = q; q = r; } unsigned int tmp = p[n2]; delete[] p; delete[] q; return tmp; } int main() { char a[50]; char b[50]; cout<<"donner le 1. mot comparaitre\n"; cin>>a; cout<<"donner le 2. mot comparaitre\n"; cin>>b; cout<<"LD : "<< edit_distance(a, b) <<endl; return 0; }
Mais seuleument j'ai une faute de constraint Error au niveau de (Left(i-1) = Rigth(j-1)) et quand je commence plutot pas 2 a iterer ca fonctionne mais toujours une distance negative.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 with Ada.Text_IO; with Ada.Integer_Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Strings.Unbounded.Text_IO; use Ada.Strings.Unbounded.Text_IO; procedure Test is LeftS : Unbounded_String; RigthS : Unbounded_String; Result : Natural; function LD(Left, Rigth : in String) return Natural is cost_del : Natural := 0; cost_ins : Natural := 1; cost_sub : Natural := 1; type my_array is array(0 .. Rigth'Length+1) of Natural; p : my_array; q : my_array; r : my_array; tmp : Natural; d_del : Natural; d_ins : Natural; d_sub : Natural; begin p(0) := 0; for j in 1 .. Rigth'Length loop p(j) := p(j-1) + cost_ins; end loop; for i in 1 .. Left'Length loop q(0) := p(0) + cost_del; for j in 1 .. Rigth'Length loop d_del := p(j) + cost_del; d_ins := q(j-1) + cost_ins; if (Left(i-1) = Rigth(j-1)) then --Constraint Error faute ici d_sub := p(j-1) + 0; else d_sub := p(j-1) + cost_sub; end if; end loop; r := p; p := q; q := r; end loop; tmp := p(Rigth'Length); return tmp; end LD; function "+" (U_S : in Ada.Strings.Unbounded.Unbounded_String) return String renames Ada.Strings.Unbounded.To_String; function "+" (S : in String) return Ada.Strings.Unbounded.Unbounded_String renames Ada.Strings.Unbounded.To_unbounded_String; begin Ada.Text_IO.Put("Geben Sie bitte 1 Strind ein: "); LeftS := Ada.Strings.Unbounded.Text_IO.Get_Line; Ada.Text_IO.Put("Geben Sie bitte 2 Strind ein: "); RigthS := Ada.Strings.Unbounded.Text_IO.Get_Line; declare test : String := +LeftS; test2 : String := +RigthS; begin Result := LD(test, test2); Ada.Text_IO.Put_Line ("Levenshtein " & Natural'Image(Result)); end; end Test;
Quelqu'un pourrait m'aider et me donner un coup de main. Merci deja pour tout.
Partager