搜索一些数据的能力是计算机科学的一个重要方面。搜索算法被用来在数据集中寻找一个特定的项目。
算法对搜索查询返回一个布尔值结果(真或假)。它们也可以被修改以给出找到的值的相对位置。
在这篇文章中,算法将集中在确定一个值是否存在。
线性搜索算法
线性搜索也被称为顺序搜索。在这种类型的搜索中,列表中的每个值都被有序地逐一访问,同时检查所需的值是否存在。
该算法逐个检查数值,直到找到你要找的数值或耗尽要搜索的数值。当它用完了要搜索的值时,这意味着你的搜索查询在列表中不存在。
顺序搜索算法接收一个值列表和列表中的所需项目作为其参数。返回的结果初始化为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)。
转到排序
在二进制搜索中,我们考虑的是给定数组已经排序的情况。但假设你有一个无序的数据集,你想对它进行二进制搜索。你会怎么做呢?
答案很简单:对它进行排序。在计算机科学中,有许多排序技术已经得到了很好的研究。你可以开始研究这些技术之一是选择排序算法,而我们也有很多与其他领域相关的指南。