生成排列的算法的复杂性

时间:2015-04-07 16:57:56

标签: algorithm time-complexity permutation

我无法理解如何确定此算法的时间复杂度(用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),因为它放了主要而不是等号。所以我什么都不懂。 有人向我解释会知道吗? 谢谢

2 个答案:

答案 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)!