1. 程式人生 > >對於DFA、NFA理解

對於DFA、NFA理解

最近在做深度包檢測課題時,需要學一些新的演算法:
DFA、NFA,對這兩個演算法進行一下小的總結:

有窮狀態自動機

一聽這個名字感覺很高大上,很陌生,不知道是什麼意思,但是可以分開來理解。有窮,也就是說這個東西是有窮盡的,不是無限多的。狀態自動機(自動機):軟體工程的統一建模語言(UML)有狀態圖,數字邏輯中也有狀態轉移圖。不過這些各種各樣的圖在本質上都跟狀態機沒有什麼區別。總體的意思就是在有限個輸入的情況下,在這些狀態中轉移並期望最終達到終止狀態。有窮狀態自動機根據確定性可以分為“確定有窮狀態自動機”(DFA - Deterministic finite automaton)和“非確定有窮自動機”(NFA - Non-deterministic finite automaton)。

DFA

確定性有窮狀態自動機:在輸入一個狀態時,只得到一個固定的狀態。但往往從正則表示式翻譯過來的狀態機是ε-NFA,我們需要從ε-NFA通過消除ε邊來轉變成NFA或者DFA。關於轉換在這篇文章裡有提到
例如:
這裡寫圖片描述
當輸入一個任何一個可以的字元時,都得到一個固定的狀態。

NFA

這個裡面還有一個小的分支ε-NFA。ε-NFA:我們用ε邊來表示一個狀態可以不讀入字元就跳轉到另一個狀態 上,ε-NFA就是在NFA中存在這種邊的情況,例如:
這裡寫圖片描述
從start狀態到end狀態,可以不需要讀入字元就進行轉換。
NFA:“非確定有窮自動機”(NFA - Non-deterministic finite automaton),當輸入一個字元或者條件得到一個狀態機的集合。
例如:
這裡寫圖片描述


當輸入b後可能得到兩種狀態,構成一個狀態集。

相關推薦

對於DFANFA理解

