我已经使用二维数组为DFA创建了转换表。例如,存储10个状态和两个转换。
transition = new int[10][2];
然而,对于NFA,我们有许多可能的过渡。下面的示例,当值0到来时,您可以转到S2或S3。所以,我不知道应该使用哪种Java结构。
我正在尝试为NFA创建一天的表,但我所做的所有方式都非常复杂。例如,使用,Hashtable,Set等。
请您分享一些代码示例或任何想法吗?
答案 0 :(得分:1)
为每个状态使用bitset,并为每个转换使用按位或|
。例如,S1 = 001,S2 = 010,S3 = 100.现在S2 | S3 = 110,因此您的{S2,S3}转换为110.如果用int表示,则允许最多32个状态;如果用long表示,则允许最多32个状态;对于更多状态(或更易于使用的按位操作),请使用BitSet。
顺便提一下,任何NFA都可以转换为DFA,例如, http://www.cs.odu.edu/~toida/nerzic/390teched/regular/fa/nfa-2-dfa.html用于教程,因此这可能是另一种选择,具体取决于您在此处尝试做的事情。