【发布时间】: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