首先,我看到在堆栈溢出时有与此类似的问题,但是我无法真正理解/遵循这些问题的复杂性分析。
我正在发布有关如何处理时间复杂度的问题的思考过程,该问题是如何从整数列表生成所有可能的排列的问题。
基本上,假设我要从整数列表中生成所有可能的排列。我有一个类似下面的递归解决方案,这是解决我认为的这个问题的通用方法。
public void subPermute( List<List<Integer>> permutationLists, int start, int[] nums ) {
//base
if ( start == nums.length ) {
final List<Integer> permutation = new ArrayList<Integer>();
for ( int num: nums ) {
permutation.add( num );
}
permutationLists.add( permutation );
}
for ( int i = start ; i < nums.length ; i ++ ) {
swap( nums, start, i );
subPermute( permutationLists, start + 1, nums );
swap( nums, start, i );
}
}
对于上述一般方法的时间复杂性,我听到了各种各样的答案。我相信以上的递归公式应该是T(n) = nT(n-1) + O(n)
,其中O(n)
来自for
循环中的交换。
我试图通过绘制一个递归树来解决这个问题,其中将有n!
个叶节点,每个叶节点都有n
个操作。我认为树的深度为n
。
你们同意递归方程吗?如果您同意,递归方程的时间复杂度是多少?我不确定如何进一步进行递归树分析,或者根本不正确。
我们将不胜感激!谢谢!