青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

c++初學(xué)者

專注技術(shù)開發(fā)

[轉(zhuǎn)]字符串匹配算法(二)窮舉與自動機

窮舉法又叫暴力法。大多數(shù)程序員眼里,它是幼稚的,但大師們不這么認(rèn)為。

Rob Pike, 最偉大的C 語言大師之一, 在《Notes on C Programming》中闡述了一個原則:花哨的算法比簡單算法更容易出bug、更難實現(xiàn),盡量使用簡單的算法配合簡單的數(shù)據(jù)結(jié)構(gòu)。而Ken Thompson——Unix 最初版本的設(shè)計者和實現(xiàn)者,禪宗偈語般地對Pike 的這一原則作了強調(diào): 拿不準(zhǔn)就窮舉(When in doubt , use brute force)。 而對于裝13愛好者來說,更是自豪的稱其使用的是BF算法。

窮舉法用在字符串匹配上,簡單的描述就是,檢查文本從0到n-m的每一個位置,看看從這個位置開始是否與模式匹配。這種方法還是有一些優(yōu)點的,如:不需要預(yù)處理過程,需要的額外空間為常數(shù),每一趟比較時可以以任意順序進(jìn)行。

盡管它的時間復(fù)雜度為O(mn),例如在文本"aaaaaaaaaaaaaaaaaaaaaaaaaaa"中尋找"aaaaab"時,就完全體現(xiàn)出來了。但是算法的期望值卻是2n,這表明該算法在實際應(yīng)用中效率不低。

C代碼如下:
  1. void BF(char *x, int m, char *y, int n) {
  2.    int i, j;
  3.    /* Searching */
  4.    for (j = 0; j <= n - m; ++j) {
  5.       for (i = 0; i < m && x[i] == y[i + j]; ++i);
  6.       if (i >= m)
  7.          OUTPUT(j);
  8.    }
  9. }
  10.   
如果我們注意到C庫函數(shù)是匯編優(yōu)化過的,并通常能提供比C代碼更高的性能的話,我們可以用memcmp來完成每一趟比較過程,從而達(dá)到更好的性能:
  1. #define EOS '\0'
  2.    
  3. void BF(char *x, int m, char *y, int n) { 
  4.   char *yb; 
  5.   /* Searching */ 
  6.   for (yb = y; *y != EOS; ++y) 
  7.     if (memcmp(x, y, m) == 0) 
  8.       OUTPUT(y - yb);
  9. }
自動機的方法其實和窮舉法有點相似,都是用最簡單直白的方式來做事情。區(qū)別在于窮舉法是在計算,而自動機則是查表。盡管自動機的構(gòu)造過程有一點點難解,要涉及到DFA的理論,但是自動機的比較過程那絕對是簡單到無語。

簡單說來,根據(jù)模式串,畫好了一張大的表格,表格m+1行σ列,這里σ表示字母表的大小。表格每一行表示一種狀態(tài),狀態(tài)數(shù)比模式長度多1。一開始的狀態(tài)是0,也就是處在表格的第0行,這一行的每個元素指示了當(dāng)遇到某字符時就跳轉(zhuǎn)到另一個狀態(tài)。每當(dāng)跳轉(zhuǎn)到最終狀態(tài)時,表示找到了一個匹配。

語言表述起來還是比較啰嗦,看代碼就知道了:
  1. #define ASIZE 256
  2. int preAut(const char *x, int m, int* aut) {
  3.         int i, state, target, old;
  4.         for (state = 0, i = 0; i < m; ++i) {
  5.                 target = i + 1;
  6.                 old = aut[state * ASIZE + x[i]];
  7.                 aut[state * ASIZE + x[i]] = target;
  8.                 memcpy(aut + target * ASIZE, aut + old * ASIZE, ASIZE*sizeof(int));
  9.                 state = target;
  10.         }
  11.         return state;
  12. }
  13. void AUT(const char *x, int m, const char *y, int n) {
  14.         int j, state;
  15.         /* Preprocessing */
  16.         int *aut = (int*)calloc((m+1)*ASIZE, sizeof(int));
  17.         int Terminal = preAut(x, m, aut);
  18.         /* Searching */
  19.         for (state = 0, j = 0; j < n; ++j) {
  20.                 state = aut[state*ASIZE+y[j]];
  21.                 if (state == Terminal)
  22.                         OUTPUT(j - m + 1);
  23.         }
  24. }
注:原文的代碼使用一個有向圖的數(shù)據(jù)結(jié)構(gòu),我遵循大師的指引,改用了更簡單一點的數(shù)組

