計算字串的相似度(VB2005) 思索之二

2021-05-04 14:40:07 字數 3259 閱讀 2148

在完成「計算字串的相似度(

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 程式設計相同的字串 ...