大O和大欧米茄表示法算法

时间:2014-09-13 19:46:28

标签: algorithm sorting big-o

有一种基于比较的排序算法,它运行在O(n * log(sqrt(n)))中。 鉴于存在Omega(n(log(n))下限进行排序,这怎么可能呢?

2 个答案:

答案 0 :(得分:7)

基本上,这个问题要求你证明O(n * log(n))= O(n * log(√n)),这意味着你需要找到一些常量 c > 0使得:O(n * log(n))= O(c * n * log(√n))。记住√n= n ^(1/2)并且log(n ^(1/2))= 1/2 * log(n)。所以,现在我们有O(n * log(n))= O(1/2 * n * log(n))。由于渐近符号忽略常数乘数,我们可以将其重写为O(n * log(n))= O(n * log(n))。瞧,证明这是有可能的。

答案 1 :(得分:0)

对于基于比较的排序算法,您可以绘制决策树。它是表示由算法完成的比较的二叉树,并且该树的每个叶子是来自给定集合的元素的排列。

有n!可能的排列,其中n是集合的大小,并且只有其中一个表示排序集合。通向每片叶子的路径代表了实现叶子所代表的排列所必需的比较。

现在让我们将决策树的高度设为h,将l设为叶子的数量。输入集的每个可能的排列都必须在其中一个叶子中,所以 n! < = l 。高度为h的二叉树可以具有最多2 ^ h个叶子。因此我们得到 n! < = l< = 2 ^ h 。对两边应用对数,因此得到h> = log(n!),log(n!)为Omega(nlog(n))。

因为决策树的高度代表了到达叶子所需的一些比较,这就证明了基于比较的排序算法的下限是nlog(n)。这不能更快地完成。因此,该任务正确的唯一选择是假设Omega(nlog(n)也是Omega(nlog(sqrt(n))。log(sqrt(n))= log(n ^(1/2) )=(1/2)log(n)=> nlog(sqrt(n))= n((1/2)log(n))=(1/2)nlog(n)。忽略const = 1 / 2(因为我们对渐近的复杂性感兴趣)你得到nlog(sqrt(n))= nlog(n)的复杂性。