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

时间:2014-01-27 09:50:48

标签: algorithm graph-algorithm

假设我有一个带有2 ^ N - 1个节点的图形,编号为1到2 ^ N - 1.如果j的二进制表示中的所有位都是1,则节点i“依赖于”节点j,也是1在i的二进制表示中。因此,例如,如果N = 3,则节点7依赖于所有其他节点。节点6依赖于节点4和2。

问题在于消除节点。如果没有其他节点依赖它,我可以消除节点。没有节点依赖于7;因此我可以消除7.消除7之后,我可以消除6,5和3等。我想要的是找到一个有效的算法来列出所有可能的唯一消除路径。 (也就是说,7-6-5与7-5-6相同,所以我们只需要列出其中一个)。我已经有了一个愚蠢的算法,但我认为必须有更好的方法。

我有三个相关的问题:

  1. 此问题是否具有通用名称?

  2. 解决问题的最佳方法是什么?

  3. 是否有唯一排除路径数的通用公式?

  4. 编辑:我应该注意,根据定义,节点不能依赖于自身。

    Edit2:让S = {s_1, s_2, s_3,...,s_m}成为所有m有效排除路径的集合。 s_is_j是“等效的”(就我的目的而言)如果两个淘汰s_is_j在淘汰后会导致相同的图表。我想更清楚一点,我可以说我想要的是有效消除步骤产生的所有唯一图形的集合。

    Edit3:请注意,消除路径的长度可能不同。对于N = 2,5个有效消除路径是(),(3),(3,2),(3,1),(3,2,1)。对于N = 3,有19条唯一路径。

    Edit4:Re:我的应用程序 - 应用程序在统计中。给定N个因子,统计模型中有2 ^ N - 1个可能的项(见http://en.wikipedia.org/wiki/Analysis_of_variance#ANOVA_for_multiple_factors),它们可以包含主效应(仅因子)和各种(2,3,...方式)相互作用。因素。但是,如果存在所有子交互(或主要效果),则交互只能存在于模型中。例如,对于三个因素abc,如果所有组成的双向互动({{{3},那么3种互动a:b:c只能存在。存在1}},a:ba:c)(同样适用于双向)。因此,不允许使用模型b:c。我正在寻找一种快速生成所有有效模型的方法。

3 个答案:

答案 0 :(得分:1)

在集合方面考虑这一点似乎更容易:您正在寻找{1,...,N}子集的族,这样对于族中的每个集合,其所有子集都存在。每个这样的族由包含方式的最大集确定,其必须重叠。成对重叠集的族称为Sperner families。因此,您正在寻找Sperner家族,以及家族中所有子集的联合。可能已知的用于计算Sperner家族或反链的算法通常是有用的;在不知道你真正想要用它们做什么的情况下,很难说清楚。

答案 1 :(得分:1)

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

出于我的目的,我使用算法,然后消除生成的二进制数组的第一列和最后一行。从顶行开始,如果可以消除1节点,则每行在i列中都有i

谢谢!

答案 2 :(得分:0)

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

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

请注意,此图表是,即除root之外的每个节点都只有一个父节点。

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

UPDATE:

上面的方法很糟糕,因为你不能只选择一个给定项目的随机父项 - 你有一个有限数量的项目,你可以从中挑选一个“合法的”父项...但我在这里留下这个方法让其他人发表意见(也许并非“那么糟糕”)。

在任何情况下,为什么不采用图表,提取生成树(您可以使用Prim算法或Kruskal算法来查找最小生成树),然后计算其中的路径数量?