在排序数组中进行二分查找

Binary Search in a sorted array

我刚开始学习一些基本算法,但是关于二分查找算法的一些东西一直让我感到困惑。

据我了解,二分查找的最大时间复杂度为 O(log(n)),其中 log 以 2 为底。

但是,当对不是 2 的幂的 N 的值使用公式时,您会得到一个非整数值。

我感到困惑的是,如果你最终得到,比如说 3.3,是最多 3 步还是 4 步。

当使用 n = 10 的数组时,您得到值 3.3。话虽如此,我手动计算了步数,结果是 4,所以我假设您四舍五入。

但在我的教科书中,它说 n=10000 的数组最多需要 13 步。当将其放入上面的对数公式中时,我们得到 13.2,这意味着在这种情况下我们向下舍入。

我尝试过使用不同大小的数组进行二分搜索,我遇到了必须向下舍入才能得到教科书答案的实例,以及必须向上舍入的实例。

我不确定什么时候向上或向下舍入,或者我是否完全犯了另一个错误。

如果有人给我举个例子,你能不能用一个大小为100000的数组。因为书上说最多16次,但是当我手动减半100000直到我得到1我得到17次.

提前致谢!

让我们用10的小例子,先学会走路运行。假设数组是 [2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000] 并且我们正在搜索 3000.

  1. 剩下 10 个元素。比较50.往右走
  2. 剩余 5 个元素。比较500,往右走
  3. 剩下 2 个元素。比较1000,往右走
  4. 还有 1 个元素。比较 2000。向右走(或决定“未找到”)。

也就是4次比较。所以是的,你四舍五入,因为你不能免费做一个“部分步骤”,有时你会很幸运并且步骤更少,如在上面的例子中如果你搜索 1 它只需要 3 次比较(50, 5、2) 假设对于偶数长度的组,将索引向左舍入。

最坏情况的公式是floor(log(n) + 1)

换句话说,你加一然后向下取整。参见 https://en.wikipedia.org/wiki/Binary_search_algorithm#Performance

But in my textbook, it says an array where n=10000, takes a max of 13 steps.

你的课本错了。正如您所期望的那样,对包含 10000 个元素的数组进行二分查找最多需要 14 步。

在每一步中,数组大小都会减少 2 倍。 所以步骤是 10000、5000、2500、1250、625、312、156、78、39、19、9、4、2、1。 如您所见,这是 14 个步骤。

Since in the book it says a maximum of 16 times, but when I manually half 100000 until I get 1 I get 17 times

你是对的,书错了。