【问题标题】:Why is binary search O(log N)? [closed]为什么二分查找 O(log N)? [关闭]
【发布时间】:2017-01-25 20:28:34
【问题描述】:

这是我的想法:

你有 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)/2th 元素时,这是一个步骤?

编辑!!!

这是我所学的:

搜索 1:搜索空间中的 n 个元素

搜索 2:搜索空间中的 n/2 个元素

搜索 3:搜索空间中的 n/4 个元素

... 搜索 i:搜索空间中的 1 个元素。

搜索 i 有 n/(2^[i-1]) 个元素,因此你解决 i 然后你得到

i = log(n) + 1。

我不明白的地方:

你有 n 个元素,我同意,但你没有搜索所有元素,你只搜索 1 个元素,那你为什么要计算所有 n 个元素?

【问题讨论】:

  • 在有序数组中你不需要遍历每个数字,你只需要检查 O(log2 N) 个数字来查找数组中的元素
  • 我不明白你的最后一句话。你能更详细地重新表述/解释它吗?
  • O(.. lg n) 是“在每个循环中将问题分成两半”的操作的基础。在这种情况下,这只是数学表示 - 请注意,在这种情况下 lg 是以 2 为底的对数。二进制搜索(在开始时需要排序序列)作为具体数字的示例非常有效。例如,需要 lg(1000) 或 ~10 个循环/项目读取来搜索 1000 个元素。 10 无穷大而增长,如 O. 所述
  • @user2864740 "lg" 通常也代表以 10 为底的对数,因此可能会造成混淆。但是,对于所有 a 和 b > 1,O(log_a n) = O(log_b n) 并不重要。

标签: algorithm binary-search


【解决方案1】:

二分查找(要求数据结构中的排序数据具有 O(1) 次随机访问读取)是 O(log N) 的主要原因是,对于任何给定的数据集,我们首先查看最中间的数据集元素。

如果它比我们正在寻找的元素大,我们知道我们可以忽略从那个点到最后的任何东西。如果它更小,我们可以忽略从开始到那个元素的任何内容。这意味着,对于每一步,我们都会有效地将剩余部分的大小减半。

通过在每一步将问题集减半,我们可以(相对)容易地看到,从 N 个元素到单个元素需要 O(log N) 步。

我们没有在您的示例中更早终止的原因是,即使我们似乎正在扫描第一个元素,我们实际上所做的唯一事情是“获取数组的长度" 和 "访问最中间的元素"(因此,我们永远不知道我们要查找的元素是否包含在数组中)。

【讨论】:

  • 你好,这对我来说是一个困惑,我们如何看到从 N->1 步是 log(N) 步?从 N 到 N/2 是 1 步,然后 N/2 到 N/4 是 1 ... 那么我们如何计算呢?
  • @garchyguy 日志是反指数。如果你有一个 X 元素大的原始问题,它需要 S 步,并且问题的大小每步减半,那么原始问题一定是 O(2 ** S) 个元素大。因此,如果您有一个 N 个元素大的初始问题,则找到解决方案必须是 O(log N) 步。
猜你喜欢
  • 2013-01-03
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2015-08-28
相关资源
最近更新 更多