如何获得回溯算法的更严格的界限?

时间:2016-01-19 04:42:08

标签: algorithm time-complexity backtracking

最近,我使用回溯(Sudoku solver,N Queens问题)解决了一些问题。虽然我可以直观地理解回溯比蛮力更好,但我无法用数学/渐近推理出来。例如,假设我们正在为N * N网格实现数独求解器,其中有K个空槽要填充。这里:

  1. N * N网格有N K 结束状态。
  2. 在填写每个插槽的最后,我们检查它是否仍然有效,并且此验证需要O(N)时间。
  3. [蛮力方法是使用任何N个数字填写所有K个插槽,然后检查最终状态是否为有效网格。]

    总之,我们认为需要O(N K * NK)= O(KN K + 1

    嗯,这对于强力算法来说是一个公平的界限,但是在回溯算法中,我们在填充过程中更早地删除了很多无效状态。显然,与强力实施相比,回溯算法在实践中非常快。我搜索了类似的问题并找到了这个one,但它使用了与蛮力相同的界限。我们如何渐近地证明这种回溯算法比蛮力算法更好?

    编辑: 由于人们投票将这个问题关闭为“太宽泛”,我正在迭代我正在寻找上述数独求解器的特定情况。 但是,您可以分享您通常使用的任何想法,以渐进地推断出给定的回溯问题比蛮力方法更快。

1 个答案:

答案 0 :(得分:1)

渐近地,回溯通常与蛮力相同。

这样做的原因是,在最糟糕的情况下,你很难在实践中看到优化。对于数独你可能会争辩说,在最坏的情况下(空板)你的表现将是O(N!* N-1!* N-2!...)(因为你不会尝试明显错误选项)。然而,这远远不是一般的情况,很可能很多地方只有一个合格的价值,你只需要在几个空位(少于空位数)中尝试几个合格的价值。因此,对于一个20 * 20的拼图,你只有10个插槽,其中3个符合条件的值,你的表现看起来更像是3 ^ 10而不是20!* 19!* 18!...这里没有保证,但是在实践中,对于大多数情况来说它更快。

这类似于其他算法,其中最糟糕的情况可能非常糟糕,但平均值非常好。例如,QSort是O(N ^ 2),因为您总是可以选择最差的枢轴。然而,这种情况不太可能,因此平均值表现更像是NlogN。

相关问题