问题描述
鉴于以下功能,我需要确定Permutations
和Combinations
的算法复杂度。该函数分别计算任意两个给定数字(n,r)
的可能排列和组合的数量。
我认为O(n!)
函数可能是Permutations
,但我想知道它是否更像O(log n!)
,因为在return语句中我将{{1} }由n!
。
(n-r)!
解决方法
这两个功能均为O(n)
。要确定这一点,请考虑对任何不重要的情况(例如Permutations(n,r)
)调用(5,3)
的效果:
自n > r and n != 0
起,程序将在以下位置继续
return int(factorial(n) / factorial(n-r))
基于factorial
的定义,我们可以看到这是一个受n
限制的简单递归。因此我们认为factorial
是O(n)
,从中我们可以证明int(factorial(n) / factorial(n-r))
是O(n + n)
仍然是O(n)
。这是由于执行必须首先在factorial(n)
时间内计算O(n)
,然后在factorial(n-r)
时间内计算O(n-r)
。 Permutations(n,r)
中的其他情况是O(1)
,因此在最坏的情况下,此函数是O(n)
使用类似的推理,可以得出结论:Combinations(n,r)
是O(n + n + n)
,它也是O(n)
。