和或列表(或和或树)的数据结构的名称是什么,我在哪里可以了解到它?

时间:2018-12-17 10:26:00

标签: regex data-structures regular-language

我最近需要制作一个数据结构,该数据结构是和/或问题的嵌套列表。由于以前每个人都发现了大多数有趣的事物,因此我正在寻找此数据结构的名称。看起来像这样。

’(((a b c)(b d e)(c(a b)(f a)))

解释是我想找到abc或bde或caf或caa或cbf或cba,列表将其封装起来。在最上层,每个项目都被“或”在一起,并且最上层的子列表也被“和”在一起,子列表的子列表又被“或”在一起,而那些子列表的子列表又被“和”在一起。那些广告无限。请注意,在我的示例中,所有列表的长度都是相同的,在我的实际应用程序中,列表的长度是不同的。

行走这样一棵“树”的代码相对简单,但是我假设这种树有一个名字,并且我可以读到一些东西。

这些列表等效于固定长度的正则表达式(我将其称为“网络表达式”,但我对此数据结构及其表示形式特别感兴趣。

2 个答案:

答案 0 :(得分:1)

通常(在非常高的抽象层次上)它是: Context free grammar -Wiki

如果您允许它无限嵌套,则由于括号的存在(左右应匹配),因此它不是正则表达式。

如果您考虑的话,括号内的表达式是有序的。我的意思是a and b and c等效于(a and b) and c。您会得到Binary expression tree -Wiki

但是对于您的特殊情况,可能是:Disjunctive normal form -Wiki

我不确定,但是我的直觉说这又是正则表达式,因为您只有2个嵌套级别(第一个-用于“或-ed”部分,第二个嵌套-“ and-ed”部分)

答案 1 :(得分:0)

树也是DAWGS - directed acyclic word graphs的子集,人们可以用相同的方式构造它们。

对于我来说,我有一个手工制作的很小的集合,我不担心获得最小的集合,而是只想要一些我可以轻松写下但可以处理简单变体类型的东西我知道了。基本上,我会根据使用的各种操作系统的不同目录结构,以不同的方式查找将.el文件保存在何处。 (例如,当我在Google工作时,/ usr / local / emacs / site-lisp目录实际上更像是/ usr / local / Google / emacs / site-lisp。)

我不需要完整的正则表达式,但是大约有十二种变体,其中一些具有相当长的嵌套子目录列表(c:\ users \ cfclark \ appData \ roaming \ emacs.emacs.d或其他一些我想写下来的糟糕的东西(然后让emacs进行自动搜索以找到适合此特定安装的内容)。每次我去一份新工作时,我只需在列表中添加关于他们在该设置中的位置的描述。

无论如何,随着代码的发展,我发现自己正在做(嵌套或的and and's,并意识到该结构可以推广到交替的或/和/或/和/ ...的情况)。因此,我的假设是某人之前一定已经发现了这一点。几年前,我本人对此有所暗示,但并未着手实施。 mpasko256提供的Disjunctive Normal Form链接也特别重要。我没有标准化到那个水平,我仍然保持嵌套和的and or而不是展平到2,但是我确实有一个独特的结构,或者说顶部是,然后是and,然后是or。...