【发布时间】:2016-01-19 04:42:07
【问题描述】:
最近,我使用回溯解决了一些问题(数独求解器,N 皇后问题)。虽然我可以直观地理解回溯比蛮力更好,但我无法从数学/渐近上推理出来。例如,假设我们正在为 N * N 网格实现数独求解器,其中有 K 个空槽要填充。这里:
- N * N 网格有 NK 个结束状态。
- 在填充每个插槽结束时,我们检查它是否仍然有效,并且此验证需要 O(N) 时间。
[蛮力方法是使用任何 N 个数字填充所有 K 个插槽,然后检查最终状态是否为有效网格。]
总而言之,我们推断它需要 O(NK*NK) = O(KNK+1)
嗯,这对于蛮力算法来说是一个足够公平的界限,但是在回溯算法中,我们在填充过程的更早的时候就删除了很多无效状态。显然,与蛮力实现相比,回溯算法在实践中非常快。我搜索了类似的问题,发现了这个one,但它使用与蛮力相同的界限。我们如何渐近地证明这种回溯算法优于蛮力算法?
编辑: 由于人们投票以“太宽泛”来结束这个问题,因此我重申我正在寻找上述数独求解器的具体案例。 但是,您可以分享您通常用来渐近推断给定回溯问题比蛮力方法更快的任何想法。
【问题讨论】:
-
你可以谈谈应用于数独问题的回溯算法。
-
@SelçukCihan:回溯算法只是用 1 到 9 的数字填充一个空槽,然后尝试继续填充其他空槽,看看是否有效。如果它不起作用,我们会回滚我们所做的条目,并在该空槽中尝试不同的数字并重试。
标签: algorithm time-complexity backtracking