在完成「計算字串的相似度(
vb2005
)——思索之一」之後,照例對程式進行了一番測試。第一次找了兩個相似的字串,長度分別為15和
17。速度和結果都比較滿意。這也印證了演算法的正確性。第二次找了兩個相似的字串,長度分別為
1500
和1507
。嗯,直接跳出錯誤,說是堆疊錯誤。實際上是由於遞迴巢狀出了問題。採用遞迴演算法,只是理論上有效,便於理解,實際應用中會出現各種限制。如本例,巢狀約
1000
層的時候就超過了系統的限制。必須想乙個解決之道。
仔細觀察,可以發現用數學性的語言描述就是f(
n,m)
=g(f(
n,m),
f(n+1,m),
f(n,
m+1))
這個可以簡化為遞推,由於遞推可以放在乙個函式內,就解決了系統的遞迴限制。**賦予其後。用的是
vb2005
public class
clscalculatestringdistanceex
implements idistance
private mstringa as string
private mstringb as string
private missame as boolean
private mdic as dictionary(of string, integer)
private function calculatestringdistance(byval startlower as integer) as integer
dim la as integer = mstringa.length
dim lb as integer = mstringb.length
dim i as integer, j as integer
dim t1 as integer, t2 as integer, t3 as integer
addtodic(la + 1, lb + 1, 0)
for i = la to startlower step -1
addtodic(i, lb + 1, la - i + 1)
next
for i = lb to startlower step -1
addtodic(la + 1, i, lb - i + 1)
next
for i = la to startlower step -1
for j = lb to startlower step -1
if mstringa.chars(i - 1) = mstringb.chars(j - 1) then
addtodic(i, j, getfromdic(i + 1, j + 1))
else
t1 = getfromdic(i + 1, j)
t2 = getfromdic(i, j + 1)
t3 = getfromdic(i + 1, j + 1)
addtodic(i, j, min(t1, t2, t3) + 1)
end if
next
next
return getfromdic(startlower, startlower)
end function
private sub addtodic(byval s1 as integer, byval s2 as integer, byval value as integer)
mdic.add(s1 & "," & s2, value)
end sub
private function getfromdic(byval s1 as integer, byval s2 as integer) as integer
return mdic(s1 & "," & s2)
end function
private function min(byval
paramarray m() as integer) as integer
dim i as integer, j as integer
j = m(0)
for i = 1 to m.getupperbound(0)
if m(i) < j then j = m(i)
next
return j
end function
public function calculatestringdistance() as integer _
implements idistance.calculatestringdistance
if mstringa.length = 0 then return mstringb.length
if mstringb.length = 0 then return mstringa.length
mdic = new dictionary(of string, integer)
missame = true
dim i as integer, j as integer
for i = 1 to min(mstringa.length, mstringb.length)
if mstringa.chars(i - 1) <> mstringb.chars(i - 1) then
missame = false
j = i
exit for
end if
next
if missame = false then
return calculatestringdistance(j)
else
return math.abs(mstringa.length - mstringb.length)
end if
end function
public readonly property diccount() as integer _
implements idistance.diccount
getreturn mdic.count
end get
end property
public sub setstring(byval s1 as string, byval s2 as string) _
implements idistance.setstring
mstringa = s1
mstringb = s2
end sub
end class
計算字串的相似度
程式設計之美223頁的題目。如果他們的第乙個字元相同,那麼計算接下來的字串的距離。如果他們的第乙個字元不同,那麼 1 刪除a的第乙個字元,計算a接下來的字串和b的距離 2 刪除b的第乙個字元,計算b接下來的字串和a的距離 3 修改a的第乙個字元為b的第乙個字元,計算a接下來的字串和b接下來的字串距離...
字串的相似度計算
一 基於編輯距離的字串相似度計算 兩個字串之間的相似度可以用編輯距離來定義。所謂編輯,指的是,對字串中的任一字元進行插入,刪除和替換這三種操作。經過一定步驟的編輯,乙個字串可以變換為另乙個字串,那麼最少的編輯步數稱為兩個字串的編輯距離。這是乙個遞迴或動態規劃的問題。比如長度分別為m,n的字串str1...
計算字串的相似度
程式設計之美 3.3節 計算字串的相似度 問題 對於給定的兩個字串,用最少的操作 插入 刪除和替換,使得兩個字串相同。找出這個最少需要操作的步數。解法 1 一步操作後,再將a 2 end 和b 2 end 程式設計相同的字串 2 一步操作後,再將a 1 end 和b 2 end 程式設計相同的字串 ...