從代碼上我們很容易看出,自動機的構(gòu)造需要時間是O(mσ),空間也是O(mσ)(嚴(yán)格來說這份代碼使用了O((m+1)σ)),但是一旦構(gòu)造完畢,接下來匹配的時間則是O(n)。

匹配的過程前面已經(jīng)說了,太簡單了沒什么好說的,這里就解釋一下構(gòu)造過程吧!

我們構(gòu)造的目標(biāo)是對應(yīng)模式長度,構(gòu)造出同樣多的狀態(tài),用0表示初始狀態(tài),然后第一個字符用狀態(tài)1表示,第二個用狀態(tài)2表示,依次類推,直到最后一個字符,用m表示,也是最終狀態(tài)。

一開始,數(shù)組全都置0,,這個時候的自動機遇到任何字符都轉(zhuǎn)到初始狀態(tài)。然后給它看模式的第一個字符,假設(shè)這是'a'吧,告訴它,狀態(tài)0遇到'a'應(yīng)該到一個新的狀態(tài)——狀態(tài)1,所以把第0行的第'a'列修改為1。而這個時候狀態(tài)1還是空白的,怎么辦呢?

這時候狀態(tài)0就想呀,在我被告知遇到'a'要去狀態(tài)1之前,我原本遇到'a'都要去狀態(tài)0的,也就是修改之前第'a'列所指的那個狀態(tài),稱為old狀態(tài)吧;而現(xiàn)在我遇到'a'卻要去一個新的狀態(tài),既然以前old狀態(tài)能處理遇到'a'之后的事情,那么我讓新的狀態(tài)像old狀態(tài)一樣就好了。于是狀態(tài)0把old狀態(tài)拷貝到狀態(tài)1。

現(xiàn)在輪到狀態(tài)1了,給它看第二個字符,它也如法炮制,指向了狀態(tài)2,又把old狀態(tài)拷貝給了狀態(tài)2。

于是,狀態(tài)機就在這種代代傳承的過程中構(gòu)造完畢了。

雖然理論上自動機是最完美的匹配方式,但是由于預(yù)處理的消耗過大,實踐中,主要還是用于正則表達(dá)式。

結(jié)語:窮舉法與自動機各自走了兩個極端,因此都沒能達(dá)到綜合性能的最佳,本文之后介紹的算法,可以看成是在窮舉和自動機兩者之間取舍權(quán)衡的結(jié)果。

posted on 2008-11-11 13:07 大海 閱讀(1293) 評論(1)  編輯 收藏 引用 所屬分類: 圖像算法C++

評論

# re: [轉(zhuǎn)]字符串匹配算法(二)窮舉與自動機[未登錄] 2008-11-12 13:02 908971

