Việc triển khai Levenshtein trong C # và F #. Phiên bản C # nhanh hơn 10 lần cho hai chuỗi khoảng 1500 ký tự. C #: 69 ms, F # 867 ms. Tại sao? Theo như tôi có thể nói, họ làm điều tương tự chính xác? Không thành vấn đề nếu đó là Bản phát hành hoặc bản dựng Gỡ lỗi.
EDIT: Nếu bất cứ ai đến đây tìm kiếm cụ thể cho việc thực hiện Chỉnh sửa khoảng cách, nó sẽ bị hỏng. Mã làm việc là đây .
C # :
private static int min3(int a, int b, int c)
{
return Math.Min(Math.Min(a, b), c);
}
public static int EditDistance(string m, string n)
{
var d1 = new int[n.Length];
for (int x = 0; x < d1.Length; x++) d1[x] = x;
var d0 = new int[n.Length];
for(int i = 1; i < m.Length; i++)
{
d0[0] = i;
var ui = m[i];
for (int j = 1; j < n.Length; j++ )
{
d0[j] = 1 + min3(d1[j], d0[j - 1], d1[j - 1] + (ui == n[j] ? -1 : 0));
}
Array.Copy(d0, d1, d1.Length);
}
return d0[n.Length - 1];
}
F # :
let min3(a, b, c) = min a (min b c)
let levenshtein (m:string) (n:string) =
let d1 = Array.init n.Length id
let d0 = Array.create n.Length 0
for i=1 to m.Length-1 do
d0.[0] <- i
let ui = m.[i]
for j=1 to n.Length-1 do
d0.[j] <- 1 + min3(d1.[j], d0.[j-1], d1.[j-1] + if ui = n.[j] then -1 else 0)
Array.blit d0 0 d1 0 n.Length
d0.[n.Length-1]