MySQL中的深度优先搜索

时间:2012-11-23 21:07:03

标签: mysql algorithm search stored-procedures depth-first-search

我正在尝试编写一个MySQL PROCEDURE,它将边e和边集eset作为输入,并输出一个布尔值iscyclic来确定是否附加边缘导致循环图。除了创建一个包含“visit count”之类的列的所有顶点的表格,然后检查在运行边缘集时是否多次访问任何顶点时,还有更简单的方法吗?

1 个答案:

答案 0 :(得分:3)

正如Billiska的评论所示,您需要跟踪森林中的各个树木,即连接的树木。

disjoint set data structure的最简单实现将包含一个临时表,该表将每个顶点的ID映射到父级的ID。您可以从一个顶点到下一个顶点跟随这些父链接,直到您最终得到这个树的根,这是一个指向自身的顶点。此根用作标识整个连接集的唯一代表。

因此,要检查是否已连接两个集合,您需要计算它们的根并简单地比较它们。

  • 最初每个顶点都是它自己的父节点。
  • 通过计算它们的根和制作来建模连接两个节点 其中一个是另一个的父母。

还有其他工具可以保持树的深度较低:

  • 你总是让更深的树成为不那么深的树的父母, 并且您可以执行路径压缩以减少找到的深度 节点。

所有这些都可以在MySQL中建模,但性能行为可能与内存实现不同。

所以我建议推迟,直到你确实知道你需要更多的性能,并有一些数据来测试和比较不同的实现。