wagner-fisher & werner algorithms working
This commit is contained in:
		
							parent
							
								
									f78b140bf1
								
							
						
					
					
						commit
						ab87dbb8ee
					
				
							
								
								
									
										11
									
								
								helpers.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								helpers.go
									
									
									
									
									
										Normal file
									
								
							@ -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
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										10
									
								
								helpers_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								helpers_test.go
									
									
									
									
									
										Normal file
									
								
							@ -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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								wagner-fisher.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								wagner-fisher.go
									
									
									
									
									
										Normal file
									
								
							@ -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:]))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								wagner-fisher_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								wagner-fisher_test.go
									
									
									
									
									
										Normal file
									
								
							@ -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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								werner.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								werner.go
									
									
									
									
									
										Normal file
									
								
							@ -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]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								werner_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								werner_test.go
									
									
									
									
									
										Normal file
									
								
							@ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user