如何计算二进制search的复杂性

我听到有人说,由于二进制search所需的input减半,所以它是log(n)algorithm。 由于我不是来自math背景,我不能与之相关。 有人可以更详细地解释一下吗? 它是否必须对对数级数做些什么?

在这里看到一个更加math的方式,虽然不是很复杂。 海事组织作为非正式组织更清晰:

问题是,你可以用N除以2,直到你有1? 这实际上是说,做一个二分search(一半的元素),直到你find它。 在一个公式中,这将是:

1 = N / 2 ×

乘以2 x

2 x = N

现在做日志2

log 2 (2 x )= log 2 N
x * log 2 (2)= log 2 N
x * 1 = log 2 N

这意味着您可以将日志分为N次,直到您将所有内容分开为止。 这意味着你必须除以log N(“执行二进制search步骤”)直到find你的元素。

对于二进制search,T(N)= T(N / 2)+ O(1)//recursion关系

T(N)= aT(N / b)+ f(N)运用复杂关系的运算时间复杂度

这里,a = 1,b = 2 => log(base b)= 1

在这里f(N)= n ^ c log ^ k(n)// k = 0&c = log(a base b)

所以,T(N)= O(N ^ c log ^(k + 1)N)= O(log(N))

来源: http : //en.wikipedia.org/wiki/Master_theorem

它没有一半的search时间,这不会logging(n)。 它以对数forms降低。 对此稍加思考。 如果您在一个表中有128个条目,并且必须线性search您的价值,那么平均可能需要大约64个条目才能find您的价值。 这是n / 2或线性时间。 使用二分查找,每次迭代可以消除1/2个可能的条目,因此最多只需要7个比较就可以find您的值(128的基数2为7或2,7的幂为128)。二进制search的力量。

T(N)= T(N / 2)+1

T(n / 2)= T(n / 4)+ 1 + 1

把(n / 2)的值放在上面,这样T(n)= T(n / 4)+ 1 + 1。 。 。 。 T(N / 2 ^ k)的+ 1 + 1 + 1 ….. + 1

= T(2 ^ k / 2 ^ k)+ 1 + 1 …. + 1直到k

= T(1)+ K

正如我们采取2 ^ k = n

K = log n

所以时间复杂度是O(log n)

二进制searchalgorithm的时间复杂度属于O(log n)类。 这被称为大O符号 。 你应该理解的方式是给定一个大小为n的input集的函数执行所花费的时间的渐近增长不会超过log n

这只是正式的math术语,以便能够certificate陈述等。它有一个非常简单的解释。 当n变得非常大时,log n函数将增加执行该函数所需的时间。 “input集”的大小n只是列表的长度。

简而言之,二进制search在O(log n)中的原因是它在每次迭代中将input集合减半。 在相反的情况下考虑这一点更容易。 在x次迭代中,二进制searchalgorithm可以在多长时间内检查最大值? 答案是2 ^ x。 由此我们可以看出,相反,平均来说,二分searchalgorithm需要对长度为n的列表进行log2n次迭代。

如果为什么它是O(log n)而不是O(log2 n),那是因为简单地再放一次 – 使用大O符号常量不计算。

这里是维基百科条目

如果你看看简单的迭代方法。 你只是消除了一半要search的元素,直到find你需要的元素。

以下是我们如何提出公式的解释。

说起初你有N个元素,那么你做的第一个尝试就是N / 2。 其中N是下界和上界的和。 N的第一次值将等于(L + H),其中L是第一个索引(0),H是您正在search的列表的最后一个索引。 如果你很幸运,你试图find的元素将在中间[例如。 您正在search列表{16,17,18,19,20}中的18,则计算⌊(0 + 4)/2⌋= 2,其中0是下限(L是数组第一个元素的索引) 4是上限(数组的最后一个元素的H – 索引)。 在上述情况下,L = 0和H = 4。现在2是您正在search的元素18的索引。 答对了! 你find了

如果情况是不同的arrays{15,16,17,18,19},但你仍然在寻找18,那么你不会是幸运的,你会做第一个N / 2(这是⌊(0 + 4)/ 2⌋= 2,然后在索引2处实现元素17不是您要查找的数字现在您知道在下次尝试search迭代方式时,您不必查找至less一半的数组。因此,基本上,您不要search以前search到的元素列表的一半,每次尝试查找在之前的尝试中找不到的元素。

所以最坏的情况是

[N] / 2 + [(N / 2)] / 2 + [((N / 2)/ 2)] / 2 …..
即:
N / 2 1 + N / 2 2 + N / 2 3 + ….. + N / 2 x

直到…你已经完成search,你试图find的元素在列表的末尾。

这表明最坏的情况是当你达到N / 2 × ,其中X是2 × = N

在其他情况下N / 2 x其中x是2 x <N x的最小值可以是1,这是最好的情况。

现在math上最糟糕的情况是什么时候的价值
2 x = N
=> log 2 (2 x )= log 2 (N)
=> x * log 2 (2)= log 2 (N)
=> x * 1 = log 2 (N)
=>更正式的logging2 (N)+1⌋

Log2(n)是在二进制search中查找某些内容所需的最大search次数。 平均情况涉及log2(n)-1search。 以下是更多信息:

http://en.wikipedia.org/wiki/Binary_search#Performance

由于我们每次减less了一半的列表,所以我们只需要知道我们得到1的步骤,因为我们继续分两个列表。 在给定的计算中,x表示我们划分列表直到得到一个元素的时间数(在最差情况下)。

1 = N / 2x

2x = N

以log2

log2(2x)= log2(N)

x * log2(2)= log2(N)

x = log2(N)

二进制search通过将问题重复分成两半来工作,如下所示(详细内容省略):

在[4,1,3,8,5]中查找3的示例

  1. 订购您的物品清单[1,3,4,5,8]
  2. 看中间的项目(4),
    • 如果这是你正在寻找的,停止
    • 如果更大,请看上半场
    • 如果less了,看下半场
  3. 用新列表[1,3]重复步骤2,find3并停止

当你把问题分成部分时,这是一个二元search。

search只需要log2(n)步骤来find正确的值。

如果你想了解algorithm的复杂性,我会推荐algorithm介绍 。