一種字串搜尋方法

2022-08-27 20:24:10 字數 1434 閱讀 8786

在閱讀開源**過程中發現一種字串搜尋方法,仔細分析之後終於搞懂其原理了。雖然不知道這種搜尋方法學術上叫什麼名字,但是對其構造跳轉表,跳躍搜尋的方式很感興趣,所以記錄下來分享一下。

先看大致的**:

#define maxchar 256

/* * key: 搜尋關鍵字

* shift_table: 跳轉表陣列指標

*/void ready(string key, unsigned int *shift_table)

//構造跳轉表

for(s = 0; s < k_length; ++s)}/*

* key: 搜尋關鍵字

* src: 搜尋的源字串

* n: 搜尋長度

* 返回值: 關鍵字在源字串中的開始位置

*/int find(string key, string src, int n)

if( j == -1)

++s;

if (s > n)

s += shift_table[src[s]];

}}

其中最有意思的是

//構造跳轉表

for(s = 0; s < k_length; ++s)

s += shift_table[src[s]];
這兩部分分別是構造跳轉表,和根據跳轉表跳轉到查詢匹配位置。

跳轉表陣列相當於字典,下標是每個ascii碼的int值,下標對應的值是此字元在關鍵字中到最後乙個字元的距離。比如key為「hello!」,則關鍵字字元對應的跳轉表為

shift_table[72] = 5

shift_table[69] = 4

shift_table[76] = 2 //76字元是'l'。兩個'l',後面的會把前面的覆蓋

shift_table[79] = 1

shift_table[33] = 0

在字元查詢失敗時,根據跳轉表可以跳轉到合適的位置重新查詢,避免了逐個字元迴圈查詢的過程,提高了效率。

為什說是"合適"的位置呢?

比如說源字串「sxei0hello!08uix」,關鍵字「hello!」,先從源字串「sxei0h」處從後往前匹配,匹配不成功後,選擇下個位置繼續從後往前的匹配過程。最笨的匹配演算法肯定是往後逐個增加字元重複匹配過程,但是很多是不必要的。「sxei0h」匹配當然是不成功的,探測下個字元『e』。'e'在關鍵字中也在存在,到最後乙個字元距離是4,也就是說,如果此處的『e』跟關鍵字中的『e』能匹配上(包括位置),那麼後面的四個字元也應該能匹配的上,那麼就可以根據跳轉表直接跳到『e』後的第四個字元開始從後往前匹配。如果『e』後第四個字元匹配不上,那麼中間四個(包括『e』字元)字元匹配上了也沒意義,這樣就直接跳過中間四個無意義的匹配過程。這就是為什麼說跳轉表指明了每個字元"合適"的跳轉位置。

一種字串搜尋方法

在閱讀開源 過程中發現一種字串搜尋方法,仔細分析之後終於搞懂其原理了。雖然不知道這種搜尋方法學術上叫什麼名字,但是對其構造跳轉表,跳躍搜尋的方式很感興趣,所以記錄下來分享一下。先看大致的 define maxchar 256 key 搜尋關鍵字 shift table 跳轉表陣列指標 void re...

自己寫的一種字串搜尋

在longstr中迴圈查詢shortstr元素 舉例如shortstr m位.longstr,n位.首先在longstr中匹配shortstr的第乙個字元。匹配後,從longstr中匹配點後一位開始匹配shortstr的第二個字元,迴圈直至匹配到shortstr的最後一位字元,判斷longstr中匹...

一種替換字串的思路

網路程式設計經常存在替換字串中指定字元為另一種字元,如將字串中的空格字元替換為 20 例子 一種思路 乙個空格字元替換成 20 多了兩個字元的位置,所以先遍歷一遍字串,找出字串中存在的空字元個數n,然後使用n 2加上原來的字元長度即為新的字元長度,之後定義兩個游標p1,p2,p1指向原字串的最後乙個...