Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures NFA表示的数据结构_Data Structures_Nfa - Fatal编程技术网

Data structures NFA表示的数据结构

Data structures NFA表示的数据结构,data-structures,nfa,Data Structures,Nfa,在我的词法分析器生成器中,我使用McNouton和Yamada算法进行NFA构造,它的一个属性是将I转换为J,并在J位置用字符标记 因此,NFA的每个节点可以简单地表示为下一个可能状态的列表 哪种数据结构最适合存储此类数据?它必须提供对所有可能状态的快速查找,并使用更少的空间,但插入时间并不重要。我的理解是,您需要对图形进行编码,其中节点是状态,边是过渡,每条边都用字符标记。对吗 枯燥但实用的答案是,每个状态都有一个对象,并在该对象的一些小结构中对转换进行编码 最简单的是一个数组,由字符代码索引

在我的词法分析器生成器中,我使用McNouton和Yamada算法进行NFA构造,它的一个属性是将I转换为J,并在J位置用字符标记

因此,NFA的每个节点可以简单地表示为下一个可能状态的列表


哪种数据结构最适合存储此类数据?它必须提供对所有可能状态的快速查找,并使用更少的空间,但插入时间并不重要。

我的理解是,您需要对图形进行编码,其中节点是状态,边是过渡,每条边都用字符标记。对吗

枯燥但实用的答案是,每个状态都有一个对象,并在该对象的一些小结构中对转换进行编码

最简单的是一个数组,由字符代码索引:这是最快的速度,但不自然地节省空间。您可以通过使用一种偏移、截断的数组来提高空间效率:只存储数组中包含转换的部分,以及该部分的开始和结束索引。在查找字符时,检查其代码是否在边界内;如果不是,则将其视为空边(或返回开始状态的边或其他),如果是,则在索引处获取元素(字符代码-开始)。这有意义吗

一个更复杂的选项是一个小哈希表,它将更紧凑,但稍微慢一点。我建议使用封闭散列,因为冲突列表会占用太多内存;线性探测应该足够了。您可以考虑使用完美散列(查找),这需要花费大量时间来生成表,但随后会提供无冲突的查找。不过,生成过程相当复杂

一种聪明的方法是同时使用数组和哈希表,并根据边的数量选择一个或另一个:如果压缩的数组将超过(比如)三分之一,则使用它,如果不是,则使用哈希表


现在,你可以做一些更激进的事情,使用数组,但是要重叠它们-如果它们是稀疏的,它们会有很多洞,如果你聪明的话,你可以排列它们,使每个数组中的条目与其他数组中的洞对齐。这将为您提供快速的查找,但也具有出色的内存效率。您将需要一些方案来区分查找何时发现了某些内容,以及何时发现了具有其他状态转换的空插槽,但我相信您可以想到一些内容。

是的,有某种形式的图形-但带有标记节点(而非边),并且每个转换都将“标记”使用重叠数组看起来很有趣,我会考虑一下。谢谢。@S.J.找到一个好的算法来进行重叠可能是一个挑战。我记得在十年前的一个老JavaVM中,我在其中看到的唯一一个上下文是为接口生成重叠的vtables!也许值得再问一个问题。