线性和二进制搜索算法解释

390 阅读4分钟

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

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

在这篇文章中,算法将集中在确定一个值是否存在。

线性搜索算法

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

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

顺序搜索算法接收一个值列表和列表中的所需项目作为其参数。返回的结果初始化为False,当找到所需的值时将变为True

请看下面的 Python 实现作为一个例子。

def linearSearch(mylist, item):

found = False

index = 0

while index < len(mylist) and not found:

如果mylist[index] == item:

found = True

否则。

index = index+1

返回 找到的

算法分析

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

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

相关的。什么是大O符号?

修改后的线性搜索

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

假设这些项目有一个特定的顺序,例如从最小到最大。这将有可能在计算上取得一些优势。

举个例子,在给定的列表中寻找19。[2, 5, 6, 11, 15, 18, 23, 27, 34].在到达23之后,很明显,正在寻找的项目不存在于列表中。因此,继续搜索列表中的其他项目就不再重要了。

二进制搜索算法

你已经看到了有序列表如何减少所需的计算量。二进制搜索算法更是利用了拥有有序列表所带来的这种效率。

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

如果是小于,那么就不需要检查列表的下半部分。否则,如果它大,那么它就转到列表的上半部分。

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

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

这个过程重复进行,直到找到一个值,如果它是存在的。

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

def binarySearch(mylist, item):

low = 0

high = len(mylist) - 1

found = False

while low <= high and not found:

mid = (low + high) // 2

如果mylist[mid] == item:

发现 = 真

elif item < mylist[mid]:

high = mid - 1

否则。

low = mid + 1

返回 发现

算法分析

最好的情况是,所需的项目被发现是中间的项目。但最坏的情况就不那么简单了。请看下面的分析。

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

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

这意味着。

n/2i=1

因此,二进制搜索是O(log n)。

转到排序

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

答案很简单:对它进行排序。在计算机科学中,有许多排序技术已经得到了很好的研究。你可以开始研究这些技术之一是选择排序算法,而我们也有很多与其他领域相关的指南。