以下是我的想法:
您首先要有N
个元素。
但你不是经历过每一个人吗?
说我有
{1, 2, 3, 4, 5, 6, 7, 8, 9}
我希望找到4
。
第一步是查看5
,我们看到4 < arr[5]
。然后,我们有
{1, 2, 3, 4, 5}
,中间是3
,我们看到4 > arr[2]
,因此我们留下了{3, 4, 5}
。
现在我们将获得4
。
但那只是3步!我不明白为什么第一次搜索需要N
元素,当我们查看(N-1)/2
元素时,这是一步?
以下是我所教的内容:
在搜索空间中搜索1:n个元素
搜索2:搜索空间中的n / 2个元素
搜索3:搜索空间中的n / 4个元素
... 搜索i:搜索空间中的1个元素。
搜索我有n /(2 ^ [i-1])个元素,因此你解决了我然后你得到了
i = log(n)+ 1。
我不明白的事情:
你有n个元素,我同意,但是你没有搜索所有这些元素,你只搜索1个元素,那你为什么要算所有n?
答案 0 :(得分:4)
二进制搜索(需要在具有O(1)随机访问读取的数据结构中的排序数据)的主要原因是O(log N)是对于任何给定数据集,我们首先查看最中间的元件。
如果它比我们正在寻找的元素大,我们知道我们可以忽略从那一点到结尾的任何事情。如果它更小,我们可以忽略从头到尾的任何东西。这意味着,对于每一步,我们都会有效地将剩余的一半缩小。
通过在每一步中将问题设置为一半,我们可以(相对)轻松地看到从N个元素到单个元素是O(log N)步骤。
我们之前没有在你的例子中终止的原因是,即使看起来好像我们正在扫描第一个元素,我们实际做的唯一事情就是“得到数组的长度“和”访问最中间的元素“(所以,我们永远不知道我们正在寻找的元素是否包含在数组中)。