枚举顶点标记DAG的拓扑种类


11

令是有向无环图,令是将每个顶点映射到某个有限字母的标签的标记函数。写中,拓扑排序的是一个双射从至(即,的排序中的序列),以使得无论何时然后(即,如果存在从到的边G=(V,E)λvVλ(v)Ln:=|V|Gσ{1,,n}VV(v,v)Eσ1(v)<σ1(v)vv然后出现在序列中的之前)。所述标签的是单词在。vvσσ(1)σ(n)Ln

给定,我想高效地枚举的拓扑类型的标签。枚举拓扑类别的标签的复杂性是什么?当然,由于可能有成倍的指数增长,我想研究复杂度与输出大小或延迟的关系。特别是,可以使用多项式延迟执行枚举吗?(甚至是持续的延迟?)(G,λ)G

在所有顶点都带有不同标签的情况下(或者,等价地,顶点被自己标记为),我知道标签可以在固定的摊销时间内枚举,其结果是枚举位姿的线性扩展(与枚举DAG的拓扑种类相同)。但是,当任意标注顶点时,可能会出现大量拓扑类别具有相同标签的情况,因此,您不能仅枚举拓扑类别并计算其标签以获得一种枚举标签的有效方法。用poset术语,标记的DAG可以看作是标记的G{1,,n}G(G,λ) 姿态,而我找不到这些的枚举结果。

由于这里有其他问题的答案,我已经知道一些相关问题的难度。特别是,我知道在字典找到最小的标签是NP-hard。我也知道,确定给定的标签是否可以通过某种拓扑排序实现是NP难的(从这个问题的难度:给定候选标签序列,求出的拓扑排序,其中每个顶点必须出现在某个位置正确的标签出现在sGs)。但是,我不认为这会暗示枚举的难度,因为您可以按自己喜欢的任何顺序枚举(不一定是字典顺序),并且枚举算法无法有效地确定标签是否可以实现,甚至具有恒定的延迟(因为可能首先要成指数地列举许多序列)。

请注意,枚举第一个标签显然很容易(只要进行任何拓扑排序即可)。要列举的另一个标签比,您可以通过施加一些元素进行的得到一些位置列举其中尝试每个:和,并检查是否具有处于位置的拓扑排序,这可以在PTIME中清楚地完成。但是随着您输出越来越多的标签,我不确定如何概括这种方法。ssvVi{1,,n}siλ(v)vģ v iGvi

Answers:


-1

计算拓扑顺序的最简单方法之一是在给定的DAG上执行深度优先搜索。通过利用从当前顶点的未访问邻居中选择要遍历的下一个顶点的灵活性,可以生成不同的拓扑顺序。因为这是一个递归过程,所以通过选择遍历未访问邻居的不同顺序,可以列举所有可能的遍历(因此拓扑顺序)将很简单。ú úvuu

现在,为了限制由于相似标签而重复相同的遍历,可以比较具有相似标签的的未访问邻居。考虑遍历到达时具有相同未访问邻居的两个顶点和。当然,首先选择其中任何一个都会生成相同的DFS树,因此可以避免其中任何一个。 u v i v j uv1,v2,...,vkuvivju

现在,比较所有的邻居将导致总时间的开销,但是可以通过使用适当的数据在更有效地执行结构。 Ô Ñ 2øÑ v1,...,vkO(n2)O~(n)


感谢您的回答!但是,我不明白为什么您在第一段中建议的调整足以确保经过多项步骤后才能生成不同的拓扑排序标签。例如,如果所有元素都具有相同的标签,则仅枚举一个拓扑排序标签,但是我不确定为什么您的算法会注意到它并足够快地终止?(另一点:您说“邻居”,但是图形是DAG;您是说“孩子”吗?)
a3nm

在第一段中的调整是生成所有可能的排序,而与标签无关。为了限制相似标签的顺序,重要的是避免选择相同标签的顶点(如果它们看起来相似地连接到剩余的未访问图形)。因此,他们将创建同构未访问图,从而生成相同的拓扑顺序。
sbzk '16

对于所有标签都是相同的情况,这是微不足道的情况,否则即使是单个不同的标签也会导致很多不同的排序。减少计算量的一种方法是避免处理同构未访问的图。我现在确实同意,它可能不能保证开销,但是也许可以提供很好的启发式。O(n2)
sbzk '16

感谢您的解释。但是,我正在寻找适用于所有情况的复杂度的多项式界限,而不是没有理论保证的启发式方法!:)
a3nm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.