資料結構 模式匹配演算法

2021-06-28 03:32:34 字數 1463 閱讀 1640

模式匹配:子串的定位操作。

模式匹配演算法主要有:

(1)樸素的模式匹配演算法;

(2)kmp模式匹配演算法   (next陣列);

(3)改進的kmp模式匹配演算法    (nextval陣列);

比較:1,時間複雜度:樸素的模式匹配演算法為o((n-m+1)*m),效率很差,kmp演算法為o(m+n),大大避免重複遍歷情況。

2,改進的kmp演算法相對於kmp演算法避免了特殊情況下的的多餘判斷。

**:

#include "string.h"

#include "stdio.h"

#include "stdlib.h"

#include "io.h"

#include "math.h"

#include "time.h"

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxsize 100 /* 儲存空間初始分配量 */

typedef int status; /* status是函式的型別,其值是函式結果狀態**,如ok等 */

typedef int elemtype; /* elemtype型別根據實際情況而定,這裡假設為int */

typedef char string[maxsize+1]; /* 0號單元存放串的長度 */

/* 生成乙個其值等於chars的串t */

status strassign(string t, const char *chars)

}status clearstring(string s)

/* 輸出字串t。 */

void strprint(string t)

/* 輸出next陣列值。 */

void nextprint(int next,int length)

/* 返回串的元素個數 */

int strlength(string s)

/* 樸素的模式匹配法 */

int index(string s, string t, int pos)

else /* 指標後退重新開始匹配 */

} if (j > t[0])

return i-t[0];

else

return 0;

}/* 通過計算返回子串t的next陣列。 */

void get_next(string t, int *next)

/* 求模式串t的next函式修正值並存入陣列nextval */

void get_nextval(string t, int *nextval)

int main()

結果:

資料結構 模式匹配kmp演算法

暴力演算法 暴力演算法 intindex sstring s,sstring t,int pos else if j t 0 return i t 0 else return0 kmp演算法 next陣列的求法 例子 abaabcac 模式串的下標從1開始 第一位固定為0 第二位固定為1 從第三位 ...

資料結構 模式匹配 KMP演算法

模式匹配 在主串中找到與模式串相同的子串,並返回其位置 在討論kmp時,先來看看樸素模式匹配有什麼問題。樸素模式匹配的思路是把主串中與模式串長度相同的所有子串搞出來,挨個與模式串對比,有乙個字元不匹配時,立即放棄當前子串,轉而索引下乙個子串。在最壞的情況中,主串指標向前走m步,回退m 1步 前m 1...

資料結構 匹配演算法

演算法實現 kmp kmp真是學到現在為止最頭疼的乙個演算法,嗯我是渣渣 分兩部分 一 子串的next陣列 二 迴圈遍歷。next陣列的意義是 第n項之前的若干項與第1到第next n 1項完全一樣 前驅相同 因此next陣列的尋找方式使用遞迴的想法 對於當前位置i,有開頭的最大子串長度為n 對i ...