查找周期:DFS 与 union-find?
Finding cycles: DFS versus union-find?
带着色的 DFS 需要 O(V+E)
vs union find 需要 O(ElogV)
参考:http://www.geeksforgeeks.org/detect-cycle-undirected-graph/
所以联合查找方法比较慢。
如果 V = 100,E = 100,DFS = 200,Union find 为 1,000。
有理由使用 Union find 吗?我个人喜欢它,因为它产生了干净的代码。
或者我错过了工会发现在实际实践中更好的任何事情?
与 path compression and union by rank will have O(E*α(n))
complexity, where α(n)
is an inverse Ackermann function 联合查找。它的 运行 时间可以与 DFS 相媲美,但就我个人而言,我会使用 DFS,它是完成任务的更简单和更明显的方法。
我能想到的更喜欢 union-find 的唯一原因是当我们有一些无序的 list/set 边作为图形表示时,我们不能或不想使用额外的情况time/memory 为 DFS 转换此数据。
我怀疑您可能误解了大 O 表示法的工作原理。符号 O(V + E) 并不意味着 "the runtime is computed by adding V and E), but rather "运行 时间尺度作为 V 和 E) 之和的函数。”例如,假设您 运行 DFS一个有 1,000 个节点和 1,000 条边的图,运行时间是 1 毫秒。然后可以合理地假设一个有 2,000 个节点和 2,000 条边的图的 运行时间大约是 2 毫秒。但是,如果您没有建立参考点,大 O 符号本身不会告诉您 运行time 在某些给定输入上的时间。我在这里给出的 1ms 数字完全是猜测 - 您会必须 运行 实施才能看到 运行 时间。
类似地,运行时间 O(E log V) 表示“运行时间尺度为节点数与边数的对数的乘积。)例如,如果具有 1,000 个节点和 1,000 条边的输入的 运行 时间为 1 毫秒,那么具有 1,000 个节点和 2,000 条边的输入的 运行 时间可能为 2 毫秒,并且 运行具有 1,000,000 个节点和 1,000 个边的输入的时间同样约为 2 毫秒。同样,找出某些初始输入的 运行 时间的唯一方法是 运行 它并查看什么发生了。
另一个细节 - 正如许多其他人指出的那样,联合查找数据结构上给出的界限是针对一个非常低效的联合查找结构。使用具有路径压缩和按秩并集的不相交集合森林,您可以获得每次操作的 O(α(n)) 的渐近 运行 时间,其中 α(n) 是一个增长极其缓慢的函数(阿克曼反函数)对于你可以放入宇宙的所有输入基本上是 5。
话虽如此 - DFS 的渐近 运行时间比联合查找方法要好,因此它在实践中可能更快。 DFS 也相对容易实现,所以我建议采用这种方法。
union-find 结构的优势在于它适用于连续添加边的连接问题的增量版本。DFS 不能很好地处理这种情况。
带着色的 DFS 需要 O(V+E)
vs union find 需要 O(ElogV)
参考:http://www.geeksforgeeks.org/detect-cycle-undirected-graph/
所以联合查找方法比较慢。 如果 V = 100,E = 100,DFS = 200,Union find 为 1,000。 有理由使用 Union find 吗?我个人喜欢它,因为它产生了干净的代码。 或者我错过了工会发现在实际实践中更好的任何事情?
与 path compression and union by rank will have O(E*α(n))
complexity, where α(n)
is an inverse Ackermann function 联合查找。它的 运行 时间可以与 DFS 相媲美,但就我个人而言,我会使用 DFS,它是完成任务的更简单和更明显的方法。
我能想到的更喜欢 union-find 的唯一原因是当我们有一些无序的 list/set 边作为图形表示时,我们不能或不想使用额外的情况time/memory 为 DFS 转换此数据。
我怀疑您可能误解了大 O 表示法的工作原理。符号 O(V + E) 并不意味着 "the runtime is computed by adding V and E), but rather "运行 时间尺度作为 V 和 E) 之和的函数。”例如,假设您 运行 DFS一个有 1,000 个节点和 1,000 条边的图,运行时间是 1 毫秒。然后可以合理地假设一个有 2,000 个节点和 2,000 条边的图的 运行时间大约是 2 毫秒。但是,如果您没有建立参考点,大 O 符号本身不会告诉您 运行time 在某些给定输入上的时间。我在这里给出的 1ms 数字完全是猜测 - 您会必须 运行 实施才能看到 运行 时间。
类似地,运行时间 O(E log V) 表示“运行时间尺度为节点数与边数的对数的乘积。)例如,如果具有 1,000 个节点和 1,000 条边的输入的 运行 时间为 1 毫秒,那么具有 1,000 个节点和 2,000 条边的输入的 运行 时间可能为 2 毫秒,并且 运行具有 1,000,000 个节点和 1,000 个边的输入的时间同样约为 2 毫秒。同样,找出某些初始输入的 运行 时间的唯一方法是 运行 它并查看什么发生了。
另一个细节 - 正如许多其他人指出的那样,联合查找数据结构上给出的界限是针对一个非常低效的联合查找结构。使用具有路径压缩和按秩并集的不相交集合森林,您可以获得每次操作的 O(α(n)) 的渐近 运行 时间,其中 α(n) 是一个增长极其缓慢的函数(阿克曼反函数)对于你可以放入宇宙的所有输入基本上是 5。
话虽如此 - DFS 的渐近 运行时间比联合查找方法要好,因此它在实践中可能更快。 DFS 也相对容易实现,所以我建议采用这种方法。
union-find 结构的优势在于它适用于连续添加边的连接问题的增量版本。DFS 不能很好地处理这种情况。