MySQL遍历图形数据并获得非循环路径

时间:2011-11-16 03:07:02

标签: php sql graph traversal cyclic

这个对我来说很难解决,基本上我在表格中有数据如下:

id  a   b
1   2   4
2   4   2
3   5   2
4   2   5
5   6   2
6   2   6
7   8   6
8   6   8
9   5   6
...

如果你试图确定父母有哪些孩子,你可以看到结构有多复杂:

[2->[4->[2->RECURSIVE], 5->[2->RECURSIVE], 6->[2->RECURSIVE, 8->[6->[8->RECURSIVE]]]], ...]

我担心单独的MySQL无法有效地找到路径,但考虑到我在PHP中写这个可能我可以写一些方法,它可能首先查询800行代码然后编程一种有效的方法来解析数据

这个想法是我试图做的这个函数,让我们称之为makePath()接受两个参数并返回一个带有子数组的数组,而id指的是数据表中的一行。

例如makePath(2,8)将返回:

array(array(2,6,8), array(2,5,6,8))

因为这些是从2到8没有回溯的唯一路径(即走向[2,5,2,6,8]和无限其他路径组合。)

我被困在如何开始这一切,希望有人比我在图上更亮,循环理论可以解释我应该如何开始我的代码 - 谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

您应该能够在有向图结构上进行深度优先搜索。基本大纲如下:

  1. 创建图表。您至少需要一个子列表和每个节点visiting标志。
  2. 使用初始节点呼叫访问。对于您的访问函数,您需要知道目标节点,引用结果数组,并跟踪沿堆栈中当前路径访问的节点。
  3. 如果当前节点是最终节点,则将行进的路径(通过堆栈)添加到结果数组。
  4. 如果正在访问该节点,则返回。
  5. 如果没有访问该节点,那么
    1. 将节点标记为已访问
    2. 与每个孩子打电话(递归)
    3. 将节点取消标记为正在访问
  6. 如果您需要任何步骤的帮助,请询问。