判斷字符串是否相似-最小編輯距離優(yōu)化

有一個需求剩蟀,在一堆的字符串中罚勾,找出所有相似的字符串對刹帕。其中數(shù)據(jù)有這樣的特點:大部分差異很大渊涝,一些字符串相等,另一些有個別字符不一樣抛计。后找到了一個算法:最小編輯算法哄孤。原理就不說了,需要的去百度一下吹截。

當(dāng)然瘦陈,這個Edit distance算法的效率還是可以的,O(n^2)波俄,但我其實只需要判斷是否相似(最終代價小于某個值minV)晨逝,而不是差異有多大,因此想到優(yōu)化方案:如果當(dāng)前dp過程中懦铺,發(fā)現(xiàn)到終點的必經(jīng)之路的代價最小值大于minV捉貌,則判斷不相似,直接返回false冬念。因此趁窃,需要找到必經(jīng)之路,和計算最小值急前。

在經(jīng)典的ED算法中醒陆,結(jié)構(gòu)很簡單,一個嵌套的循環(huán)和一個狀態(tài)轉(zhuǎn)移方程裆针。

```java

for(int i=0;i<len1;i++)

for(int j=0;j<len2;j++)

a[i][j]=min(a[i-1][j]+1,a[i][j-1]+1,a[i-1][j-1]+(s1[i]==s2[j]?0:1));

```

大致下圖的順序


以獲得最終代碼為目標(biāo)统求,這樣差不多效率到了極致了。

但我不需要這么詳細(xì)的結(jié)果据块。

回到之前的需要:必經(jīng)之路和最小代價


顯然,要到達(dá)紅色位置折剃,必然經(jīng)過一個或多個黑色位置另假。

那么如果紅色的代價至少不小于黑色代價的最小值怕犁。這不是顯然的嘛...

當(dāng)然边篮,我們不能到終點了才判斷,那就沒意義了奏甫。往前擴展戈轿,可以得到下圖


但是,這里黑色區(qū)域的最小代價是0阵子,而已傳統(tǒng)的ED算法思杯,至少得算minV行才可能得到大于minV的代價。于是乎,修改一下遍歷順序:


這樣色乾,能很快得到第一個大于minV的必經(jīng)之路最小代價誊册。


需要計算兩行的最小代價(黃線)如果這些最小代價均大于minV,則最終代價一定大于minV暖璧,判定為不相似案怯。

有同學(xué)要問了,只計算黃線區(qū)域澎办,萬一邊上的代價小于或等于minV呢嘲碱?


藍(lán)色minV,黃色minV+1局蚀,綠色minV+2

能看懂箭頭吧:藍(lán)色>=minV麦锯,否則邊上的黑色(黃線)就不能保證>=minV+1,與黃線最小值大于minV不符至会。

效率比較:

造數(shù)據(jù):生成500條隨機數(shù)據(jù)f(len,max)(執(zhí)行500*499/2次ED算法

len是隨機字符串長度离咐,max是每個字符的可能(或者說每個字符是1-minV中的一個)

如f(5,3)可能是31213

判斷相似的最小代價minV

附上我的測試結(jié)果:(在公司服務(wù)器上測的,所有每次結(jié)果都不一樣)

f(50,2) minV=5 標(biāo)準(zhǔn)ED耗時 2.7s 優(yōu)化ED耗時1.2s 相似對 0

f(50,2) minV=10?標(biāo)準(zhǔn)ED耗時 2.1s 優(yōu)化ED耗時2.5s 相似對 112

f(50,10) minV=10 標(biāo)準(zhǔn)ED耗時 2.3s 優(yōu)化ED耗時0.6s 相似對 0

f(50,10) minV=10?標(biāo)準(zhǔn)ED耗時 2.1s 優(yōu)化ED耗時0.9s 相似對 0

f(50,10)?minV=50 標(biāo)準(zhǔn)ED耗時 2.1s 優(yōu)化ED耗時3.1s 相似對 124750

結(jié)果符合預(yù)期:如果minV太大奉件,優(yōu)化ED更耗時宵蛀,因為運行效率的系數(shù)更大(似乎差距不算太大)

在數(shù)據(jù)差異很大,并且minV遠(yuǎn)小于len時县貌,效率有極大改善术陶。

不錯,很符合我的需求煤痕。bingo

(代碼在公司服務(wù)器上梧宫,沒法復(fù)制出來,就不貼出來了)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摆碉,一起剝皮案震驚了整個濱河市塘匣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巷帝,老刑警劉巖忌卤,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異楞泼,居然都是意外死亡驰徊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門堕阔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棍厂,“玉大人,你說我怎么就攤上這事超陆∥” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長例驹。 經(jīng)常有香客問我捐韩,道長,這世上最難降的妖魔是什么鹃锈? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任荤胁,我火速辦了婚禮,結(jié)果婚禮上屎债,老公的妹妹穿的比我還像新娘仅政。我一直安慰自己,他們只是感情好盆驹,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布圆丹。 她就那樣靜靜地躺著,像睡著了一般躯喇。 火紅的嫁衣襯著肌膚如雪辫封。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天廉丽,我揣著相機與錄音倦微,去河邊找鬼。 笑死正压,一個胖子當(dāng)著我的面吹牛欣福,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焦履,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼拓劝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘉裤?” 一聲冷哼從身側(cè)響起郑临,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屑宠,沒想到半個月后牧抵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡侨把,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妹孙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秋柄。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蠢正,靈堂內(nèi)的尸體忽然破棺而出骇笔,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布笨触,位于F島的核電站懦傍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芦劣。R本人自食惡果不足惜粗俱,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望虚吟。 院中可真熱鬧寸认,春花似錦、人聲如沸串慰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邦鲫。三九已至灸叼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庆捺,已是汗流浹背古今。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疼燥,地道東北人沧卢。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像醉者,于是被迫代替她去往敵國和親但狭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容