首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 Boyer-Moore 字串匹配算法完整實現

     編輯:關於C語言

算法原理

Boyer-Moore 從模式串右端開始比對,利用壞字元規則與好後綴規則實現大幅跳躍,平均 O(n/m)、最壞 O(nm)。

核心預處理

壞字元位移表 badShift[256]

void buildBadShift(const char *pat, int m, int badShift[]) {
    for (int c=0; c<256; c++) badShift[c] = m;
    for (int i=0; i

好後綴位移表 goodShift[m]

void buildGoodShift(const char *pat, int m, int goodShift[]) {
    int *suffix = malloc(m * sizeof(int));
    // 計算 suffix[i] = 模式串 i 位置開始的最長後綴長度
    suffix[m-1] = m;
    for (int i=m-2; i>=0; i--) {
        int j = i;
        while (j >= 0 && pat[j] == pat[m-1 - (i-j)]) j--;
        suffix[i] = i - j;
    }
    // 填表
    for (int i=0; i=0; i--) {
        if (suffix[i] == i+1) { // 前綴也是後綴
            for (; j < m-1-i; j++)
                if (goodShift[j] == m) goodShift[j] = m-1-i;
        }
    }
    for (int i=0; i

搜尋主流程

int bmSearch(const char *text, int n, const char *pat, int m) {
    int badShift[256], goodShift[m];
    buildBadShift(pat, m, badShift);
    buildGoodShift(pat, m, goodShift);

    int i = 0;
    while (i <= n - m) {
        int j = m - 1;
        while (j >= 0 && text[i+j] == pat[j]) j--;
        if (j < 0) return i; // 找到
        int bc = badShift[(unsigned char)text[i+j]];
        int gs = goodShift[j];
        i += (bc > gs) ? bc : gs; // 取最大位移
    }
    return -1;
}

完整可編譯範例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// ... 上述函數 ...

int main() {
    const char *text = "HERE IS A SIMPLE EXAMPLE";
    const char *pat  = "EXAMPLE";
    int pos = bmSearch(text, strlen(text), pat, strlen(pat));
    if (pos >= 0) printf("Found at %d\n", pos);
    else printf("Not found\n");
    return 0;
}

關鍵點

  • 壞字元表大小 256 (ASCII),Unicode 需改用雜湊表。
  • 好後綴表計算較複雜,核心是 suffix 陣列與前綴/後綴匹配邏輯。
  • 搜尋時取 max(bc, gs) 保證不漏配對。
  • 實際工程中,strstr (兩路演算法) 或 memmem 常比手寫 BM 更快,因庫實現高度優化且利用 SIMD。

複雜度

  • 預處理:O(m + σ) (σ=字元集大小)。
  • 搜尋:最好 O(n/m),最壞 O(nm) (如 text=aaaaa..., pat=aaab),實際英文文本極快。

Boyer-Moore 是字串匹配算法教科書經典,理解其雙規則跳躍機制,對掌握 KMP、Sunday、Rabin-Karp 等進階算法大有裨益。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved