线性和二分搜索算法解释

搜索某些数据的能力是计算机科学的一个重要方面。搜索算法用于在数据集中查找特定项目。

算法将布尔结果(真或假)返回给搜索查询。也可以修改它们以给出找到值的相对位置。

对于本文,算法将专注于确定值是否存在。

线性搜索算法

线性搜索也称为顺序搜索。在这种类型的搜索中,在检查所需值是否存在的同时,以有序的方式逐个访问列表中的每个值。

该算法逐个值检查值,直到找到您要查找的值或用完要搜索的值。当它用完要搜索的值时,这意味着列表中不存在您的搜索查询。

顺序搜索算法采用值列表和列表中的所需项目作为其参数。返回结果初始化为False,并在找到所需值时更改为True

以下面的 Python 实现为例:

def linearSearch(mylist, item):

发现 = 错误

指数 = 0

而索引 < len(mylist) 并没有找到:

如果 mylist[index] == 项目:

发现 = 真

别的:

指数=指数+1

返回找到

算法分析

当所需的项目是列表中的第一个时,会出现最好的情况。最坏的情况发生在所需的项目是列表中的最后一个(第 n 个项目)时。因此,线性搜索的时间复杂度为 O(n)。

上述算法中的平均情况是 n/2。

相关:什么是大 O 表示法?

重要的是要知道所使用的算法假定向它提供了一个随机的项目列表。也就是说,列表项没有特定的顺序。

假设项目按特定顺序排列,例如从最小到最大。有可能在计算方面取得一些优势。

以在给定列表中查找 19 为例:[2, 5, 6, 11, 15, 18, 23, 27, 34]。达到 23 后,很明显列表中不存在正在查找的项目。因此,继续搜索其余的列表项将不再重要。

二分搜索算法

您已经看到有序列表如何减少所需的计算。二分搜索算法甚至更多地利用了有序列表引入的这种效率。

该算法首先取一个有序列表的中间值并检查它是否是所需的值。如果不是,则检查该值是否小于或大于所需值。

如果较少,则无需检查列表的下半部分。否则,如果它更大,则它移动到列表的上半部分。

相关:什么是递归以及如何使用它?

无论选择哪个子列表(左或右),中间值都将再次确定。再次检查该值是否为所需值。如果不是,则检查它是否小于或大于请求的值。

重复此过程,直到找到值(如果存在)。

下面的 Python 实现是针对二进制搜索算法的。

def binarySearch(mylist, item):

低 = 0

高 = len(mylist) – 1

发现 = 错误

而低 <= 高且未找到:

中 =(低 + 高)// 2

如果 mylist[mid] == 项目:

发现 = 真

elif 项目 < mylist[mid]:

高 = 中 – 1

别的:

低 = 中 + 1

返回找到

算法分析

最好的情况发生在所需的项目是中间项目时。不过,最坏的情况并不那么简单。按照下面的分析:

第一次比较后,将剩下 n/2 项。在第二个之后,将剩下 n/4 个项目。在第三个之后,n/8。

请注意,项目数一直减半,直到达到 n/2i,其中 i 是比较次数。在所有拆分之后,我们最终只有 1 个项目。

这意味着:

 n/2i=1

因此,二分查找是 O(log n)。

继续排序

在二分搜索中,我们考虑了给定数组已经排序的情况。但是假设你有一个无序的数据集,你想对它进行二分查找。你会怎么做?

答案很简单:排序。计算机科学中有许多分类技术已经得到很好的研究。您可以开始学习的其中一项技术是选择排序算法,而我们也有大量与其他领域相关的指南。