启发自 more programming pearls 2
有限状态自动机(FSM)是计算的一种优雅的数学模型和有用的实践工具,它在程序设计语言的语法分析,通信协议以及简单的硬件设备等许多应用领域都有广泛的用途。
例子:抑制比特流中的所有新出现的1:
input:011010111
output:001000011
紧跟在0后面的1变成0,输入流中的其他比特流位不改变。
自动状态机:
对应的两状态自动机在其状态中对最后一个输入比特进行编码:liz 表示 last input zero ,lio表示 last input one
指向liz的横向箭头表示这是初始状态。从liz到lio的弧线表示,如果自动机当前处于liz且输入是一个1,则输出一个0并进入到状态里欧。
数据结构:
执行fsm程序需要两个数据结构:
如果fsm包含弧线:
则下列等式成立
trans[state1,insym] == state2
out[state1,insym] == outsym
trans 表示状态转换,out表示输出符号。
则我们可得到trans,out后即可进行自动机的运转。
程序例子:
<script type="text/javascript">
/*
input:011010111
output:001000011
*/
var Fsm = function(transMap){
this.initTrans(transMap);
};
/*
载入有限状态机
*/
Fsm.prototype.initTrans = function(transMap){
//当前状态,当前值 => 下一个值
this.out={};
//当前状态,当前值 => 下一个状态
this.trans={};
for(var i=0,l=transMap.length;i<l;i++) {
var tranMap=transMap[i];
//trick
this.trans[tranMap['from']]=this.trans[tranMap['from']]||{};
this.out[tranMap['from']]=this.out[tranMap['from']]||{};
this.trans[tranMap['from']][tranMap['fromValue']]=tranMap['to'];
this.out[tranMap['from']][tranMap['fromValue']]=tranMap['toValue'];
}
};
/*
根据已有有限状态机和已有序列得出结果序列
*/
Fsm.prototype.run = function(params){
var currentState=params.start;
var sequence=params.sequence;
var result=[];
for(var i=0,l=sequence.length;i<l;i++) {
var currentValue=sequence[i];
result.push(this.out[currentState][currentValue]);
currentState=this.trans[currentState][currentValue];
if(!currentState){alert("transMap 出错了 !");return[]}
}
return result;
};
(function main() {
var metaState=[
//当前状态为 from,当前值为 fromValue
//转换后状态为 to,值为 toValue
{
from:'liz',
fromValue:0,
to:'liz',
toValue:0
},
{
from:'liz',
fromValue:1,
to:'lio',
toValue:0
},
{
from:'lio',
fromValue:0,
to:'liz',
toValue:0
},
{
from:'lio',
fromValue:1,
to:'lio',
toValue:1
}
];
var fsm=new Fsm(metaState);
var result=fsm.run({
start:'liz',
sequence:[0,1,1,0,1,0,1,1,1]
});
alert(result);
})();
</script>
- 大小: 25.9 KB
- 大小: 12 KB
分享到:
相关推荐
本文将深入探讨标题"1_javascript_"所提及的主题——如何用JavaScript实现NFA(非确定性有限状态自动机)并转换为SFA(确定性有限状态自动机)。我们将详细解释这两个概念,并结合描述中的“java implementation”来...
有限确定自动机...通过这个JavaScript实现的DFA,你可以深入理解自动机的工作机制,同时也能学习如何在实际编程中运用理论概念。此外,这个项目对于教学和学习编译原理、正则表达式匹配等主题也非常有价值。
实现有限状态机的 JavaScript 库 您可以轻松定义状态和事件,例如 STATE = { S1 : "State 1", S2 : "State 2" }; EVENT = { E1 : "Event 1", E2 : "Event 2" }; 然后通过声明初始状态(又名入口点)来实例化一...
首先,我们要知道在软件开发中,“自动机”通常指的是形式语言理论中的自动机模型,如有限状态自动机(Finite State Machine, FSM)、确定性有限自动机(Deterministic Finite Automaton, DFA)、非确定性有限自动机...
正则表达式的概念源自理论计算机科学,特别是自动机理论,其中主要包括确定有限状态自动机(DFA)和非确定有限状态自动机(NFA)。 在《Regular Expression Matching Can Be Simple And Fast》这篇文章中,作者讨论...
**状态转换机制**通常指的是DFA(确定有限状态自动机)或NFA(非确定有限状态自动机)。在词法分析中,这些自动机通过匹配输入字符序列,从一个状态转换到另一个状态,直到遇到一个完整的词汇元素并产生一个标记。在...
**JavaScript实现** 在JavaScript中实现元胞自动机,开发者可以利用其动态、跨平台的特性,构建出交互性强的Web应用程序。在这个案例中,`CellAuto`项目利用了JQuery和HTML5的Canvas API来创建可视化界面。JQuery是...
随后,Kleene对其进行了形式化和改进,证明了正则表达式和有限状态自动机(finite automata)可以描述相同的语言。Kleene的贡献对理论计算科学产生了深远影响,尤其是在描述和分析简单的语言模式方面。 Ken ...
这就是DFA(Deterministic Finite Automaton,确定有限状态自动机)算法发挥作用的地方。DFA算法是一种高效的文字匹配方式,尤其适用于敏感词过滤。它通过构建一个有限状态机,将敏感词库转换为状态转移图,从而快速...
1. **状态集**:每个单元格可以取的有限状态集合。 2. **邻域**:定义每个单元格与其相邻的单元格数量和方式。 3. **规则**:根据当前时刻的邻域状态,确定下一个时刻单元格的新状态。 4. **迭代**:通过不断应用...
同时,为了保证实时性,可能还涉及到了高效的算法实现,比如DFA(确定有限状态自动机)的构造算法,如Aho-Corasick算法或者KMP算法的变种。 在"suffix-automaton-vis-master"这个压缩包中,我们可以期待找到项目的...
描述中提到的“基于细胞自动机的侧滚轮(javascript)”表明这个项目是使用JavaScript编程语言实现的。JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,尤其适用于客户端的交互式内容。在这个项目中,...
在CVCA中,每个元胞都具有一个连续的数值状态,而不是像传统离散元胞自动机那样仅有有限的离散状态。这种连续性使得CVCA在模拟物理现象、生物过程或抽象的计算问题时具有更高的表现力和精确度。 CVCA的核心概念在于...
该项目定义了使用 JavaScript 对象表示法 (JSON) 表示单级有限状态机 (FSM) 的语义,作为图形生成、FSM 执行分析和其他语言状态机生成的中间语言。 动机是嵌入式代码的很大一部分(阅读:全部)是某种有限自动机,...
MiniSmall是一个独特的Node.js框架,它采用了有限自动机(Finite State Machine, FSM)的设计理念,以实现高效、轻量级的Web应用开发。在深入理解MiniSmall之前,我们先来了解一些基础概念。 **有限自动机(FSM)**...
NFA(非确定性有限状态自动机)和DFA(确定性有限状态自动机)是两种模型,用于匹配和处理字符串。本主题主要围绕如何将一个NFA转换为等价的DFA。 NFA(非确定性有限状态自动机)允许在某个状态下存在多个可能的...
在这个项目中,JavaScript不仅用于处理用户输入,还可能用于实现元胞自动机的演算逻辑,即在每个时间步更新所有单元格的状态。这涉及到数组操作、循环和条件语句等基本编程概念。 项目文件名...
JavaScript实现细胞自动机: 1. 数据结构:使用JavaScript数组表示细胞自动机的格子,数组的每个元素代表一个单元格及其状态。 2. 更新逻辑:编写JavaScript函数来实现特定的细胞自动机规则。规则通常用一个数字编码...