我只能想象两种情况:当2 ^ k接近n时(例如,如果2 ^ k == n),那么所需的步数是n / n或1,所以它有一个运行时O(1)。
但是,如果2 ^ k很小(例如,如果2 ^ k == 1),则需要n步,因此它的运行时间为O(n)。
实质上,如果2 ^ k可以用n来表示,那么所需的步数是一个整数,所以它的运行时间为O(1)。如果2 ^ k不能用n来编写,则它的运行时间为O(n)。
这两种情况都是最坏的情况;对于任何未知的和可能大的n,这些运行时间仍然存在。是否有任何情况下2 ^ k的限定值不能小于n 或接近n?
想象一下,你要写一个(可能很长)的表,其中包含k值的函数的运行时间,使得(n / 2 ^ k)> = 1.当k从0开始并且增加时,运行时间是O(1),但是当k从较大值开始减小时,运行时间为O(n)。是否存在运行时从O(1)切换到O(n)的理论点?
或者我只是没有理解Big-O分析的“主要思想”?
编辑:假定线性搜索
答案 0 :(得分:1)
你错过了关于大O分析的主要想法。总有一种假设(通常没有说明),当你看到无限的东西时,你会看到一个极限。通常,只有一个变量,因此从上下文中可以清楚地看出变量是无穷大的。 (例如,n^2+23n∈O(n^2)
(n
为无穷大)。)
在您的情况下,您有两个变量,n
和k
。因此,为了讨论big-O,你需要量化无穷大的东西(看起来是n
),以及其他变量在此期间做了什么。这确实导致了两种可能性:如果k
不变,n
变为无穷大,则答案为O(n)
;但如果k
使n/2^k
不变(即k=lg(n)-C
),则答案为O(1)
。但还有其他可能性:如果n/2^k=√n
(即k=lg(n)/2
),则答案为O(√n)
。
因此,根据k
n
的增长情况,答案是O(1)
和O(n)
之间的任何内容。
答案 1 :(得分:1)
但是,如果2 ^ k很小(例如,如果2 ^ k == 1),则需要n步,因此它的运行时间为O(n)。 (1)
实质上,如果2 ^ k可以用n来表示,那么所需的步数是一个整数,所以它的运行时间为O(1)。如果2 ^ k不能用n来编写,则它的运行时间为O(n)。(2)
(1)&#39的结论是正确的,但(2)是错误的。
首先,你有2个变量。 n
和k
。 k: 1 <= 2^k <= n
如果n = 128
和k = 4
128/2^4 = 4
步数4
而非1
。
一般来说,如果n
是2
说2^x
的力量,那么步数f(n) =
2 ^ x / 2 ^ k = 2 ^(xk) `
现在n = 2^x
,使用基本对数x = lg(n)
{其中lg(y)
是y&#39;
f(n) = 2^{lg(n)-k}
(1)
如果n不能被2^{lg(n)-k}
整除,则运行时间为2^k
,然后您尝试访问不存在的浮点索引处的数字。
假设您希望我将索引舍入为最接近的整数。索引毕竟只是整数。
现在1为您提供简单的运行时公式。但最糟糕的情况是k = 0
。 SInce Big-Oh使用最坏的情况,我们继续使用它。
f(n) = O(2^{lg(n)-0})
f(n) = O(2^{lg(n)}
这是lg(n)
的反日志,它再次从基本的对数知识中为我们提供n
。
因此f(n) = O(n)
Q.E.D