我无法理解如何确定此算法的时间复杂度(用Python编写,但适用于任何语言):
def permutazioni(list):
n = len(list)
if n == 1 or n == 0:
return [list]
else:
risult = []
for i in range(n):
primo = list[i]
listaDegliAltri = list[:i] + list[i + 1:]
perms = permutazioni(listaDegliAltri)
for perm in perms:
risult.append([primo] + perm)
return risult
此过程将序列作为输入,并返回一系列序列,其中包含起始序列的所有可能排列的集合。
示例 :排列([a,b,c])= [[a,b,c],[a,c,b], [b,a,c],[b,c,a],[c,a,b],[c,b,a]]
现在,为了确定复杂性,我必须编写并解决复发方程。 当列表长0或1时,不执行任何操作。 否则,你运行一个 n 次迭代的循环,其中每个迭代函数在列表上调用,其中一个元素短于( n-1 )然后你运行一个内部长 n-1 。
教授然后写道:
T(0)= T(1)= 1 (1为什么?是退货还是其他费用?)
T(n)= n *(T(n-1)+(n-1)) n> 1
然后他说选择下边界然后写(以后我什么都不懂):
T(n)> N * T(N-1)
从中:
T(n)> n T(n-1)> n (n-1) T(n-2)> Ñ(N-1)*(N-2)* T(N-3)> ...> N!
那是:
T(n)=Ω(n!)
我不明白,因为它已经消除了(n-1),因为它放了主要而不是等号。所以我什么都不懂。 有人向我解释会知道吗? 谢谢
答案 0 :(得分:0)
你的教授应该写T(0)= T(1)= Theta(1)意味着这些情况需要恒定的时间,但是只需要像1这样的固定常数就不会改变渐近线。至于其余的,如果你相信
T(n) = n*(T(n-1) + Theta(n-1))
(我再次强调大Theta强调在计算操作时可能存在隐藏的常数乘数),然后你明显得到那个
T(n) > n*T(n-1)
因为你减去了正数术语Theta(n-1)。其余部分遵循阶乘的定义。
答案 1 :(得分:0)
这只是一个很容易出错但非常基本的代数。
M(1)和M(0)为1的原因是因为如果你有一个包含1或0个元素的列表,那么列表本身就是它唯一的排列。例如,{1}
只有一个排列,{}
也是如此。所以1本身与完成的工作无关,但实际上只有一个排列。但你也可以简单地归还它,所以你可以这样想。
现在为更有趣/无聊的部分。
如果您接受
T(0)= T(1)= 1
T(n)= n *(T(n-1)+(n-1))n> 1
其余的是乏味的代数。所以说T(n-1)= T(k)。所以
T(n)= n *((k *(T(k-1)+(k-1)))+(n-1))
T(n)= n *(((n-1)*(T(n-1-1)+(n-1-1)))+(n-1))
T(n)= n *((k *(T(n-2)+(n-2)))+(n-1))
T(n)= n ^ 3 + n ^ 2 * T(n-2) - 2n ^ 2-n * T(n-2)+ n :这只是代数展开
如果用T(k)替换 T(n-2)然后T(n-3),你会看到阶乘模式出现,即 n! = n *(n-1)!