繁体   English   中英

如何在内部表示确定性有限自动机

[英]How to internally represent a Deterministic Finite Automata

我有一个具有约 15M 状态的大型确定性有限自动机,而当前的 Java 实现相当缓慢且消耗内存。 我正在寻找可以替换当前代码的紧凑且快速的表示。

自动机由以下部分组成:

  1. 由整数标识的状态。 初始 state 始终为 state 0
  2. State 转换(源 state id 的三倍,转换或通配符的字符(最多 32 个值),目标 state id)。
  3. 一组接受状态。

我正在尝试以下方法,并且正在寻找其他想法。

1.使用Java Collections

state 转换以下列方式表示:

final List<Map<Character, Integer>> transitions = new ArrayList<>();
final Set<Integer> acceptingStates = new HashSet<>();

列表中的第 i 个项目包含第 i 个 state 的 state 转换。 一些分析告诉我,大部分执行时间都花在了访问 map 上。

2. arrays 的 Arrays

final int[][] states = new int[STATE_COUNT][32];
Set<Integer> acceptingStates = new HashSet<>();

第 i 行包含第 i 个 state 的 state 转换。 内部数组的第 j 列包含来自第 i 个 state 的第 j 个字符的 state 的 id,如果缺失,则为 -1。

这种表示要快得多,但它仍然占用至少 N * 32 * 4 个字节。

我会提出一个框架来实现你的 state 机器,但你定义中的一个语句让我感到困惑,你有 15M 状态或 15M State 机器实例。

如果您的应用程序是一个服务器端应用程序,可以集群最多托管 15M State 机器实例或 15M 状态,我建议您查看Akka 有限机器框架。

Akka 框架对于 State 机器实例的 memory 占用空间非常低,可以满足您的要求。 我个人开发了具有 50M State 机器实例的系统,该系统可以轻松包含更多。

如果需要实现示例,可以查看我的以下博客blog1 blog2

我希望这会对你有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM