Skip to content

Commit 37da2e1

Browse files
authored
feat: reduce OSADamerau–Levenshtein space complexity from O(m*n) to O(3 * min(m,n)) (#17)
1 parent 5f65401 commit 37da2e1

1 file changed

Lines changed: 11 additions & 11 deletions

File tree

levenshtein.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,40 +65,40 @@ func OSADamerauLevenshteinDistance(str1, str2 string) int {
6565
return runeStr1len
6666
} else if utils.Equal(runeStr1, runeStr2) {
6767
return 0
68+
} else if runeStr1len < runeStr2len {
69+
return OSADamerauLevenshteinDistance(str2, str1)
6870
}
6971

7072
// 2D Array
71-
matrix := make([][]int, runeStr1len+1)
72-
for i := 0; i <= runeStr1len; i++ {
73+
row := utils.Min(runeStr1len+1, 3)
74+
matrix := make([][]int, row)
75+
for i := 0; i < row; i++ {
7376
matrix[i] = make([]int, runeStr2len+1)
74-
for j := 0; j <= runeStr2len; j++ {
75-
matrix[i][j] = 0
76-
}
77-
}
78-
79-
for i := 0; i <= runeStr1len; i++ {
8077
matrix[i][0] = i
8178
}
79+
8280
for j := 0; j <= runeStr2len; j++ {
8381
matrix[0][j] = j
8482
}
8583

8684
var count int
8785
for i := 1; i <= runeStr1len; i++ {
86+
matrix[i%3][0] = i
8887
for j := 1; j <= runeStr2len; j++ {
8988
if runeStr1[i-1] == runeStr2[j-1] {
9089
count = 0
9190
} else {
9291
count = 1
9392
}
9493

95-
matrix[i][j] = utils.Min(utils.Min(matrix[i-1][j]+1, matrix[i][j-1]+1), matrix[i-1][j-1]+count) // insertion, deletion, substitution
94+
matrix[i%3][j] = utils.Min(utils.Min(matrix[(i-1)%3][j]+1, matrix[i%3][j-1]+1),
95+
matrix[(i-1)%3][j-1]+count) // insertion, deletion, substitution
9696
if i > 1 && j > 1 && runeStr1[i-1] == runeStr2[j-2] && runeStr1[i-2] == runeStr2[j-1] {
97-
matrix[i][j] = utils.Min(matrix[i][j], matrix[i-2][j-2]+1) // translation
97+
matrix[i%3][j] = utils.Min(matrix[i%3][j], matrix[(i-2)%3][j-2]+1) // translation
9898
}
9999
}
100100
}
101-
return matrix[runeStr1len][runeStr2len]
101+
return matrix[runeStr1len%3][runeStr2len]
102102
}
103103

104104
// DamerauLevenshteinDistance calculate the distance between two string

0 commit comments

Comments
 (0)