`
yiminghe
  • 浏览: 1453318 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

有限状态自动机的javascript实现

阅读更多

 

 

启发自 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_

    本文将深入探讨标题"1_javascript_"所提及的主题——如何用JavaScript实现NFA(非确定性有限状态自动机)并转换为SFA(确定性有限状态自动机)。我们将详细解释这两个概念,并结合描述中的“java implementation”来...

    automata-dfa:有限确定自动机 (DFA) 的实现

    有限确定自动机...通过这个JavaScript实现的DFA,你可以深入理解自动机的工作机制,同时也能学习如何在实际编程中运用理论概念。此外,这个项目对于教学和学习编译原理、正则表达式匹配等主题也非常有价值。

    automa.js:实现有限状态机的 JavaScript 库

    实现有限状态机的 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》这篇文章中,作者讨论...

    哈工大编译原理实验node语言实现了基于状态转换机制的词法分析器及自顶而下分析的语法分析器.zip

    **状态转换机制**通常指的是DFA(确定有限状态自动机)或NFA(非确定有限状态自动机)。在词法分析中,这些自动机通过匹配输入字符序列,从一个状态转换到另一个状态,直到遇到一个完整的词汇元素并产生一个标记。在...

    一个基于下推自动机的Web测试自动执行器

    下推自动机是一种带有有限状态集和一个栈的计算模型,适用于处理嵌套结构的语言。在此基础上构建的测试执行器能够有效地执行测试用例序列,并与服务器交互,获取响应信息。 #### 测试自动机的工作原理 测试用例...

    CellAuto:Javascript中的元胞自动机

    **JavaScript实现** 在JavaScript中实现元胞自动机,开发者可以利用其动态、跨平台的特性,构建出交互性强的Web应用程序。在这个案例中,`CellAuto`项目利用了JQuery和HTML5的Canvas API来创建可视化界面。JQuery是...

    Implementing Regular Expressions.pdf

    随后,Kleene对其进行了形式化和改进,证明了正则表达式和有限状态自动机(finite automata)可以描述相同的语言。Kleene的贡献对理论计算科学产生了深远影响,尤其是在描述和分析简单的语言模式方面。 Ken ...

    胡乱前端高手,一起来学学JS如何实现敏感词过滤

    这就是DFA(Deterministic Finite Automaton,确定有限状态自动机)算法发挥作用的地方。DFA算法是一种高效的文字匹配方式,尤其适用于敏感词过滤。它通过构建一个有限状态机,将敏感词库转换为状态转移图,从而快速...

    suffix-automaton-vis:交互式应用程序,用于可视化如何构建后缀自动机O(n)

    同时,为了保证实时性,可能还涉及到了高效的算法实现,比如DFA(确定有限状态自动机)的构造算法,如Aho-Corasick算法或者KMP算法的变种。 在"suffix-automaton-vis-master"这个压缩包中,我们可以期待找到项目的...

    autocave:基于细胞自动机的侧滚轮(javascript)

    描述中提到的“基于细胞自动机的侧滚轮(javascript)”表明这个项目是使用JavaScript编程语言实现的。JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,尤其适用于客户端的交互式内容。在这个项目中,...

    cellAutomataApp:元胞自动机可视化应用程序

    1. **状态集**:每个单元格可以取的有限状态集合。 2. **邻域**:定义每个单元格与其相邻的单元格数量和方式。 3. **规则**:根据当前时刻的邻域状态,确定下一个时刻单元格的新状态。 4. **迭代**:通过不断应用...

    cvca:连续值元胞自动机

    在CVCA中,每个元胞都具有一个连续的数值状态,而不是像传统离散元胞自动机那样仅有有限的离散状态。这种连续性使得CVCA在模拟物理现象、生物过程或抽象的计算问题时具有更高的表现力和精确度。 CVCA的核心概念在于...

    jfsm:JSON 有限状态机 (JFSM) 表示、验证和生成

    该项目定义了使用 JavaScript 对象表示法 (JSON) 表示单级有限状态机 (FSM) 的语义,作为图形生成、FSM 执行分析和其他语言状态机生成的中间语言。 动机是嵌入式代码的很大一部分(阅读:全部)是某种有限自动机,...

    MiniSmall:基于有限自动机原理的Mini Node JS框架

    MiniSmall是一个独特的Node.js框架,它采用了有限自动机(Finite State Machine, FSM)的设计理念,以实现高效、轻量级的Web应用开发。在深入理解MiniSmall之前,我们先来了解一些基础概念。 **有限自动机(FSM)**...

    Nfa-To-Dfa

    NFA(非确定性有限状态自动机)和DFA(确定性有限状态自动机)是两种模型,用于匹配和处理字符串。本主题主要围绕如何将一个NFA转换为等价的DFA。 NFA(非确定性有限状态自动机)允许在某个状态下存在多个可能的...

    CellularAutomataEditor:具有规则编辑功能的元胞自动机

    在这个项目中,JavaScript不仅用于处理用户输入,还可能用于实现元胞自动机的演算逻辑,即在每个时间步更新所有单元格的状态。这涉及到数组操作、循环和条件语句等基本编程概念。 项目文件名...

    CellularAutomata:可定制的细胞自动机环境

    JavaScript实现细胞自动机: 1. 数据结构:使用JavaScript数组表示细胞自动机的格子,数组的每个元素代表一个单元格及其状态。 2. 更新逻辑:编写JavaScript函数来实现特定的细胞自动机规则。规则通常用一个数字编码...

Global site tag (gtag.js) - Google Analytics