我一直在阅读有向图。我已经设法在我的应用程序中使用了一个抽象的图形数据类型,但我发现它并不是特别直观,而是考虑用普通的多维数组替换它。
我的图表稀疏且非循环。每个顶点都可以从一个特定的主人那里获得。顶点。如果它是一棵树,这个主顶点将是' 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]
现在,我希望能够对此图表做的主要事情是:
我觉得我错过了一些东西,但我不能把手指放在上面。你能???感激地接受任何想法,建议,见解或建议......(顺便说一下,我使用PHP,数据源是关系数据库。我不认为这会产生任何真正的不同)。
谢谢!
答案 0 :(得分:2)
您需要了解的一件事是有向图(或有向图)是概念,而关联数组是< strong>数据结构。
有向图概念的实例可以存储在许多不同的数据结构中,您可以在wikipedia page找到最常见的数据结构。
我不确定你在使用多维数组做什么...存储所有路径?你最终会遇到N³空间的复杂性,并且很难建立它。基于树的结构至少会更有效。
现在你想用图表做的事情:
答案 1 :(得分:0)
看起来你的数据结构太复杂了。如果将有向图表示为多维数组,则它几乎总是为二维,以便
$array[$x][$y]
是一个布尔值,当且仅当图中存在从节点$ x到节点$ y的边时,该值为TRUE。在你的例子中,如果是这样的话。
$array[1][2] = TRUE
$array[1][5] = FALSE
但是对于稀疏图,使用这种布尔矩阵表示通常不是很好。通常,您将拥有一个一维数组,将每个节点映射到一个有边的节点集,例如
$array[1] = { 2, 3, 4 }
其中{...}表示某种无序的集合数据结构,可以是例如二进制搜索树或哈希集(哈希表)。
通过此数据结构,您可以快速查找给定节点中存在弧的节点,这是图算法的关键特征。
有时您希望能够向后遍历图表;在这种情况下,您将拥有另一个将节点映射到其前任列表的数组。