【實習記】2014-08-29算法學習Boyer-Moore和最長公共子串(LCS)

 
 



昨天的問題
方案一:尋找hash函數,可行性極低。
方案二:載入內存,維護成一個守護進程的服務。難度比較大。
方案三:使用前5位來索引,由前3位增至前5位惟一性,理論上是分拆記錄擴大100倍,但能夠就地利用mysql,最易行。
方案四:使用方案三,但增長一個表以減小冗餘,但代價新開一個表,而且每次查詢都select join兩個表。




研究了 求最長公共子串問題,順便研究了字符串匹配

字符串匹配的Boyer-Moore算法
http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
字符串匹配的KMP算法
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

動態規劃算法之:最長公共子序列 & 最長公共子串(LCS)
http://my.oschina.net/leejun2005/blog/117167

最長公共子串

其實這是一個序貫決策問題,能夠用動態規劃來求解。咱們採用一個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧:"bab"和"caba"(固然咱們如今一眼就能夠看出來最長公共子串是"ba"或"ab")

   b  a  b

c  0  0  0

a  0  1  0

b  1  0  1

a  0  1  0

咱們看矩陣的斜對角線最長的那個就能找出最長公共子串。

不過在二維矩陣上找最長的由1組成的斜對角線也是件麻煩費時的事,下面改進:當要在矩陣是填1時讓它等於其左上角元素加1。

   b  a  b

c  0  0  0

a  0  1  0

b  1  0  2

a  0  2  0

這樣矩陣中的最大元素就是 最長公共子串的長度。

在構造這個二維矩陣的過程當中因爲得出矩陣的某一行後其上一行就沒用了,因此實際上在程序中能夠用一維數組來代替這個矩陣。



根據以上算法
使用C語言實踐了一下。html

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int comfix(const char* stra, const char* strb);
int main(void){
    const char
        *stra = "hello world",
        *strb = "malloc";
    printf("%s,%s: %d\n", stra, strb, comfix(stra, strb));
    return 0;
}

int comfix(const char* stra, const char* strb){
    /*
     * 變量第一字符
     * c:char*, l:len
     * 變量第二字符
     * s:small, l:large
     */
    const char
        *cs  = stra,
        *cl  = strb;
    int ret = 0,
        la  = strlen(stra),
        lb  = strlen(strb),
        ls  = la,
        ll  = lb;
    /* 若是不對,就調換唄 */
    if (lb<la)
        cs = strb, ls = lb, cl = stra, ll = la;
    /* 矩陣,只保存矩陣的一行便可動態之 */
    int *pint = (int*)malloc((ls+1)*4);
    memset(pint ,0 , (ls+1)*4);
    int i, j;
    for (i=0; i<ll; i++){
        /* 生成下一行,同時上一行內容被回收 */
       for (j=ls; j>ret; j--)
           if (cl[i]==cs[j])
               pint[j] = pint[j-1]+1;
       /* 若是有更大就更新ret */
       for (j=ls; j>ret; j--)
           if (pint[j]>ret)
               ret = pint[j];
    }
    return ret;
}

 




這種算法很是巧妙地化繁爲簡,有時換一個思路,就會擴然開朗!
比較喜歡這種鍛鍊。

mysql

相關文章
相關標籤/搜索