对于运行时间为(cn)的函数!其中c是系数> = 0且c!= n,游程的紧密边界是Θ(n!)还是Θ((cn)!)?现在,我相信它将是Θ((cn)!),因为自cn!= n以来,它们的差值> = n。
谢谢!
编辑:一个更具体的示例来阐明我的要求:
(7n)!,(5n / 16)!和n!全部都是Θ(n!)?
答案 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=4
和O(n^a)
之间存在很大的 实用 差异。但是,如果它类似于O(2^(n^a))
,则a
与a>1
的精确度没有太大区别。这是因为2^n
的增长速度足够快,几乎不管n
,对于几乎任何现实的a
来说都是不切实际的。因此,实际上,将所有这些算法放入一个“指数算法”存储桶中通常是足够好的近似值,并且说尽管它们之间存在巨大差异,但它们都是不切实际的。这是一些数学上非常规的符号,例如2^O(n)
的来源。
从最后一个实际角度出发,Θ(n!)
和Θ((7n)!)
之间的差异也很小:两者都是不切实际的,因为它们甚至都超出了2^O(n)
的指数桶(请参阅{{3 }},表明n!
的增长速度比(n/e)^n
快)。因此,将所有这些算法放入另一个“阶乘复杂性”类别并将它们标记为不切实际也是有意义的。