函数的运行时查找大小为n的列表的第(n / 2 ^ k)个元素?

时间:2016-12-20 19:04:14

标签: big-o analysis

我只能想象两种情况:当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分析的“主要思想”?

编辑:假定线性搜索

2 个答案:

答案 0 :(得分:1)

你错过了关于大O分析的主要想法。总有一种假设(通常没有说明),当你看到无限的东西时,你会看到一个极限。通常,只有一个变量,因此从上下文中可以清楚地看出变量是无穷大的。 (例如,n^2+23n∈O(n^2)n为无穷大)。)

在您的情况下,您有两个变量,nk。因此,为了讨论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个变量。 nkk: 1 <= 2^k <= n

如果n = 128k = 4 128/2^4 = 4

步数4而非1

一般来说,如果n22^x的力量,那么步数f(n) = 2 ^ x / 2 ^ k = 2 ^(xk) `

现在n = 2^x,使用基本对数x = lg(n) {其中lg(y)是y&#39;

的基数2的日志

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