我正在研究Java中的项目(但我认为它不依赖于语言)我在二进制字母表上生成小的(最多4个状态)非确定性有限状态自动机,我必须快速检查生成的自动机与之前的自动机等价。因此,我必须使用一些好的哈希函数,以避免与太多的自动机进行竞争。
我的第一个想法是在转换上执行DFS并找到所有可接受的单词,直到最大长度。 5然后我将接受的字集映射到64位长(长度最大为5的二进制字的数量)。但它似乎在有4个州的NFA上产生了太多的碰撞。增加长度会导致哈希码的计算速度太慢而无法实际使用。
另一种方法是拥有一组单词并测试其中哪一个是自动机接受的,但我认为找到正确的单词并不是那么简单。
您是否知道如何改进散列函数以避免过多的冲突而不会显着降低速度?
提前致谢
答案 0 :(得分:1)
我正在进一步思考(感谢@justhalf和@templatetypedef)我有一个想法 - 任何NFA(或者更确切地说,它接受的语言)对整数的内射函数 - 让我们有一个NFA A.让我们构造最小的DFA A_min接受具有完整delta函数的相同语言。作为Myhill-Nerode定理的结果,除了同构之外,这个自动机应该是明确的。从初始状态执行BFS,根据字母表中某些固定的字符顺序(例如,前0,后1)优先考虑边缘(转换)。并根据访问顺序重新编号状态。现在我们有一个规范的最小DFA,我们可以将状态的关联矩阵映射到一个整数,并附加最终状态的枚举(或者更好地制作一个元组,以避免碰撞)。然后可以使用该整数来确定两个NFA的等效性。你觉得,没关系还是有其他想法?