C語言 確定有限狀態自動機 DFA

確定有限狀態自動機簡介

有限狀態自動機擁有有限數量的狀態,每個狀態可以遷移到零個或多個狀態,輸入字串決定執行哪個狀態的遷移。

DFA是理解KMP算法的基礎。
關於什麼是DFA,可參考鏈接:有窮自動機DFA&NFA

本篇的主要目的是實現DFA。

實現過程

下面是一個字符串ABABAC的DFA:
這裏寫圖片描述

構建DFA過程
這裏寫圖片描述

實現分析

一. 首先DFA有什麼意義呢?它表示了什麼?

  • 字符串A, 它的DFA是這樣的:
    這裏寫圖片描述
    如果輸入字符串A, 那麼DFA輸出 1,
    如果輸入字符串B, 那麼DFA輸出 0,
    如果輸入字符串C, 那麼DFA輸出 0

  • 字符串AB, 它的DFA是:
    這裏寫圖片描述
    如果輸入字符串AA, 那麼DFA輸出 1,
    如果輸入字符串AB, 那麼DFA輸出 2,
    如果輸入字符串AC, 那麼DFA輸出 0

同理更長的字符串對應輸出不同的值,如果字符串完全匹配的話,那麼DFA就會輸出匹配字符串的大小。

二. 如果字符串不完全匹配怎麼確定輸出的值?
可以發現規律是複製dfa[][X]到第dfa[][j]中,X的值的確定:
這裏寫圖片描述
這裏寫圖片描述

代碼實現

#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include <string.h>

#define LENGTH 6
#define WORDLENGTH 6
#define CHARLENGTH 256

void dfa(char *a) {
    int dfa[LENGTH][CHARLENGTH];

    for (int i = 0; i < LENGTH; i++) {
        for (int j = 0; j < CHARLENGTH; j++) {
            dfa[i][j] = 0;
        }
    }
    dfa[0][a[0]] = 1;

    for (int X = 0, i = 1; i < LENGTH; i++) {
        for (int j = 0; j < CHARLENGTH; j++) {
            dfa[i][j] = dfa[X][j];  //複製X
        }
        dfa[i][a[i]] = i + 1;
        X = dfa[X][a[i]];
    }
}

void main() {
    char *a = "ababac";
    dfa(a);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章