確定有限狀態自動機簡介
有限狀態自動機擁有有限數量的狀態,每個狀態可以遷移到零個或多個狀態,輸入字串決定執行哪個狀態的遷移。
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);
}