Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 当函数中有一个ceil时,如何找到渐近复杂性?(2^2^ceil(log2(n))=O(2^n)?_Algorithm_Asymptotic Complexity - Fatal编程技术网

Algorithm 当函数中有一个ceil时,如何找到渐近复杂性?(2^2^ceil(log2(n))=O(2^n)?

Algorithm 当函数中有一个ceil时,如何找到渐近复杂性?(2^2^ceil(log2(n))=O(2^n)?,algorithm,asymptotic-complexity,Algorithm,Asymptotic Complexity,我运行了一个程序来找出n+1和2**ceil(log2(n+1))之间的差异,其中n是2的幂。它一直呈指数增长 所以从Big-O的定义来看,不存在常数c'- 2^(2^ceil(log2(n))) <= c' * 2^n 上述说法正确吗?如果是,那么我如何证明它呢?我们需要证明,对于每个常数c,都存在n,使得2^(2^ceil(log2(n))>c*2^n。让我们考虑n=2 ^ k+ 1,对于某个整数k>1;这是我们的权利,因为我们并不试图证明所有n。期望的不等式变成 2^(2^ceil

我运行了一个程序来找出n+1和2**ceil(log2(n+1))之间的差异,其中n是2的幂。它一直呈指数增长

所以从Big-O的定义来看,不存在常数c'-

2^(2^ceil(log2(n))) <= c' * 2^n

上述说法正确吗?如果是,那么我如何证明它呢?

我们需要证明,对于每个常数c,都存在n,使得2^(2^ceil(log2(n))>c*2^n。让我们考虑n=2 ^ k+ 1,对于某个整数k>1;这是我们的权利,因为我们并不试图证明所有n。期望的不等式变成

2^(2^ceil(log2(2^k + 1))) >? c * 2^(2^k + 1).
我们简化左手边

ceil(log2(2^k + 1)) = k + 1
2^(2^ceil(log2(2^k + 1))) = 2^(2^(k + 1)).
理想的不等式是

2^(2^(k + 1)) >? c * 2^(2^k + 1).
这种不平等相当于

2^(2^(k + 1) - 2^k - 1) = 2^(2^k - 1) >? c.
2^k - 1 >? log2(c)
2^k >? log2(c) + 1
k >? log2(log2(c) + 1).

k(因此n)的选择现在是显而易见的;向后遍历不等式以显示所需的不等式,因此函数不是O(2^n)。

我们需要证明,对于每个常数c,存在n,使得2^(2^ceil(log2(n))>c*2^n。让我们考虑n=2 ^ k+ 1,对于某个整数k>1;这是我们的权利,因为我们并不试图证明所有n。期望的不等式变成

2^(2^ceil(log2(2^k + 1))) >? c * 2^(2^k + 1).
我们简化左手边

ceil(log2(2^k + 1)) = k + 1
2^(2^ceil(log2(2^k + 1))) = 2^(2^(k + 1)).
理想的不等式是

2^(2^(k + 1)) >? c * 2^(2^k + 1).
这种不平等相当于

2^(2^(k + 1) - 2^k - 1) = 2^(2^k - 1) >? c.
2^k - 1 >? log2(c)
2^k >? log2(c) + 1
k >? log2(log2(c) + 1).

k(因此n)的选择现在是显而易见的;向后通过不等式来显示所需的不等式,因此函数不是O(2^n)。

2^(2^ceil(log2(n))<2^(2^(log2(n)+1))=2^(2n)

2^(2^ceil(log2(n))<2^(2^(log2(n)+1))=2^(2n)

从您显示的代码(
fn=f1 n-f2 n
)可以说这是一个O(1)操作(
fn=f1 n-f2 n
)我想说这是一个O(1)操作。我只是想说,应该强调选择
2^k+1
的重要性。这是处理
ceil
的一个很好的方法,因为它迫使它总是四舍五入。这对于进一步的分析至关重要。我犯了一个错误,认为您禁止绑定
2^(2^ceil(log2(n))
by
2^(2^log2(n))
2^(log2(n)+1))
。对于
ceil
无法取整的情况,它与
O(2^n)
相同,通过仔细选择
n
并消除
2^ceil(log2(n))=n的情况,您可以排除“乐观情况”,它总是
2n
,这使得
2^f(n)
有所不同。为了清楚起见,对于
ceil
四舍五入的情况,它的行为类似于
2^(2n)
O(2^n)
。顺便问一下,你能证明这是非整数
k
,因此
ceil(log2(2^k+1))=k+1
假设不明确?我发现有趣的是,你可以为函数选择特定的值,它的渐近行为不同。我注意到有一个缺点,你有点违反了OP提出的约束,即“n是2的幂”你说“它是2加1的幂”,这对于一般分析很好,但对于特定的情况,它似乎有很大的变化。我只是想说,应该强调选择
2^k+1
的重要性。这是处理
ceil
的一个很好的方法,因为它迫使它总是四舍五入。这对于进一步的分析非常重要。我在中犯了一个错误,认为您通过
2^(2^log2(n))
2^(2^(n)+1)绑定
2^(2^ceil(log2(n))
。对于
ceil(log2(n))
无法取整的情况,它与
O(2^n)
相同,通过仔细选择
n
并消除
2^ceil(log2(n))=n
的情况,可以排除“乐观情况”,它总是
2n
,这使得
2^f(n)
有所不同。为清楚起见,对于
ceil
四舍五入的情况,它的行为类似于
2^(2n)
O(2^n)
O(2^(2n))
。顺便问一下,您能否证明非整数
k
,因此
ceil(log2(2^k+1))=k+1
假设不明确?我发现有趣的是,你可以为函数选择特定的值,它的渐近行为是不同的。我注意到有一个缺点,你有点违反了OP提出的约束,即“n是2的幂”,你说“它是2加1的幂”,这对于一般分析来说是很好的,但对于特殊情况,它似乎改变了很多。