資料結構與演算法系列 Sunday演算法詳解

2021-07-10 05:17:31 字數 2268 閱讀 1054

一:背景

sunday演算法是daniel m.sunday於2023年提出的字串模式匹配。其效率在匹配隨機的字串時比其他匹配演算法還要更快。sunday演算法的實現可比kmp,bm的實現容易太多。

二:分析
假設我們有如下字串:

a = "lessons tearned in software te";

b = "software";

sunday演算法的大致原理是:

先從左到右逐個字元比較,以我們的字串為例:

開始的時候,我們讓i = 0, 指向a的第乙個字元; j = 0 指向b的第乙個字元,分別為"l"和"s",不等;這個時候,sunday演算法要求,找到位於a字串中位於b字串後面的第乙個字元,即下圖中 m所指向的字元"t",在模式字串b中從後向前查詢是否存在"t",

可以看到下圖中k指向的字元與m指向的字元相等,

這時就將相等的字元對齊,讓j再次指向b字串的頭乙個字元,相應地,將i指向主串對應的字元n,

再次比較a[i]和b[j],不等,這時再次尋找主串中在模式串後面的那個字元,

我們看到,模式串的最後乙個字元與m指向的主串字元相等,因此再次移動子串,

這時,主串i對應的字元是s,j對應的子串字元也是s,i++, j++,

現在再次不等,m指向字元"d",

三:完整**
#define _crt_secure_no_deprecate   

#define _crt_secure_cpp_overload_standard_names 1

#include#includeusing namespace std;

int _next[256];

string dest;

string pattern;

/*因為i位置處的字元可能在pattern中多處出現(如下圖所示),而我們需要的是最右邊的位置,這樣就需要每次迴圈判斷了,非常麻煩,效能差。這裡有個小技巧,就是使用字元作為下標而不是位置數字作為下標。這樣只需要遍歷一遍即可,這貌似是空間換時間的做法,但如果是純8位字元也只需要256個空間大小,而且對於大模式,可能本身長度就超過了256,所以這樣做是值得的(這也是為什麼資料越大,bm/sunday演算法越高效的原因之一)。

返回目錄---->資料結構與演算法目錄

參考:

資源採集自:符串匹配演算法 – sunday演算法------->

字串搜尋演算法boyer-moore由淺入深(比kmp快3-5倍)----->

字串匹配的boyer-moore演算法------>

【模式匹配】之 —— sunday演算法------>

資料結構與演算法系列 字典樹

一 背景 什麼是字典樹?trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的...

資料結構與演算法系列19 堆

堆其實就是一種特殊的樹,那它特殊在 呢?只要滿足了以下兩點的,我們就可以稱之為堆。1.堆是乙個完全二叉樹 2.堆中每乙個節點的值都必須大於等於 或者小於等於 其子樹中每個節點的值。這裡稍作解釋,對於第一點,我們前面講過,完全二叉樹就是除了最後一層,其他層的節點個數都是滿的,最後一層的節點都靠左排列。...

資料結構與演算法系列 9 希爾排序演算法

希爾排序 shellsort 也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是基於插入排序的以下兩點性質而提出改進方法的 我們來看下希爾排序的基本步驟,在此我們選擇增量gap length 2,縮小增量繼續以gap gap 2的方式,這種增量選擇我們可以用乙個序列來表示,稱為增量...