學(xué)習(xí)了  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久躁日日躁aaaaxxxx| 久久久久国产精品一区二区| 免播放器亚洲| 久久久亚洲成人| 在线免费观看日韩欧美| 欧美刺激性大交免费视频| 欧美肥婆在线| 亚洲一区免费| 欧美一区二区三区日韩| 伊人精品成人久久综合软件| 亚洲大片在线| 欧美日韩亚洲激情| 欧美在线日韩精品| 久久精品国产一区二区三| 在线看片欧美| 99国产精品自拍| 激情久久久久久久| 亚洲国产影院| 国产日韩欧美亚洲| 欧美二区不卡| 国产精品亚洲成人| 亚洲东热激情| 国产日韩欧美精品一区| 欧美激情女人20p| 国产精品日韩在线| 欧美不卡高清| 欧美调教vk| 欧美va亚洲va国产综合| 欧美日韩国产一区精品一区| 欧美在现视频| 欧美日韩亚洲高清| 美国十次了思思久久精品导航| 欧美日韩国产色综合一二三四 | 亚洲国产精品va在看黑人| 亚洲日本精品国产第一区| 国产日韩欧美一区二区三区在线观看 | 国产精品美女久久久浪潮软件| 另类图片国产| 国产精品夜夜夜| 亚洲全黄一级网站| 韩日在线一区| 亚洲综合电影| 99riav1国产精品视频| 欧美一区二区精品在线| 在线中文字幕不卡| 鲁鲁狠狠狠7777一区二区| 欧美一区二区视频97| 欧美日韩一二三区| 亚洲福利视频一区| 在线观看欧美日韩国产| 亚洲欧美日韩视频一区| 中文国产成人精品| 欧美激情精品久久久久久蜜臀 | 亚洲国产欧美在线| 黄色在线一区| 欧美中文字幕| 欧美在线电影| 国产精品日韩一区二区| 99在线|亚洲一区二区| 亚洲精品小视频| 裸体女人亚洲精品一区| 久久婷婷久久| 狠狠入ady亚洲精品| 午夜精品视频在线观看一区二区| 亚洲欧美视频一区| 欧美亚洲第一页| 99视频有精品| 亚洲欧美日韩国产一区| 国产精品草莓在线免费观看| 亚洲人线精品午夜| 亚洲午夜小视频| 国产精品swag| 午夜精品一区二区三区在线| 久久riav二区三区| 一区三区视频| 欧美成人一区二区三区在线观看 | 亚洲欧美不卡| 国产精品外国| 久久国产免费| 亚洲第一区色| 亚洲图片欧美日产| 国产色婷婷国产综合在线理论片a| 午夜视频一区在线观看| 久久久久一区二区三区| 亚洲电影在线看| 欧美激情精品久久久久久变态 | 欧美xart系列在线观看| 亚洲人成人一区二区三区| 欧美激情一区二区三区成人| 亚洲精品日本| 欧美一区视频| 亚洲欧洲精品一区二区三区不卡 | 亚洲高清免费视频| 欧美国产日本| 亚洲一二三区视频在线观看| 久久精品卡一| 日韩亚洲视频在线| 国产色视频一区| 奶水喷射视频一区| 亚洲欧美美女| 欧美不卡视频一区| 亚洲欧美久久| 亚洲国产精品一区二区久| 欧美视频在线观看 亚洲欧| 欧美亚洲一级片| 亚洲国产欧美国产综合一区| 欧美在线播放| 99视频精品全国免费| 国产午夜精品全部视频播放| 欧美精品一区二区精品网| 欧美一区二区视频在线观看2020| 亚洲国产成人一区| 久久精品色图| 亚洲男人第一网站| 亚洲欧洲日产国产网站| 国产一区二区三区精品久久久| 欧美阿v一级看视频| 亚洲欧美久久久| 亚洲欧洲精品天堂一级| 久久综合一区二区三区| 亚洲性视频h| 亚洲精品国产拍免费91在线| 国产在线欧美| 国产精品欧美一区二区三区奶水 | 中文亚洲视频在线| 亚洲国产另类精品专区| 久久久国际精品| 亚洲永久网站| av成人天堂| 亚洲毛片一区| 亚洲精品1234| 亚洲夫妻自拍| 一区在线播放| 雨宫琴音一区二区在线| 国产欧美一区二区三区国产幕精品| 欧美日产在线观看| 欧美成人首页| 欧美极品在线视频| 欧美国产日韩视频| 欧美韩国在线| 欧美高清hd18日本| 欧美高清视频一区| 欧美精品在线观看一区二区| 你懂的一区二区| 欧美成人资源网| 欧美高清在线一区二区| 欧美精品不卡| 欧美精品自拍| 欧美国产丝袜视频| 欧美日韩三级| 国产精品久久久久久久久久尿 | 欧美三级日韩三级国产三级 | 亚洲欧美日韩成人| 新67194成人永久网站| 性亚洲最疯狂xxxx高清| 久久国产日韩| 久久综合色8888| 欧美二区在线| 欧美午夜精品理论片a级大开眼界| 欧美午夜一区二区福利视频| 国产精品美女在线| 国语自产偷拍精品视频偷 | 国产伦精品免费视频| 国产午夜精品全部视频在线播放| 国内久久精品视频| 91久久精品日日躁夜夜躁欧美 | 国产一区二区三区久久久| 韩国精品主播一区二区在线观看| 亚洲大黄网站| 在线亚洲国产精品网站| 欧美影院久久久| 欧美成人小视频| 日韩一级片网址| 久久国产免费| 欧美日韩精品免费观看| 国产亚洲精品久久久久动| 亚洲成人资源| 亚洲欧美日韩系列| 免费看亚洲片| 在线中文字幕日韩| 久久久久久久一区二区三区| 欧美日韩亚洲91| 一区二区在线看| 在线视频亚洲| 麻豆精品在线观看| 一本色道久久综合| 老司机精品导航| 国产精品久久网| 亚洲精品日韩一| 久久精品91| 99一区二区| 美女精品在线| 国产欧美一区二区精品忘忧草| 亚洲国产精品一区在线观看不卡| 亚洲免费在线视频| 91久久国产综合久久91精品网站| 欧美一区二区精品| 国产精品另类一区| 中国成人亚色综合网站| 欧美大片一区二区|