有向图与关联数组

时间:2013-01-17 12:03:32

标签: algorithm graph-algorithm

我一直在阅读有向图。我已经设法在我的应用程序中使用了一个抽象的图形数据类型,但我发现它并不是特别直观,而是考虑用普通的多维数组替换它。

我的图表稀疏且非循环。每个顶点都可以从一个特定的主人那里获得。顶点。如果它是一棵树,这个主顶点将是' root'。它是一个社交网络,这个主要顶点将是“我”。

虽然我的图形可能有数十万个顶点,但它具有有限的深度:任意两个节点之间的最大距离是3个边缘。

基础数据表示是邻接列表。一个小例子看起来像这样:

Head | Tails
--------------
  1  | 2, 3, 4
  2  | 5  
  3  | 5
  4  | 5
  5  | 6

如果我使用普通的多暗阵列而不是我的图形数据类型,它看起来像这样:

$me[1][2][5][6]
$me[1][3][5][6]
$me[1][4][5][6]

现在,我希望能够对此图表做的主要事情是:

  1. 将其导航为层次结构。我意识到一些子顶点将出现在多个类别中(例如#5),但这就是我想要的特定用例。在这一点上,我无法看到数组和图形之间的任何真正差异。
  2. 将其列为列表(按字母顺序排列,根据顶点名称),没有重复项。我可能会做一个DFS,在我去的时候标记访问过的顶点,以避免不止一次地探索它们。但据我所知,这可以使用图形或数组来实现,并且成本相同。
  3. 做所有路径'对任何给定点的分析。因为我想要所有路径' (即,我不仅仅是检查可达性),在我看来,我必须遍历整个图形,并且我再次看到数组中的图形没有优势。
  4. 我觉得我错过了一些东西,但我不能把手指放在上面。你能???感激地接受任何想法,建议,见解或建议......(顺便说一下,我使用PHP,数据源是关系数据库。我不认为这会产生任何真正的不同)。

    谢谢!

2 个答案:

答案 0 :(得分:2)

您需要了解的一件事是有向图(或有向图)是概念,而关联数组是< strong>数据结构。

有向图概念的实例可以存储在许多不同的数据结构中,您可以在wikipedia page找到最常见的数据结构。

我不确定你在使用多维数组做什么...存储所有路径?你最终会遇到N³空间的复杂性,并且很难建立它。基于树的结构至少会更有效。

现在你想用图表做的事情:

  1. 导航为层次结构。基本有向图概念不允许在层次结构中上升,但您也可以轻松存储反向图形(特别是使用基于矩阵的表示,只需使用3个值而不是2 - 向前,向后和无)。
  2. 根据名称将其列为列表。你必须将名称存储在某个地方(在侧视图或顶点对象中),但它不应该比根据名称排序任何其他内容更难。
  3. 执行“所有路径”分析。您可以通过DP和路径的共享表示来消除线性复杂性(路径数量)。

答案 1 :(得分:0)

看起来你的数据结构太复杂了。如果将有向图表示为多维数组,则它几乎总是为二维,以便

$array[$x][$y]

是一个布尔值,当且仅当图中存在从节点$ x到节点$ y的边时,该值为TRUE。在你的例子中,如果是这样的话。

$array[1][2] = TRUE
$array[1][5] = FALSE

但是对于稀疏图,使用这种布尔矩阵表示通常不是很好。通常,您将拥有一个一维数组,将每个节点映射到一个有边的节点集,例如

$array[1] = { 2, 3, 4 }

其中{...}表示某种无序的集合数据结构,可以是例如二进制搜索树或哈希集(哈希表)。

通过此数据结构,您可以快速查找给定节点中存在弧的节点,这是图算法的关键特征。

有时您希望能够向后遍历图表;在这种情况下,您将拥有另一个将节点映射到其前任列表的数组。