这种寻找排列的回溯算法的时间复杂度是多少?
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) 这个估计的价值在于它的简单性。以上是关于这种寻找排列的回溯算法的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章