舞蹈的复杂性

时间:2016-06-09 02:42:54

标签: algorithm time-complexity sudoku

我正在编写一个数独求解器并考虑实现它的算法。我知道回溯的时间复杂度为O(n ^ m)其中n是每个方格的可能性数,m是空白的空格数。但我无法对舞蹈链接进行精确分析。有人可以解释它是什么吗?

1 个答案:

答案 0 :(得分:0)

跳舞链接(算法X)设计我的唐纳德克努特也是更糟糕的情况O(N ^ N ^ 2)有点。实际上它远不如此。

当我写两个数独求解器时,我想到了这一点,一个有一个没有跳舞链接。

如果你引入了前瞻性检查(在你尝试继续深度优先搜索之前检查以确保该号码是有效的游戏(这也称为搜索领域的修剪),那么你可以节省你的算法浪费时间。如果这是你做的唯一改进,那么你仍然可以遇到更糟糕的情况(即第一个数字是最大数字)。

Dancing Links,如果您想要像这样跳舞链接是一个前瞻检查 - 优先队列 - 深度优先搜索。真正的速度来自封面网格这是你不需要重新计算剩下的可能性的方式(如果你正确实现它),这将是你的数独求解器更耗时的过程。此外,您可以设置算法以选择(点,行,列或框),留下最少的可能性以减少分支大小。

以下是一些真正帮助我解决问题的链接:

https://www.ocf.berkeley.edu/~jchu/publicportal/sudoku/0011047.pdf https://www.ocf.berkeley.edu/~jchu/publicportal/sudoku/sudoku.paper.html

这个问题的大O复杂性仍然是O(n * n * n),因为我们仍然从一个点到另一个点,并尝试达到该点的n个值。恰好是Ω(x),其中x是两个实现的空白空间数,但跳舞链接的每步计算时间要少得多。

这看起来像Dancing Links只是一个DFS实现,因为它是。 4乘4的最坏情况是4 * 3 * 2 * 3 * 2 * 2 * 2 * 2 * 2这是由于该列启发式,我们选择具有最少数量的覆盖网格的列防止大规模分支。