在“图”中消除节点的高效算法?

3
假设我有一个由2 ^ N-1个节点组成的图,编号为1到2 ^ N-1。如果二进制表示中j的所有位为1,则节点i“依赖于”节点j。在这种情况下,例如,如果N = 3,则节点7依赖于所有其他节点。节点6依赖于节点4和2。
问题是消除节点。如果没有其他节点依赖它,则可以消除节点。没有节点依赖于7;因此我可以消除7。消除7后,我可以消除6、5和3等。我想找到一种有效的算法来列出所有可能的唯一消除路径。(也就是说,7-6-5与7-5-6相同,因此我们只需要列出其中之一)。我已经有了一个愚蠢的算法,但我认为一定有更好的方法。
我有三个相关的问题:
1. 这个问题有通用名称吗? 2. 解决这个问题的最佳方法是什么? 3. 是否有唯一消除路径数量的通式?
编辑:应注意,根据定义,一个节点不能依赖于其本身。
编辑2:让S = {s_1,s_2,s_3,...,s_m}成为所有m个有效消除路径的集合。对于我的目的,s_i和s_j是“等价的”,如果两个消除s_i和s_j将导致相同的图形。我认为要更清楚,我可以说我想要的是所有唯一图形的集合,这些图形是通过有效的消除步骤得出的。
编辑3:注意,消除路径可能具有不同的长度。对于N = 2,5个有效的消除路径为(),(3),(3,2),(3,1)和(3,2,1)。对于N = 3,有19个唯一路径。

编辑4:关于我的应用程序 - 该应用程序是与统计学相关的。给定N个因素,统计模型中可能包含2^N-1个可能项(参见http://en.wikipedia.org/wiki/Analysis_of_variance#ANOVA_for_multiple_factors),这些可能项可以包含主效应(仅因素)和因素之间的各种(2,3,...方式)交互作用。但是,只有在所有子交互作用(或主效应)存在时,才能在模型中出现交互作用。例如,对于三个因素a、b和c,3路交互作用a:b:c只能在所有组成的二路交互作用(a:b、a:c、b:c)都存在时才能存在(两路也是如此)。因此,模型a+b+c+a:b+a:b:c将不被允许。我正在寻找一种快速生成所有有效模型的方法。


1
什么可以被认为是独特的?如果我们看它们在图表中的位置,5和6实际上并不相似。 - Pham Trung
这个图不是一个DAG,算法也类似于拓扑排序吗? - Shahbaz
1
此外,您的要求有些模糊。如果 7-6-57-5-6 是相同的,那么为什么 (虚构路径) 7-6-5-4-3-2-17-6-4-5-3-1-2 不是相同的呢? - Shahbaz
@Shahbaz,我现在想我明白你的意思了。请看第二次编辑。 - richarddmorey
很抱歉,我仍然不太清楚。看起来你只有一条唯一的消除路径。对于你的N=7的例子,你能否命名任何与7-6-5-4-3-2-1不等价的路径?也许如果你能快速画几个图会更清楚。 - Shahbaz
显示剩余7条评论
3个回答

1

从集合的角度来看,似乎更容易理解:您正在寻找{1, ..., N}的子集族,使得该家族中的每个集合也都包含其所有子集。每个这样的家族都由包含关系最大的重叠集确定。具有成对重叠集的家族称为Sperner families。因此,您正在寻找Sperner家族,以及家族中所有子集的并集。可能已知的枚举Sperner家族或一般反链的算法是有用的;不知道您实际想要做什么,很难说。


戴德金德数(3、6、20)看起来像是路径数量加1,对于N=1、2和3。因此,答案可能是“否”(No)。 - richarddmorey

1

感谢@FalkHüffner的回答,我发现我想要做的事情相当于找到N个参数的单调布尔函数。如果您查看Dedekind数的维基百科页面上的图表(http://en.wikipedia.org/wiki/Dedekind_number),该图表以图形方式表达了问题。有一个算法可以生成单调布尔函数(http://www.mathpages.com/home/kmath094.htm),并且构造起来非常简单。

对于我的目的,我使用该算法,然后消除所得到的二进制数组的第一列和最后一行。从上往下开始,每一行在第i列具有1,如果可以消除第i个节点。

谢谢!


0

你可以构建一个“堆”,其中深度为X的所有节点都具有其二进制表示中X个零。

然后,从底层开始,将每个项目连接到上一层的随机父项,直到获得单组件图。

请注意,此图是一棵,即除根节点外,每个节点都恰好有一个父节点。

然后,遍历树(从根开始)并计算其中的路径总数。

更新:

上述方法不好,因为您不能仅为给定项目选择随机父项-您只能从中选择“合法”父项的有限数量...但我将保留此方法供其他人发表意见(也许它并不“那么糟糕”)。

无论如何,为什么不使用Prim算法或Kruskal算法提取生成树(Spanning Tree),然后计算其中的路径数呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接