这种寻找排列的回溯算法的时间复杂度是多少?

Posted

技术标签:

【中文标题】这种寻找排列的回溯算法的时间复杂度是多少?【英文标题】:What would be the time complexity of this backtracking algorithm for finding permutations? 【发布时间】:2022-01-21 05:41:13 【问题描述】:

我正在尝试确定我创建的该算法的时间和空间复杂度,以在 Python 中查找数组的所有排列。时间复杂度是否为 O(sum_k=1^N P(n,k)) 其中 P(n,k) 是具有 k 个因子的置换?

class Solution:
    def permute(self, vals):
        answer = [vals]
        def backtrack(i, curr_arr):
            if i >= len(vals):
                return
            curr_val = curr_arr[i]
            for j in range(i + 1, len(vals)):
                permutation = curr_arr.copy()
                temp_val = curr_arr[j]
                permutation[j] = curr_val
                permutation[i] = temp_val
                answer.append(permutation)
                backtrack(i + 1, permutation)
            backtrack(i + 1, curr_arr)
        backtrack(0, vals)
        return answer

【问题讨论】:

这有帮助吗? ***.com/questions/70297163/… 【参考方案1】:

如果给定输入的大小为 ?,则有 n!它的排列。这意味着append 将被执行?!-1 次(不包括= [vals] 的初始化)。所以curr_arr.copy() 被执行了很多次。由于它的单次执行具有 O(?) 时间复杂度,因此执行它们的时间复杂度是 O(?.?!)。所有其他指令都具有(摊销的)恒定时间复杂度,因此这代表了整体时间复杂度。

对于空间复杂度,我们必须计算递归的深度,即 O(?)。我们还应该计算答案的内存,它是一个排列的大小乘以排列的数量,所以 O(?.?!)。因此,与此相比,用于递归的空间可以忽略不计。

结论:时间和空间复杂度都是O(?.?!)

【讨论】:

时间实际上低于n * n!。但是 (1) big-O 无论如何都是一个上限,并且 (2) 这个估计的价值在于它的简单性。

以上是关于这种寻找排列的回溯算法的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

算法模板-回溯

算法模板-回溯

暴力穷举和回溯法(八皇后问题)

leetcode12 矩阵中的路径 回溯算法

leetcode12 矩阵中的路径 回溯算法

求教C语言回溯法写出八皇后问题的92种解