萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 1332|回复: 6

一个关于有限状态机(FSM)的问题

[复制链接]
发表于 2008-6-25 13:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

x
为了处理一段消息,我写了个FSM,其中遇到一些问题,特来请教

假设只有2个状态A,B,并且A,B处理顺序固定,那FSM应该设计如下(简化版)

Start-------A--------B------END

如果A,B处理顺序不定,程序有可能先处理A,也有可能先处理B,则FSM图如下

                      A-------B
Start -----/                  \  ----- END
                 \ B-------A  /
但当我的状态增加到3(ABC,BCA,CAB,ACB.......),4,以至更多的时候这个状态机就会变得非常复杂,请问如何才能简化这种FSM,我的代码基本上是用switch case来转换状态

描述的可能有点乱,希望大家能看明白
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2008-6-25 20:22 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2008-6-25 21:48 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2008-6-25 23:50 | 显示全部楼层
LZ用什么语言写?C和Java都有现成的生成器,你只要写RE。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2008-6-29 16:28 | 显示全部楼层
除了每加一种状态,lz要多加一个switch case之外,

其他方面,增加的复杂度在什么地方?
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2008-6-29 17:10 | 显示全部楼层
原帖由 heavenstar_x 于 2008-6-29 16:28 发表
除了每加一种状态,lz要多加一个switch case之外,

其他方面,增加的复杂度在什么地方?


因为顺序变了,AB两种状态只要处理2AB,BA,ABC就是4种情况了,每加一种状态,就要多处理2的N-1次方个
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2008-7-1 01:30 | 显示全部楼层
好长时间没来了, 看到楼主这个问题不禁手痒, 也来写写自己的看法.

如果用图林机的模式来解决这个问题的话, 不免要走上使用RE的路. 不是说RE不好, RE本身非常强大, 不过在这里就比较尴尬一点, 因为想要动态地解决这个问题, 一个或者几个静态的RE是不太可能做到的. RE比较脆弱的一点就在这里体现出来了. 如果用到的字符出现变动, 比如说从{A, B, C}变到{A, B, C, D}的话, RE势必也要作出相应的改变, 这在程序运行的时候是不太可能做到的.

为什么不用Graph Transition(图)来尝试解决这个问题呢? 用图论来看这个问题, 一切都变得很简单. 所有可能出现的路线只要满足两个条件, 对于n个字符来说:
1. 每个字符不能重复
2. 字符长度等于n

这样就能动态地解决这个问题. 当然, 如果楼主是想动态地对每个状态做出不同的处理的话, 除了用programatically的方法(switch)以外不太可能了, 要是楼主真的解决了的话, 可以写个论文区申请图林奖了.

至于解决这个问题的复杂度, 用最简单的方法应该是 o(n!) 相当于:

for(i = 0; i < n, i++) {
  for(j = 0; j < n-1; j++) {
    ...
  }
}
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网 |网站地图

GMT+2, 2024-5-1 20:46 , Processed in 0.055655 second(s), 19 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表