大因式乘以系数

时间:2019-01-25 19:34:55

标签: algorithm time-complexity big-o complexity-theory

对于运行时间为(cn)的函数!其中c是系数> = 0且c!= n,游程的紧密边界是Θ(n!)还是Θ((cn)!)?现在,我相信它将是Θ((cn)!),因为自cn!= n以来,它们的差值> = n。

谢谢!

编辑:一个更具体的示例来阐明我的要求:

(7n)!,(5n / 16)!和n!全部都是Θ(n!)?

2 个答案:

答案 0 :(得分:1)

如果c> 1,则可以使用Stirling's approximation来获得(cn)!渐近地大于pow(c,n)* n !,因为商不同,它不是O(n!)。作为更基本的方法,请考虑以下示例,其中c = 2:(2n)!=(2n)(2n-1)...(n + 1)n!> n!n!和(n!n!)/ n!= n!发散,所以(2n)!不是O(n!)。

答案 1 :(得分:0)

  

(7n)!,(5n / 16)!和n!全部都是Θ(n!)?

我认为您的问题有两个答案。

从纯粹的理论角度来看,较短的一个。在这3个中,仅n!属于Θ(n!)类。第二个位于O(n!)(请注意,用big-O代替big-Theta),而(7n)!Θ(n!)慢,它位于Θ((7n)!)

还有一个更长但更实际的答案。为了实现这一目标,我们首先需要首先了解整个big-O和big-Theta业务有什么大不了的事情?

问题是对于许多实际任务而言,有很多算法,但并非所有算法都具有同等甚至相似的效率。所以实际的问题是:我们能以某种易于理解和比较的方式捕获性能差异吗?这就是big-O / big-Theta试图解决的问题。该方法背后的思想是,如果我们在某个算法中使用具有复杂的实数公式的精确时间,则只有一个项的增长速度快于所有其他项,因此随着问题变大,它将占主导地位。因此,让我们将此大公式压缩为该主导术语。然后,我们可以比较这些术语,如果它们不同,我们可以轻松地说出哪种算法更好(7*n^2明显好于2*n^3)。

另一个想法是,“操作”一词通常在人们通常认为的算法级别上定义不明确。哪一个“操作”实际上映射到一条CPU指令,哪一个“映射”取决于许多因素,例如特定的硬件。指令本身也可能花费不同的时间来执行。此外,有时算法的工作时间由内存访问而不是CPU指令控制,并且这些组件不容易累加。这个故事的士气是,如果两种算法仅在标量系数上不同,那么您就无法真正从理论上比较这些算法。您需要比较某些特定环境中的一些实现。这就是为什么算法复杂度度量通常可以归结为类似O(n^k),其中k是常数的原因。

还有更多考虑因素:实用性。如果算法是多项式,则a=3中的案例a=4O(n^a)之间存在很大的 实用 差异。但是,如果它类似于O(2^(n^a)),则aa>1的精确度没有太大区别。这是因为2^n的增长速度足够快,几乎不管n,对于几乎任何现实的a来说都是不切实际的。因此,实际上,将所有这些算法放入一个“指数算法”存储桶中通常是足够好的近似值,并且说尽管它们之间存在巨大差异,但它们都是不切实际的。这是一些数学上非常规的符号,例如2^O(n)的来源。

从最后一个实际角度出发,Θ(n!)Θ((7n)!)之间的差异也很小:两者都是不切实际的,因为它们甚至都超出了2^O(n)的指数桶(请参阅{{3 }},表明n!的增长速度比(n/e)^n快)。因此,将所有这些算法放入另一个“阶乘复杂性”类别并将它们标记为不切实际也是有意义的。