本问题源于《算法设计分析》,仔细并分析了全排列问题时间复杂度计算。并为未来设计更好的算法,观测其时间复杂度打下良好的基础。
问题来源
给定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),n≤1nT(n−1)+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(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!≤T(n)≤cnn!