Ruby's shortest editing Distance Calculation Method
This article mainly introduces the shortest editing distance calculation method implemented by Ruby. This article provides the implementation code directly. If you need it, refer
The dynamic planning algorithm is used to calculate the shortest editing distance.
The Code is as follows:
# Encoding: UTF-8
# Author: xu jin
# Date: Nov 12,201 2
# EditDistance
# To find the minimum cost by using EditDistance algorithm
# Example output:
# "Please input a string :"
# Exponential
# "Please input the other string :"
# Polynomial
# "The expected cost is 6"
# The result is:
# ["E", "x", "p", "o", "n", "e", "n", "-", "t ", "I", "a", "l"]
# ["-", "-", "P", "o", "l", "y", "n", "o", "m ", "I", "a", "l"]
P "Please input a string :"
X = gets. chop. chars. map {| c}
P "Please input the other string :"
Y = gets. chop. chars. map {| c}
X. unshift ("")
Y. unshift ("")
E = Array. new (x. size) {Array. new (y. size )}
Flag = Array. new (x. size) {Array. new (y. size )}
DEL, INS, CHA, FIT = (1 .. 4). to_a # deleat, insert, change, and fit
Def edit_distance (x, y, e, flag)
(0. x. length-1). each {| I | e [I] [0] = I}
(0 .. y. length-1). each {| j | e [0] [j] = j}
Diff = Array. new (x. size) {Array. new (y. size )}
For I in (1. x. length-1) do
For j in (1 .. y. length-1) do
Diff [I] [j] = (x [I] = y [j])? 0: 1
E [I] [j] = [e [I-1] [j] + 1, e [I] [j-1] + 1, e [I-1] [j-1] + diff [I] [j]. min
If e [I] [j] = e [I-1] [j] + 1
Flag [I] [j] = DEL
Elsif e [I] [j] = e [I-1] [j-1] + 1
Flag [I] [j] = CHA
Elsif e [I] [j] = e [I] [j-1] + 1
Flag [I] [j] = INS
Else flag [I] [j] = FIT
End
End
End
End
Out_x, out_y = [], []
Def solution_structure (x, y, flag, I, j, out_x, out_y)
Case flag [I] [j]
When FIT
Out_x.unshift (x [I])
Out_y.unshift (y [j])
Solution_structure (x, y, flag, I-1, j-1, out_x, out_y)
When DEL
Out_x.unshift (x [I])
Out_y.unshift ('-')
Solution_structure (x, y, flag, I-1, j, out_x, out_y)
When INS
Out_x.unshift ('-')
Out_y.unshift (y [j])
Solution_structure (x, y, flag, I, j-1, out_x, out_y)
When CHA
Out_x.unshift (x [I])
Out_y.unshift (y [j])
Solution_structure (x, y, flag, I-1, j-1, out_x, out_y)
End
# If flag [I] [j] = nil, go here
Return if I = 0 & j = 0
If j = 0
Out_y.unshift ('-')
Out_x.unshift (x [I])
Solution_structure (x, y, flag, I-1, j, out_x, out_y)
Elsif I = 0
Out_x.unshift ('-')
Out_y.unshift (y [j])
Solution_structure (x, y, flag, I, j-1, out_x, out_y)
End
End
Edit_distance (x, y, e, flag)
P "The expected edit distance is # {e [x. length-1] [y. length-1]}"
Solution_structure (x, y, flag, x. length-1, y. length-1, out_x, out_y)
Puts "The result is: \ n # {out_x} \ n # {out_y }"