我一直在阅读有向图。我已经设法让抽象图形数据类型在我的应用程序中工作,但我觉得它不是特别直观,并且正在考虑用普通的多维数组替换它。
我的图是稀疏且无环的。每个顶点都可以从一个特定的“主”顶点到达。如果它是一棵树,这个主顶点将是“根”。这是一个社交网络,这个主顶点将是“我”。
尽管我的图可能有数十万个顶点,但它的深度是有限的:任何两个节点之间的最大距离是 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]
现在,我希望能够用这张图做的主要事情是:
- 将其作为层次结构进行导航。我意识到一些子顶点将具有多个类别(例如#5),但这就是我想要的这个特定用例。在这一点上,我看不出数组和图表之间有任何真正的区别。
- 将其布置为列表(按字母顺序,根据顶点名称),没有重复。我可能会做一个 DFS,边走边标记访问过的顶点,以避免多次探索它们。但据我所知,这可以使用图形或数组来实现,并且成本相同。
- 对任何给定的点对进行“所有路径”分析。因为我想要“所有路径”(即,我不只是检查可达性),所以在我看来,我必须遍历整个图表,而且我再次看不出图表优于数组。
我觉得我错过了一些东西,但我不能把手指放在它上面。你能???任何想法,建议,见解或建议都非常感谢......(顺便说一下,我使用的是 PHP,数据源是一个关系数据库。我认为这没有任何真正的区别)。
谢谢!