Skip to content

Commit

Permalink
feat(search): move levenshteinDistanceSearch to service
Browse files Browse the repository at this point in the history
  • Loading branch information
schnogz committed Dec 24, 2021
1 parent 6e0ec30 commit cc9e789
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,60 +6,10 @@ import { REQUEST_ACCOUNTS_SELECTOR } from 'data/coins/model/request'
import { getCoinAccounts } from 'data/coins/selectors'
import { CoinAccountSelectorType } from 'data/coins/types'
import { SwapAccountType, SwapBaseCounterTypes } from 'data/components/swap/types'
import { levenshteinDistanceSearch } from 'services/search'

import { REQUEST_FORM } from '../model'

// https://stackoverflow.com/a/11958496
const levDist = (s: string, t: string): number => {
const d: Array<Array<number>> = [] // 2d matrix

// Step 1
const n = s.length
const m = t.length

if (n === 0) return m
if (m === 0) return n

// Create an array of arrays in javascript (a descending loop is quicker)
for (let i = n; i >= 0; i -= 1) d[i] = []

// Step 2
for (let i = n; i >= 0; i -= 1) d[i][0] = i
for (let j = m; j >= 0; j -= 1) d[0][j] = j

// Step 3
for (let i = 1; i <= n; i += 1) {
const s_i = s.charAt(i - 1)

// Step 4
for (let j = 1; j <= m; j += 1) {
// Check the jagged ld total so far
if (i === j && d[i][j] > 4) return n

const t_j = t.charAt(j - 1)
const cost = s_i === t_j ? 0 : 1 // Step 5

// Calculate the minimum
let mi = d[i - 1][j] + 1
const b = d[i][j - 1] + 1
const c = d[i - 1][j - 1] + cost

if (b < mi) mi = b
if (c < mi) mi = c

d[i][j] = mi // Step 6

// Damerau transposition
if (i > 1 && j > 1 && s_i === t.charAt(j - 2) && s.charAt(i - 2) === t_j) {
d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost)
}
}
}

// Step 7
return d[n][m]
}

export const getData = createDeepEqualSelector(
[
(state, ownProps) =>
Expand Down Expand Up @@ -107,8 +57,8 @@ export const getData = createDeepEqualSelector(
}

return (
levDist(window.coins[acc1.coin].coinfig.name, lowerSearch) -
levDist(window.coins[acc2.coin].coinfig.name, lowerSearch)
levenshteinDistanceSearch(window.coins[acc1.coin].coinfig.name, lowerSearch) -
levenshteinDistanceSearch(window.coins[acc2.coin].coinfig.name, lowerSearch)
)
})

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// https://stackoverflow.com/a/11958496
const levenshteinDistanceSearch = (s: string, t: string): number => {
const d: Array<Array<number>> = [] // 2d matrix

// Step 1
const n = s.length
const m = t.length

if (n === 0) return m
if (m === 0) return n

// Create an array of arrays in javascript (a descending loop is quicker)
for (let i = n; i >= 0; i -= 1) d[i] = []

// Step 2
for (let i = n; i >= 0; i -= 1) d[i][0] = i
for (let j = m; j >= 0; j -= 1) d[0][j] = j

// Step 3
for (let i = 1; i <= n; i += 1) {
const s_i = s.charAt(i - 1)

// Step 4
for (let j = 1; j <= m; j += 1) {
// Check the jagged ld total so far
if (i === j && d[i][j] > 4) return n

const t_j = t.charAt(j - 1)
const cost = s_i === t_j ? 0 : 1 // Step 5

// Calculate the minimum
let mi = d[i - 1][j] + 1
const b = d[i][j - 1] + 1
const c = d[i - 1][j - 1] + cost

if (b < mi) mi = b
if (c < mi) mi = c

d[i][j] = mi // Step 6

// Damerau transposition
if (i > 1 && j > 1 && s_i === t.charAt(j - 2) && s.charAt(i - 2) === t_j) {
d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + cost)
}
}
}

// Step 7
return d[n][m]
}

export { levenshteinDistanceSearch }

0 comments on commit cc9e789

Please sign in to comment.