日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅析 Sunday 算法

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅析 Sunday 算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


背景


Sunday 算法是 Daniel M.Sunday 于 1990 年提出的字符串模式匹配。


其效率在匹配隨機的字符串時比其他匹配算法還要更快。Sunday 算法的實現可比 KMP,BM 的實現容易太多。


算法過程


假定主串為 "HERE IS A SIMPLE EXAMPLE",模式串為 "EXAMPLE"。


(1)



從頭部開始比較,發現不匹配。則 Sunday 算法要求如下:找到主串中位于模式串后面的第一個字符,即紅色箭頭所指的 “空格”,再在模式串中從后往前找“空格”,沒有找到,則直接把模式串移到“空格” 的后面。


(2)



(3)



找到匹配。


完整代碼


/**

*

* author : 劉毅(Limer)

* date?? : 2017-07-30

* mode?? : C++

*/

?

#include?<iostream>

#include?<string>

?

#define?MAX_CHAR?256

#define?MAX_LENGTH?1000

?

using?namespace?std;

?

void?GetNext(string?&?p,?int?&?m,?int?next[])

{

????for?(int?i?=?0;?i?<?MAX_CHAR;?i++)

????????next[i]?= -1;

????for?(int?i?=?0;?i?<?m;?i++)

????????next[p[i]]?=?i;

}

?

void?Sunday(string?&?s,?int?&?n,?string?&?p,?int?&?m)

{

????int?next[MAX_CHAR];

????GetNext(p,?m,?next);

?

????int?j;??// s 的下標

????int?k;??// p 的下標

????int?i?=?0;

????while?(i?<=?n?-?m)

????{

????????j?=?i;

????????k?=?0;

????????while?(j?<?n?&&?k?<?m?&&?s[j]?==?p[k])

????????????j++,?k++;

?

????????if?(k?==?m)

????????????cout?<<?"在"?<<?i?<<?" 處找到匹配\n";

?

????????if?(i?+?m?<?n)

????????????i?+=?(m?-?next[s[i?+?m]]);

????????else

????????????return;

????}

?

????// PS: 匹配失敗不作處理

}

?

int?main()

{

????string?s,?p;

????int?n,?m;

?

????while?(cin?>>?s?>>?p)

????{

????????n?=?s.size();

????????m?=?p.size();

????????Sunday(s,?n,?p,?m);

????????cout?<<?endl;

????}

?

????return?0;

}


數據測試如下圖:



來源:https://www.61mon.com/index.php/archives/213/


總結

以上是生活随笔為你收集整理的浅析 Sunday 算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。