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