我想我已经理解了如下所述的特定情况,但我缺乏进行证据的理论知识,我找不到任何提及它的来源。如果我的理解是正确的,我可以在我的邻接矩阵上节省一半的空间,如果不是,我可能会有非常奇怪的错误。所以我想确定一下,如果有更坚实背景的人能够回顾我的推理,我会很感激。
假设我在n * n邻接矩阵中表示n个顶点的DAG,如果从顶点i,j
到顶点{{1}存在边缘,则条目1
为i
}},j
否则。因为图表是有向的和非循环的,所以如果0
,则为i,j = 1
。如果我现在对矩阵中的节点进行排序,使得i n 处的节点的拓扑级别等于或大于i n-1 处的节点,那么在我看来,邻接矩阵的一半将始终只包含j,i = 0
s,如下例所示:
V 1 V 2 from V 1 2 3 4 5 6 7 8 / \ / \ / \ / \ to V 1 0 0 0 0 0 0 0 0 / \ / \ 2 0 0 0 0 0 0 0 0 e1/ e2\ e3/ e4\ 3 1 0 0 0 0 0 0 0 / \ / \ 4 1 1 0 0 0 0 0 0 V 3 V 4 V 5 5 0 1 0 0 0 0 0 0 /|\ / 6 0 0 0 1 0 0 0 0 / | \ / 7 0 0 0 1 0 0 0 0 / | \ / 8 0 0 0 1 1 0 0 0 e5/ e6| e7\ e8/ / | \ / V 6 V 7 V 8
也许我说得对,但有没有正式的方式来检查这个?
答案 0 :(得分:7)
让adj[i][j]
成为从节点i
到节点j
的邻接条目,并且您已对其进行排序,以便对于所有节点i < j
,节点i
拓扑层次结构高于节点j
。
让我们暂时假设你的假设不正确:我们有一个反例 - adj[i][j] == 1
为i > j
(即矩阵表示的右上半部分中的一个) 。这意味着必须有一个包含i
和j
的循环,因为我们的排序可以保证节点j
高于节点i
,但我们有adj[i][j] == 1
意味着我们可以“爬上”层次结构。这是一个矛盾,因为我们知道我们有一个DAG。因此,我们已经证明您的假设是正确的。
答案 1 :(得分:-1)
只有在按照排序顺序使用图形标签构建邻接矩阵时,这才是正确的。对于反例构建B-> C-> A的邻接矩阵。
如果你保留了一个真实节点的散列到它的拓扑排序位置并构造了邻接矩阵,你就可以在一个大矩阵上节省一些空间,因为你用O来节省矩阵中的O(n²)空间(n)大小哈希表。