删除G(j,i)条目

时间:2013-02-22 07:03:48

标签: arrays data-structures graph

我正在解决图形问题。它是一个无向图。假设有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个问题。

  1. 是否有任何有效的algoirthm去除重复(这里重复,我说,bcoz G(i,j)= G(j,i)。

  2. 是否有任何数据结构可以更轻松地执行此操作,而不是使用数组。

  3. 哪个数据结构通常用于图形问题。

1 个答案:

答案 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。

要解决以“边缘列表”格式删除重复项的问题,您似乎需要一个无向图,这意味着从ij的边缘意味着来自{{1}的边缘到j。在邻接矩阵中,这可以通过设置i来完成。在邻接列表中,使用[i][j] = [j][i] = true容器最好,因为set guarentees没有重复边缘。因此,当您在边缘列表中看到seti的边缘时,您只需索引到j个单元格并添加i,并将索引编入j 1}}小区并添加j。稍后当您看到ij时,您也会这样做,但是将重复值添加到哈希集中将不会做任何事情。