二分查找与线性查找

437 阅读2分钟

这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

二分查找与线性查找

对于长度太小的有序数组,二分查找并不比线性查找好多少。但我们来看看更大的数组。

对于拥有100个值的数组来说,两种查找需要的最多步数如下所示。

  • 线性查找:100步
  • 二分查找:7步

用线性查找的话,如果要找的值在最后一个格子,或者比最后一格的值还大,那么就得查遍每个格子。有100个格子,就是100步。

二分查找则会在每次猜测后排除掉一半的元素。100个格子,在第一次猜测后,便排除了50个。

再换个角度来看,你就会发现一个规律。

长度为3的有序数组,二分查找所需的最多步数是2。

若长度翻倍,变成7(以奇数为例会方便选择正中间的格子,于是我们把长度翻倍后又增加了一个数),则最多步数会是3。

若再翻倍(并加1),变成15个元素,那么最多步数会是4。

规律就是,每次有序数组长度乘以2,二分查找所需的最多步数只会加1。

这真是出奇地高效。

相反,在3个元素的数组上线性查找,最多要3步,7个元素就最多要7步,100个元素就最多要100步,即元素有多少,最多步数就是多少。数组长度翻倍,线性查找的最多步数就会翻倍,而二分查找则只是增加1步

这种规律可以用下图来展示。

如果数组变得更大,比如说10 000个元素,那么线性查找最多会有10 000步,而二分查找最多只有14步。再增大到1 000 000个元素,则线性查找最多有1 000 000步,二分查找最多只有20步

不过还要记住,有序数组并不是所有操作都比常规数组要快。如你所见,它的插入就相对要慢。衡量起来,虽然插入是慢了一些,但查找却快了许多。还是那句话,你得根据应用场景来判断哪种更合适。