parent
f78b140bf1
commit
ab87dbb8ee
@ -0,0 +1,11 @@ |
||||
package editdistance |
||||
|
||||
func min(nums ...int) int { |
||||
min := nums[0] |
||||
for _, v := range nums { |
||||
if v < min { |
||||
min = v |
||||
} |
||||
} |
||||
return min |
||||
} |
@ -0,0 +1,10 @@ |
||||
package editdistance |
||||
|
||||
import "testing" |
||||
|
||||
func TestMin(t *testing.T) { |
||||
mins := min(1, 2, 3, 4, 5) |
||||
if mins != 1 { |
||||
t.Errorf("Min was incorrect, got %d, want %d.", mins, 1) |
||||
} |
||||
} |
@ -0,0 +1,14 @@ |
||||
package editdistance |
||||
|
||||
func WagnerFisher(a, b string) int { |
||||
if len(a) == 0 { |
||||
return len(b) |
||||
} |
||||
if len(b) == 0 { |
||||
return len(a) |
||||
} |
||||
if a[0] == b[0] { |
||||
return WagnerFisher(a[1:], b[1:]) |
||||
} |
||||
return 1 + min(WagnerFisher(a[1:], b), WagnerFisher(a, b[1:]), WagnerFisher(a[1:], b[1:])) |
||||
} |
@ -0,0 +1,11 @@ |
||||
package editdistance |
||||
|
||||
import "testing" |
||||
|
||||
func TestWagnerFisher(t *testing.T) { |
||||
a := "abc" |
||||
b := "abd" |
||||
if WagnerFisher(a, b) != 1 { |
||||
t.Errorf("WagnerFisher was incorrect, got %d, want %d.", WagnerFisher(a, b), 1) |
||||
} |
||||
} |
@ -0,0 +1,45 @@ |
||||
package editdistance |
||||
|
||||
import ( |
||||
"strings" |
||||
) |
||||
|
||||
func Werner(a, b string) int { |
||||
|
||||
phrase_a := strings.Fields(a) |
||||
phrase_b := strings.Fields(b) |
||||
|
||||
m := len(phrase_a) + 1 |
||||
n := len(phrase_b) + 1 |
||||
distances := make([][]int, n) |
||||
for i := range distances { |
||||
distances[i] = make([]int, m) |
||||
} |
||||
// make the inital numbers on the top
|
||||
for i := 1; i < n; i++ { |
||||
distances[i][0] = i |
||||
} |
||||
// make the inital numbers on the left side
|
||||
for i := 1; i < m; i++ { |
||||
distances[0][i] = i |
||||
} |
||||
|
||||
for i := 1; i < n; i++ { |
||||
for j := 1; j < m; j++ { |
||||
subCost := 0 |
||||
if strings.EqualFold(phrase_a[j-1], phrase_b[i-1]) { |
||||
subCost = 0 |
||||
} else { |
||||
subCost = 1 |
||||
} |
||||
value := min( |
||||
distances[i-1][j]+1, |
||||
distances[i][j-1]+1, |
||||
distances[i-1][j-1]+subCost, |
||||
) |
||||
distances[i][j] = value |
||||
} |
||||
} |
||||
|
||||
return distances[n-1][m-1] |
||||
} |
@ -0,0 +1,20 @@ |
||||
package editdistance |
||||
|
||||
import "testing" |
||||
|
||||
func TestWerner(t *testing.T) { |
||||
|
||||
a := "a b c" |
||||
b := "a b d" |
||||
diff := Werner(a, b) |
||||
if diff != 1 { |
||||
t.Errorf("Werner was incorrect, got %d, want %d.", diff, 1) |
||||
} |
||||
|
||||
a = "Mary had a little lamb little lamb little lamb." |
||||
b = "Marry had a little lamb little lab little lamb." |
||||
diff = Werner(a, b) |
||||
if diff != 2 { |
||||
t.Errorf("Werner was incorrect, got %d, want %d.", diff, 2) |
||||
} |
||||
} |
Loading…
Reference in new issue