最近在做深度包檢測課題時,需要學一些新的演算法: DFA、NFA,對這兩個演算法進行一下小的總結: 有窮狀態自動機 一聽這個名字感覺很高大上,很陌生,不知道是什麼意思,但是可以分開來理解。有窮,也就是說這個東西是有窮盡的,不是無限多的。狀態自動機(自動

DFANFA理解以及它們之間的區別

一個程式要轉換成詞法分析器,詞法分析器的任務就是將字元流轉換成詞法記號流,轉換的核心在於有窮自動機的表示方法,有窮自動機與狀態轉換圖有點相似,但它不是圖,而是一個識別器,它對每個輸入的字元做識別和判斷,以確定其能到達的最終狀態或狀態集和路徑,有窮自動機分為兩類,

序列的++=extendappend理解

value stdin iter AC xtend IT mos lin iterable 列表 + 元組: 1 >>> a = [1, 2] 2 >>> b = (3, 4) 3 >>> a = a + b 4 Tr

個人對於python3繼承的理解

理解 sed class lse 但是 繼承 python3 個人 this #繼承,這樣理解就對了,你的就是我的,但是我的還是我的,但是你有我也有的,我就不稀罕你的,所以調用了父類的時候,self就是我,而不是你class you: def __init__(se

java中對於多態的理解

運行 之間 () sta java eof 唱歌 bsp 如果 面向對象: 類:具體的對象抽象而來,可以抽象的表示一類具有相同特征和行為的對象 對象:是由類的實例化而來,對象是類的一個實例 java中關於多態的理解 打個比方 父親person有行為這

鑑於崔慶才大大的對於 beautifulsoup 的再理解

源地址看 soups = BeautifulSoup(html) soup = BeautifulSoup(open('index.html'))   print soup.prettify()   Tag通俗點講就是 HTML 中的一個個標籤 pri

CNN:對於卷積的理解

學習深度學習看到卷積這個operation,為了理解它查了一些資料,有幸看到一個大佬的總結,再加上一些自己的想法,做一個總結。 一、卷積的定義 內涵: 在泛函分析中,卷積、旋積或摺積(英語:Convolution)是通過兩個函式f 和g 生成第三個函式的一種數學運算元,表徵函式f 與

對於遞迴的理解

有很多時候我們可能會遇到使用遞迴的問題來解決問題,其中我感覺遞迴最重要的是把大的問題一步步地進行分解成小的問題 所以首先要對問題進行分割,其中可能涉及到了一些分割問題的技巧 其次,分割成小問題之後我們要確定遞迴的方法中的引數,有多少個變數在變化,需要傳進方法中引數有多少,遞迴呼叫的時候引數該

防止過擬合dropout理解

轉自:https://blog.csdn.net/stdcoutzyx/article/details/49022443、https://blog.csdn.net/leo_xu06/article/details/71320727 開篇明義,dropout是指在深度學習網路的訓練過程中,對於神

GBGBDTXGboost理解

 GBDT和xgboost在競賽和工業界使用都非常頻繁,能有效的應用到分類、迴歸、排序問題,雖然使用起來不難,但是要能完整的理解還是有一點麻煩的。本文嘗試一步一步梳理GB、GBDT、xgboost,它們之間有非常緊密的聯絡,GBDT是以決策樹(CART)為基學習器的GB演算法,xgboost擴充套件和改進了G

談談對於資料庫事物的理解

總所周知的,資料庫有4個基本的特性,別人問道我,之前我也是可以做到脫口而出,不就是ACID嗎?這又什麼難度, (1)A:原子性(Atomicity) (2)C:一致性(Consistency) (3)I:隔離性(Isolation)

對於偏度的理解

偏度公式如下: 現在想解決如何從影象上解決為正為負的問題,如圖所示:? 個人理解:偏度中的偏是針對變數相對於中心點(期望值)距離的一種描述;如果厚尾的話,就說明有很多點距離中心點比較遠,如上圖中的負偏度如果不看厚尾,僅看靠近中心點的兩側,很顯然右側相對左側,更多的點集中在中心點附

指標的遞增和遞減(++--)理解成指標的平移

int i; double score[5] {98,87,65,43,76}; double * ptr_score; ptr_score = score; for(i=0;i<5;i++) {      cout<<*ptr

對於線性變換的理解

線性變換就相當於一個空間到另外一個空間的轉換,在數學建模時經常用到,T(x)這個x可以時一個空間中的座標,或者是基,或者是向量,線性變化就是將這些乘以一個矩陣,轉換到另外一個空間來表示,這個矩陣是線性變換的數學表示,不同的矩陣代表著不同的線性變換,當然線性變換在不同的的基下由不同的矩陣表示,不同基之間的轉換矩

描述光滑度中對於曲線曲面的C0C1C2和G0G1G2定義和區別

一、曲線 給定兩條曲線     1) fa(x) = a0 + a1*x + a2*x^2 + ...+an*x^n     2) fb(x) = b0 + b1*x + b2*x^2 + ...+bn*x^

對於介面卡模式的理解

介面卡模式概念介紹使用想法參考 概念 在設計模式中,介面卡模式(英語:adapter pattern)有時候也稱包裝樣式或者包裝(wrapper)。將一個類的介面轉接成使用者所期待的。一個適配使得因介面不相容而不能在一起工作的類能在一起工作,做法是將類自己的介

銀行家演算法(戰爭舉例便於理解)

1 銀行家演算法 作業系統的程序可以動態地申請資源,但系統在進行資源分配之前,應先計算此次資源分配的安全性。(若此次分配為安全的,作業系統則將資源分配給程序,否則令程序等待) 避免死鎖的實質在於:系統在進行資源分配時,如何使系統不進入不安全狀態。 1.1 舉例理

DL之Yolo系列:深度學習實現目標檢測之Yolo系列的論文簡介概念理解思路配圖等詳細攻略

DL之Yolo系列:深度學習實現目標檢測之Yolo系列的論文簡介、概念理解、思路配圖等詳細攻略     Yolo系列的論文簡介 1、Yolo V1簡介   2、Yolo V2簡介   3、Yolo V3簡介   &

基礎IO學習筆記(open等系統呼叫inode檔案理解)

一.系統呼叫介面open、close、write、read 1.open 引數解析: pathname:要開啟或要建立的目標檔案 flags:下面的一個或多個常量進行"或"運算 O_RDONLY

對於equals和==的理解

很多時候equals和==大家都分不太清楚怎麼樣來使用,今天小編就來教大家怎麼使用 equals比較的是兩個變數的值是否相等 而==則比較的是這個變數的記憶體地址是否相同 打個比方來說 String a = new String("a"); String b = new String ("a");