算法之有限状态机以及实现KMP算法

本文介绍了有限状态机的基本概念,强调了其在逻辑清晰和事件封装上的优势,并通过实例展示了如何用有限状态机处理字符串。进一步讨论了如何应用有限状态机实现KMP算法,包括求跳转表格和真正匹配的过程,同时也对比了有限状态机与正则表达式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有限状态机

一、简要介绍

有限状态机(模拟电路,有开启和断开两个状态)

  • 状态总数(state)是有限的。
  • 任一时刻,只处在一种状态之中。
  • 某种条件下,会从一种状态转变(transition)到另一种状态。

举例:菜单鼠标悬停:菜单显示,鼠标移开:菜单隐藏。

  var menu = {
   
      
    // 当前状态
    currentState: 'hide',
  
    // 绑定事件
    initialize: function() {
   
      var self = this;
      self.on("hover", self.transition);
    },
  
    // 状态转换
    transition: function(event){
   
      switch(this.currentState) {
   
        case "hide":
          this.currentState = 'show';
          doSomething();
          break;
        case "show":
          this.currentState = 'hide';
          doSomething();
          break;
        default:
          console.log('Invalid State!');
          break;
      }
    }
  };

优势: 逻辑清晰,表达力强,有利于封装事件。一个对象的状态越多,发生的事件越多,越适合采用有限状态机写法。实际上promise也可以用有限状态机模型实现。

import StateMachine from "javascript-state-machine";

// 状态机模型
let fsm = new StateMachine({
   
  init: "pending",
  transitions: [
    {
    name: "resolve", from: "pending", to: "fulfilled" },
    {
   
      name: "reject",
      from: "pending",
      to: "rejected"
    }
  ],
  methods: {
   
    onResolve: function(state, data) {
   
      // state - 当前状态机实例,data - fsm.resolve(xxx)
      data.successList.forEach(fn=>fn())
    },
    onReject: function(state, data) {
   
      data.failList.forEach(fn=>fn())
    }
  }
});

// 定义Promise
class MyPromise {
   
  constructor(fn) {
   
    this.sucessList = []
    this.failList = []
    fn(
      function() {
   
        // resolve函数
        fsm.resolve(this)
      },
      function() {
   
        // reject函数
        fsm.reject(this)
      }
    );
      then(successFn, failFn){
   
        this.successList.push(successFn)
        this.failList.push(failFn)
      }
  }
}

// 测试代码
function loadImg(src) {
   
  const promise = new Promise(function(resolve, reject) {
   
    let img = document.createElement("img");
    img.onload = function() {
   
      resolve(img);
    };
    img.onerror = function() {
   
      reject();
    };
    img.src = src
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值