一个android文本比对app的实现(四)--Hirschberg文本比对算法
本章所描述的是程序的核心,文本比對算法的實現,文本比對本質上就是字符串的比對,在兩個字符串中,找到他們的最長相同子串,例如:
S1 = abcdefg, ?S2 = afhctdog; 那么兩個字符串的最長相同子串就是:acdg. 在算法導論一書中,最長子串用LCS表示(longest common substring). 尋找lcs 是最為典型的動態規劃算法的運用,動態規劃也是各大技術公司最為常用的面試內容,我們先了解下,普通的動態規劃算法如何尋找lcs.
s1(n) = a1,a2,a3 .... an; s2(m) = b1, b2,b3....bm. (an, bm 分別是構成字符串的單個字母) 要想找到s1, s2 的lcs, 我們設想, 如果 an = bm, 那么s1, s2 的lcs 肯定包含 an, 或 bm.
也就是說: lcs(s1(n), s2(m)) = lcs(s1(n-1), s2(m-1)) + 1. s1 , s2 的最大共同子串相當于s1(n-1) = a1,a2....a(n-1), s2(m-1) = b1, b2, .... b(m-1) 的最大共同字串加上最后一個字符,即a(n), 或 b(m). ?如果最后一個字符不一樣,那怎辦呢,如果最后字符不同,那么我們先找出 s1(n-1), s2(m) 的最大共同子串 lcs1, 然后找出s1(n), s2(m-1) 的最大共同子串lcs2, lcs1 與 lcs2 中,長度最大的那個,就是我們要找的最大共同子串。動態規劃最顯著的特點是,要想解決總問題,我們先假設,如果次一級的子問題解決了,然后通過次一級子問題的結果,再加上一些簡單的操作,就能得到總問題的結果。以LCS 為例,要找到長度為n 和 m 的兩個字符串的最大共同子串,我們先找它的次一級字問題的解,即長度為 (n - 1, m - 1), (n - 1, m), ?(n, m - 1) 長度的最大共同子串,從這三個子問題的答案中,再做一點簡單操作,就可以得到原問題的解。
由于動態規劃問題需要用子問題的結果倒推父問題的結果,因此在解決過程中需要存儲子問題的結果,回到本問題,我們需要一個二維表lcs[m][n], lcs[i][j] 用于存儲S1(i), S2(j) 兩個字符串最大共同子串的長度,于是S1(i+1), S2(j+1) 可以輕易的計算出來,如果 a[i+1] == b[j+1] , 那么 lcs[i+1][j+1](也就是S1(i+1), S2(j+1) 兩個字符串的最大共同子串的長度) = lcs[i][j] + 1. 如果a[i+1] != b[j+1], 根據我們上面的推論, lcs[i+1][j+1] = max(lcs[i][j+1], lcs[i+1][j]); 由此可見,該算法的時間復雜度是 O(m * n), 空間復雜度是 O(m * n). 具體算法大家可參閱算法導論 動態規劃一節。?
如果要在手機上實現該算法,最致命的是算法對空間的需求,假定要比對的文本長度都是一萬字符,那么 O(m*n) 等于 一萬乘一萬,那就是一億字節,換算成M 就是96,也就是要吃掉手機大概96M的內存,這將大大影響手機系統的性能,因此直接將該算法做到APP里就不合適。
Hirschberg 算法的優勢就在于,它將空間復雜度由原來的O(m*n) 改進成 O(m) , ?它利用了分而治之的辦法:
要想找到S1(n), S2(m) 的最大共同子串,我先將S1(n) 平分成兩部分, S1(1...n/2), S1(n/2+1 ... n), 然后找到一點 t, 將 S2 分成兩部分S2(1...t), S2(t+1, ...m), 然后分別計算
S1(1....n/2), S2(1...t) 的lcs, S1(n/2 + 1, ...n), S2(t+1...m) 的lcs, 然后將兩個lcs 首尾連接,那么得到的結果就是所要找的最大共同子串。由于在該方法中,我們不需要二維表來存儲信息,因此該方法的復雜度由O(M*n) 改進為 O(m)
至于t 如何計算得到,大家可以查找Hirschberg的論文實現,csdn上有相關下載,該文章的名稱為 : A Linear space algorithm for computing maximal common substring. 我將算法實現在APP中,大家下載代碼看看,基本可以理解算法的實現。
總結
以上是生活随笔為你收集整理的一个android文本比对app的实现(四)--Hirschberg文本比对算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java归一化方法_Java之Norma
- 下一篇: java IDE 工具启动tomcat