解决递归全排列问题时间复杂度计算

本问题源于《算法设计分析》,仔细并分析了全排列问题时间复杂度计算。并为未来设计更好的算法,观测其时间复杂度打下良好的基础。

问题来源

给定n个互不相同的元素,求它们的全排列.

递归算法描述

def all_Permutation(array, start):
	if start == len(array):
		print(array)
		return 
	for i in range(start, len(array)):
		array[start],array[i] = array[i],array[start]
		all_Permutation(array,start+1)
		array[start],array[i] = array[i],array[start]

递归算法时间复杂度计算

  • 参数array存储n个不同元素,参数start指定待排列元素的首元素位置。
  • n-start为问题的规模,初始时,start=0,问题的规模为n,接下来规模依次递减1

根据all_Permutation(array,start+1)建立时间递推关系,设T(n)表示规模为n的耗时,则规模为n-1的耗时为T(n-1),进入递归之前需要交换两个元素,递归回来之后又需要交换两个元素,耗时为常数O(1),递归和交换元素需要做n-start次,初始start=0,故循环n次。该语句的递推式为:T(n)=n(T(n-1)+O(1))。

T ( n ) = { O ( 1 ) , n ≤ 1 n T ( n − 1 ) + O ( 1 ) , n > 1 T(n)=\left\{ \begin{array}{lcl} O(1),n\le1\\ nT(n-1)+O(1),n\gt1\\ \end{array} \right. T(n)={O(1),n1nT(n1)+O(1),n>1

采用迭代法递推:
T ( n ) = n T ( n − 1 ) + n c          = n ( n − 1 ) T ( n − 2 ) + n ( n − 1 ) c + n c             = . . . = n ! T ( 1 ) + n ( n − 1 ) . . . 2 c + . . . + n c                            = c ( n + n ( n − 1 ) + n ( n − 1 ) ( n − 2 ) + . . . + n ! ) c n ! ≤ T ( n ) ≤ c n n ! T(n)=nT(n-1)+nc\\ \ \ \ \ \ \ \ \ =n(n-1)T(n-2)+n(n-1)c+nc\\ \ \ \ \ \ \ \ \ \ \ \ =...=n!T(1)+n(n-1)...2c+...+nc\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =c(n+n(n-1)+n(n-1)(n-2)+...+n!)cn!\\ \le{T(n)}\le{cnn!} T(n)=nT(n1)+nc        =n(n1)T(n2)+n(n1)c+nc           =...=n!T(1)+n(n1)...2c+...+nc                          =c(n+n(n1)+n(n1)(n2)+...+n!)cn!T(n)cnn!

因此结果时间复杂度为 Ω \Omega Ω(n!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值