如何计算这些置换和组合算法的时间复杂度?

问题描述

鉴于以下功能,我需要确定PermutationsCombinations的算法复杂度。该函数分别计算任意两个给定数字(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限制的简单递归。因此我们认为factorialO(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)