我正在解决图形问题。它是一个无向图。假设有4个顶点(1,2,3,4),顶点链接如下。
1,2
1,3
1,4
2,1
3,1
4,1
G(i,j)和G(j,i)都如上所述存在(G-图,i-源顶点,j-指定顶点)。现在,我需要从中删除所有G(j,i)。这可能是有效的方式。
我尝试将所有i顶点插入一个数组,并将j顶点插入另一个数组。像
这样的东西a[0] = 1 and b[0] = 2
a[1] = 1 and b[1] = 3
so on..
但我很难删除G(j,i)条目。我有3个问题。
是否有任何有效的algoirthm去除重复(这里重复,我说,bcoz G(i,j)= G(j,i)。
是否有任何数据结构可以更轻松地执行此操作,而不是使用数组。
哪个数据结构通常用于图形问题。
答案 0 :(得分:1)
图表通常以邻接矩阵形式或邻接列表表示。
设n =节点数,m =边数,节点ID是从0开始的整数 - (n-1)
在邻接矩阵中,您基本上有一个大小为n x n的二维数组。如果节点[i][j]
和i
之间没有边缘,则索引j
的值为0,否则为非零。如果图形未加权,则矩阵通常为二进制(0表示无边,1表示边),您可以使用布尔值矩阵来节省空间。如果您的图表是无向的,请观察矩阵是否对称,因为[i][j]
处的边指示[j][i]
处的边。
但是,如果空间效率是一个问题,并且您的图表在边缘方面是稀疏的,那么将会有大量浪费的空间,因为无论边缘数是多少,数据结构都将采用O(n ^ 2)。
替代方案是邻接列表,其占用O(n + m)空间。这里我们可以有一个数组,其中数组的每个元素都是一个容器(比如一个链表或一个哈希集)。数组的i
容器包含连接到ith
节点的节点的ID。
要解决以“边缘列表”格式删除重复项的问题,您似乎需要一个无向图,这意味着从i
到j
的边缘意味着来自{{1}的边缘到j
。在邻接矩阵中,这可以通过设置i
来完成。在邻接列表中,使用[i][j] = [j][i] = true
容器最好,因为set
guarentees没有重复边缘。因此,当您在边缘列表中看到set
到i
的边缘时,您只需索引到j
个单元格并添加i
,并将索引编入j
1}}小区并添加j
。稍后当您看到i
到j
时,您也会这样做,但是将重复值添加到哈希集中将不会做任何事情。