繁体   English   中英

使用有限自动机作为容器的键

[英]Using finite automata as keys to a container

我有一个问题,在这里我真的需要能够使用有限自动机作为关联容器的键。 每个键实际上应该代表一个等价的自动机类,这样,当我搜索时,即使该自动机在结构上不相同,我也会找到一个等效的自动机(如果存在这样的键)。

当然,一种显而易见的最后解决方法是对每个检查的键使用线性搜索和等效测试。 我希望可以做得更好。

我一直在尝试强加一个任意但一致的排序,并推导一个排序比较算法。 第一原则涉及自动机代表的字符串集。 为每个自动机评估可能的第一个标记的集合,并基于这两个集合应用排序。 如有必要,请继续使用可能的第二个令牌,第三个令牌等的集合。天真地这样做的一个明显问题是,在证明等价性之前,要检查的令牌集合数量是无限的。

我一直在考虑一些模糊的想法-首先最小化输入自动机并使用某种闭包算法,或者转换回常规语法,其中一些想法涉及生成树。 我得出的结论是,我需要放弃令牌集的词法排序,但是到目前为止,我得出的最重要的结论是,这并非微不足道,我最好还是继续读下去。别人的解决方案。

我已经从CiteSeerX下载了一篇论文- 关于子组和子集的总排序 -但是我的抽象代数甚至还不足以知道这是否相关。

我也想到可能有某种方法可以从自动机中获取哈希值,但是我还没有考虑太多。

谁能推荐一篇好论文来阅读? -或者至少让我知道我下载的是不是鲱鱼?

我相信您可以从最小化的自动机中获得规范形式。 对于任何两个等效的自动机,它们的最小化形式是同构的(我相信这来自Myhill-Nerode定理)。 这种同构关系涉及边缘标签,当然也涉及节点类(开始,接受,不接受)。 这比未标记的图形同构更容易。

我认为,如果您从起始状态开始构建最小化自动机的生成树,并按其边缘对输出边缘进行排序,那么您将获得自动机的规范形式,然后可以对其进行哈希处理。

编辑:非树边缘也应考虑在内,但是它们的标签也可以规范地排序。

这是1992年的论文形式,在其中他们产生了规范的最小化自动机: 非确定性有限自动机的最小化

拥有规范的表单后,您可以轻松地对其进行哈希处理,例如,通过对状态和过渡进行深度优先枚举,并对通过编码状态编号(按其首次出现的顺序对它们进行编码)而获得的字符串进行哈希处理三重

<from_state, symbol, to_state, is_accepting_final_state>

这应该可以解决问题。

当问题似乎无法解决时,解决方案通常是公开宣布您认为问题有多困难。 然后,您将立即意识到这个问题是微不足道的,并且您只是使自己看起来很白痴-基本上这就是我现在的位置;-)

正如问题中所建议的,要按词法对两个自动机进行排序,我需要考虑两件事。 两组可能的第一个标记,以及两组可能的所有其他标记。 尾部可以表示为有限自动机,并且可以从原始自动机派生。

因此,比较算法是递归的-比较头部,如果结果不同,则相同,然后递归比较尾部。

问题是证明常规语法的等效性需要无限的序列。 如果在比较期间重复出现一对自动机(相当于您先前检查过的一对),则证明您具有等效性,则可以停止检查。 有限自动机的本质是必须以有限的步骤进行。

问题是我仍然有相同形式的问题。 为了确定我的终止条件,我需要将当前的自动机对与到目前为止在比较期间发生的所有过去的自动机对进行比较。 那就是让我头疼的事情。

事实证明,该论文是相关的,但可能只使我走了这么远。 常规语言可以使用连接运算符组成一个组,而左边的coset与我一直在考虑的head:tail有关。

我是个白痴的原因是因为我施加了过于严格的终止条件,我应该早就知道了,因为这不是WRT自动机算法的问题。

我不需要在自动机对的第一次复发时停止。 我可以继续下去,直到找到更容易检测到的复发-既具有结构上的等效性又具有逻辑上的等效性。 只要我的“自动尾部自动机”算法是理智的(尤其是如果我在每个步骤进行最小化并执行其他清除操作),在比较期间,我就不会生成无限个等价但外观不同的自动机对序列。 结构变化的唯一来源是原始的两个自动机和尾部自动机算法,两者都是有限的。

关键是,如果我比较太多的词汇术语并没有多大关系-我仍然会得到正确的结果,尽管我稍后会终止,但仍会在有限的时间内终止。

这应该意味着我可以使用对自动机的结构敏感的哈希或有序比较来进行不可靠的重复检测(允许某些假阴性)。 这是一个比不敏感结构的比较简单的问题,我认为这是我需要的关键。

当然,仍然存在性能问题。 基于此处涉及的问题,使用标准等效算法进行线性搜索可能是一种更快的方法。 当然,我希望这种比较比现有算法效率更低,因为它正在做更多的工作-非等价情况的词法排序。 真正的问题是基于关键字的搜索的整体效率,这可能需要进行一些令人头痛的分析。 我希望非等价自动机趋向于快速比较这一事实(检测到前几个步骤中的差异,就像传统的字符串比较一样)将使这种方法变得实用。

另外,如果到达怀疑等效性的程度,则可以使用标准等效性算法进行检查。 如果该检查失败,我将继续比较上次中断的顺序,而无需检查重复的尾部语言-我知道我将在有限的步骤中找到不同之处。

如果您只能做==或!=,那么我认为您必须在添加每个成员之前检查每个集合成员。 太慢了 (编辑:给定问题的标题,即使您继续使用比较函数直接比较两个有限自动机,我想您也已经知道了。)

我试图用系统发育树来做到这一点,但很快就遇到了性能问题。 如果要构建没有重复项的大型集,则需要一种转换为规范形式的方法。 然后,您可以检查哈希,或以字符串表示形式为键插入二叉树。

另一位提出了将树转换为规范代表的方法的研究人员使用Patricia树来存储唯一的树以进行重复检查。

暂无
暂无

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

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