使用大字母存储 DFA 转换 table 的内存有效方式?

Memory efficient way to store DFA transition table with large alphabet?

我正在尝试为 DFA 实现一个非常简单的状态转换 table,但我 运行 遇到了一些效率问题。

如果我安排一个转换 table,每一行作为源状态,每一列作为可能的输入,交集作为下一个状态,那么转换就很简单:

next_state = table[from_state, input]

此方法将给出 O(1) 的转换时间。当有很多可能的输入时,问题就出现了。如果我有一个包含所有 128 个 ASCII 字符的字母表,那么 table 将失去控制并通过内存咀嚼甚至只有几个状态(状态 * 输入)。

我考虑的另一个选择是让每一列成为目标状态,交叉点成为输入符号。

input = table[from_state, to_state]

这种方法减少了内存消耗,但执行转换需要测试所有列,直到以 O(N) 的方式找到具有正确输入的列。

我真的陷入了时间-space 权衡,还是有某种更好的方法来实现这个?

P.S。我知道存在压缩算法,但是可以使用它们在构建期间保持 table 压缩吗?

我想我已经决定了一个看起来符合我需要的实现。它使用与第一种方法相同的方法,但保留一个单独的元组来跟踪最小和最大使用的代码点。 table 只会将其列扩展到该范围内的字符数。由于大多数字符可能永远不会被使用,除了一小部分字符,这可能就足够了。

索引就变成了 (input - lowest_codepoint) 从索引 0 开始。