【问题标题】:Time complexity of generating all possible permutations using backtracking (comparison of 2 solutions)使用回溯生成所有可能排列的时间复杂度(两种解决方案的比较)
【发布时间】:2022-01-14 17:05:39
【问题描述】:

方法一:

https://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/ 在这里,我们可以看到递归方程是 T(N) = N * T(N-1) + c 所以最终的时间复杂度是 = O(N!),这是有道理的.

方法二:

这段代码和方法 1 的区别在于我们每次都在做一些浪费的工作(当 selected[i] 为真时,我们继续而不是向下移动递归树)。 我认为,这里的递归关系应该是 T(N) = N * T(N-1) + N * c,因为我们可以将 for 循环分为两部分:我们在每次迭代中做持续工作的部分 (N * c ) 和一个我们进行递归调用的地方 (N * T(N-1))。然后对于 T(N-1) = (N-1) * T(N-2) + N*c (请注意,我们仍然在这里支付 N * c 成本)等等。最后,我们将剩下一个 N^N 项,对于大 N,它将占主导地位 O(N!)。这是否意味着第二个代码 sn-p 的时间复杂度为 O(N^N) 并且不是 O(N!)?

关系问题: 对于 N 个皇后问题,我们有一个回溯解决方案(可以参考 https://dev.to/chengmuy/optimizing-an-n-queens-solution-3m1m),但是在这里,我们有一个 for 循环来检查当前状态是否安全(在 O(1) 平均时间内)并相应地进行递归调用。除非我错了,否则这个回溯解决方案的时间复杂度也是 O(N!)。但是,我很困惑我们如何考虑在 O(N!) 中提前终止分支的成本,即基本上必须检查当前列的所有行(或当前行的列,取决于实现)的成本,这是安全的每次。

【问题讨论】:

    标签: algorithm time-complexity permutation backtracking n-queens


    【解决方案1】:

    在这两种算法中,对于{1, …, n} 排列的每个前缀,都输入一次递归函数。在第一个算法中,我们可以想象for 循环的每次迭代所做的工作都在递归调用中进行了说明,因为每次迭代都会有一个递归调用。所以总工作量与可能的前缀数量成正比。由于它们不是正确的前缀,因此包括所有排列;所以有n多条!前缀。事实上,长度为 n-1 的前缀的数量也是 n!,所以有超过 2(n!) 个前缀,但剩余的词项下降得很快。事实证明,存在渐近的 e(n!) 前缀,其中 e 是欧拉常数,大约为 2.71828。所以这是 O(n!),因为我们可以忽略常数因素。

    那么第二个算法呢?我们有相同数量的递归调用,但是每个不对应于完整排列的递归调用都需要扫描 chosen 数组,该数组有 n 个元素。这增加了 n × (e - 1) × n!。实际上,它将渐近线更改为 O((n+1)!),大于 O(n!)。但不如 O(nn)。

    【讨论】:

    • 有趣。你有关于渐近 eN 的来源吗! N! 上的可能前缀排列?我可以看到它是正确的,我只是不明白为什么。这将证明这是一个最优算法。
    • @inordirection:n个对象的所有排列的k-前缀个数是n!/(n-k)!,所以任意大小的前缀总数是n!乘以从 0 到 n 的逆阶乘之和。众所周知,逆阶乘之和的极限是e,不是吗?您可以通过 exp(x) 的泰勒展开式证明这一点。
    • 前缀计数对我来说非常方便,尽管它似乎没有被广泛使用。或者可能只是我在算法分析方面没有受过太多正规教育;也许它实际上很常见。比我了解更多数学的人似乎有很多其他有用的工具,但这个工具很好地满足了我的需求:-) 无论如何,我没有引用。对不起。 (Heap 算法的交换次数是前者的一半。它并不是渐近地更快,但通常被认为更快。)
    • 是的,这很有道理,谢谢!对所有 k 前缀求和确实很简单,但困难的部分是考虑这样做!
    • 几周前我实际上被困在这个确切的问题上(计算前缀,但 n C k 而不是 n!),我认为这会有所帮助。
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2018-11-12
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多