Sunday演算法c語言版實現

2021-06-25 19:39:59 字數 2510 閱讀 9900

一、bf演算法

bf演算法是普通的模式匹配演算法,其基本思想就是將目標串的第乙個字元與模式串的第乙個字元進行匹配。若相等,則繼續比較第二個字元;若不相等,則比較目標串的第二個字元和模式串的第乙個字元。依次比較下去,直到得出最後的匹配結果。

示例**:

static int bf(

const char *src,

const char *des)if(

(i - pos)

== len_d)

return pos;

}return -1;}

二、sunday演算法

sunday演算法是daniel m.sunday於2023年提出的一種比bm演算法搜尋速度更快的演算法。其核心思想是:在匹配過程中,模式串並不被要求一定要按從左向右進行比較還是從右向左進行比較,它在發現不匹配時,演算法能跳過盡可能多的字元以進行下一步的匹配,從而提高了匹配效率。

sunday演算法思想跟bm演算法很相似,在

匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如果該字元沒有在匹配串中出現則直接跳過,即移動步長= 匹配串長度+1;否則,同bm演算法一樣,即移動步長=匹配串中最右端的該字元到末尾的距離+1。

例如我們要在"substring searching"查詢"search",剛開始時,把子串與文字左邊對齊: s

u bs t

r in g

s e a

r c

h i

n g

s e

a r

c h

結果在第二個字元處發現不匹配,於是要把子串往後移動。但是該移動多少呢?這就是各種演算法各顯神通的地方了,最簡單的做法是移動乙個字元位置;kmp是利用已經匹配部分的資訊來移動;bm演算法是做反向比較,並根據已經匹配的部分來確定移動量。這裡要介紹的方法是看緊跟在當前子串之後的那個字元(上圖中的'i')。

顯然,不管移動多少,這個字元是肯定要參加下一步的比較的,也就是說,如果下一步匹配到了,這個字元必須在子串內。所以,可以移動子串,使子串中的最右邊的這個字元與它對齊。現在子串'search'中並不存在'i',則說明可以直接跳過一大片,從'i'之後的那個字元開始作下一步的比較,如下圖: s

u bs t

r in g

s e a

r c

h i

n g

se a

r ch

比較的結果,第乙個字元就不匹配,再看子串後面的那個字元是'r',它在子串中出現在倒數第三位,於是把子串向前移動三位,使兩個'r'對齊,如下: s

u bs t

r in g

s e a

r c

h i

n g

s e a

r c

h

這次匹配成功了!回顧整個過程,我們只移動了兩次子串就找到了匹配位置。可以證明:用這個演算法,每一步的移動量都比bm演算法要大,所以肯定比bm演算法更快。

以上sunday演算法文字描述摘自 這裡。

**實現:

#include

#include

#include<

string

.h>

#include

#define letter_max_len 256

#define maxline 1024

static int sunday(

const char *src,

const char *des);if

(src =

=null

|| des =

=null

)return -1;

len_s = strlen(src)

;len_d = strlen(des)

;for

(i = 0; i < letter_max_len; i++)

alphabet[i]

= len_d;

for(i = 0; i < len_d; i++)

alphabet[des[i]

]= len_d - i - 1;

for(pos = 1; pos <

= len_s - len_d;)if

((i - pos + 1)

== len_d)

return pos;

else

pos +

= alphabet[src[pos + len_d - 1]

]+ 1;

}return -1;

}int main(

int argc, char *

*argv)

;int linesnum;

fp = fopen(argv[1]

,"r");

if(fp =

=null

)while

((fgets(line, maxline, fp))!

=null

)fclose(fp)

;fp =

null

;return 0;}

C語言版約瑟夫問題演算法實現

有n個人圍坐一圈程式設計客棧,現從第s個人開始報數,數到m的人出列,接著從出列的下乙個人開始重新報數,數到m的人又出列.如此下去,直到所有人都出列為止.試設計確定他們出列次序序列的程式 1 確定儲存結構 n個人圍成一圈,故使用迴圈單鏈表來儲存序號 2 演算法實現 該問題共n m s三個未知量,所以可...

C語言版 農曆演算法

這個只是基本的農曆演算法,另外的節日查詢啊,可以自己做的。到 找乙個萬年曆,改寫成c語言的就可以了。char getdayof systemtime pst const char cdizhi const char cshuxiang const char cdayname const char c...

C語言版 農曆演算法

這個只是基本的農曆演算法,另外的節日查詢啊,可以自己做的。到 找乙個萬年曆,改寫成c語言的就可以了。char getdayof systemtime pst const char cdizhi const char cshuxiang const char cdayname const char c...