搜索是我们生活的一部分,因为我们不可能总是有答案。还有各种算法可以帮助程序更有效地运行并更有效地处理数据。
搜索算法用于从任何数据结构中检索项目。它将作为输入的数据与存储在其数据库中的信息进行比较,并得出结果。例如,在包含 1,000 个号码的联系人列表中查找您最好的朋友的号码。
有不同类型的搜索算法。其中一些是:
线性搜索算法是所有搜索算法中最简单的。顾名思义,它们按顺序运行。
线性搜索逐个检查列表中的元素以查找特定的键值。此键值位于列表中的其他项中,算法通过检查返回位置。
Dijkstra的最短路径算法用于更高级的搜索。Dijkstra的算法映射出两个节点之间的最短距离。这些节点通常是路由网络。
当您尝试在地图上查找路线时,这种类型的搜索非常有用。它根据找到尽可能短的路径为您提供了选择。
二进制搜索算法也称为半间隔搜索。它们返回目标值在排序列表中的位置。
这些算法使用“分而治之”技术来查找值的位置。
二进制搜索算法和线性搜索算法是简单搜索算法的示例。
在二进制搜索中,在与要搜索的键值进行比较之前,会找到列表中的中间元素。但在线性搜索中,元素是通过循环并与键值进行比较来逐个获取列表中的。
在二进制搜索期间,列表被分成两部分以获取中间元素:左侧,中间元素和右侧。
左侧包含小于中间元素的值,右侧包含大于中间元素的值。此方法使用排序列表来工作。
排序列表的项目按特定顺序排列。为了使二进制搜索具有高效性,列表中的值必须按正确的顺序排列以满足搜索过程。如果列表的值混淆,则必须在执行搜索之前按排序算法对其进行排序。
排序算法接受未排序的列表作为输入,并返回一个列表,其中的元素按特定顺序排列(主要是升序)。
有不同类型的排序算法,如插入排序、快速排序、气泡排序和合并排序。
二进制搜索算法使用一种称为“分而治之”的技术来处理其任务。合并排序算法采用相同的技术对列表中的项目进行排序。
在二进制搜索算法中,“分而治之”方法的工作方式如下:
您可以在二进制搜索过程中使用递归或迭代来实现此方法。
首先,在执行搜索之前,您需要对列表进行排序。
然后,创建一个变量来存储要搜索的值。
接下来,将列表分为两部分。我们汇总第一个和最后一个索引,以查找列表中中间元素的索引。
当中间元素索引的计算值为浮点数(如3.45)时,我们将整个部分作为索引。
然后,我们比较要搜索的值和中间元素。
如果中间元素等于要搜索的值,则将返回该值的位置并终止进程。
if middle element == to_search return position of middle element *code ends*
中间元素 = 23,目标值/to_search = 23。比较这两个值,我们看到它们在两边都是相等的。23 出现在列表中的索引 2 处。这是代码的输出,过程结束。
如果中间元素不等于“to_search”,那么我们检查以下场景:
场景 1:如果中间元素大于要搜索的值:
if middle element > to_search
middle element = 23to_search = 4if 23 > 4
将新的中间元素(4)与目标值(4)进行比较,我们看到它们是相等的。因此,搜索终止,输出是列表中“4”占据的位置(即索引 0)。
场景 2:如果中间元素小于要搜索的值:
if middle element < to_search
middle element = 23 to_search = 32 if 23 > 32
将中间元素(32)与目标值(32)进行比较,我们看到它们是相等的。因此,搜索终止,输出是列表中“4”占据的位置(索引4)。
有两种方法可以在搜索中实现“分而治之”技术。它们是迭代和递归。
为了从元组、列表或字典中获取元素,请使用循环循环遍历这些项。
迭代是执行过程中重复的语句序列,它具有可计数数量的值。例如,在循环访问随机列表时,我们循环访问包含列表的实际变量以获取值。
代码如下:
def binary_search(list_num , to_search): first_index = 0 size = len(list_num) last_index = size - 1 mid_index = (first_index + last_index) // 2 # print(mid_index) mid_element = list_num[mid_index] # print(mid_element) is_found = True while is_found: if first_index == last_index: if mid_element != to_search: is_found = False return " Does not appear in the list" elif mid_element == to_search: return f"{mid_element} occurs in position {mid_index}" elif mid_element > to_search: new_position = mid_index - 1 last_index = new_position mid_index = (first_index + last_index) // 2 mid_element = list_num[mid_index] if mid_element == to_search: return f"{mid_element} occurs in position {mid_index}" elif mid_element < to_search: new_position = mid_index + 1 first_index = new_position last_index = size - 1 mid_index = (first_index + last_index) // 2 mid_element = list_num[mid_index] if mid_element == to_search: return f"{mid_element} occurs in position {mid_index}"list_container = [16 , 18 , 20 , 50 , 60 , 81 , 84 , 89]print(binary_search(list_container , 81))print(binary_search(list_container , 10))
现在让我们看看这里发生了什么:
在这些方案结束时,我们检查新的中间元素是否与要搜索的项目相同。如果相同,则将返回项目的位置。否则,将检查条件,直到值相等。
对于错误处理,假设我们要搜索列表中未显示的值。如果我们在这两个条件下结束,循环将继续运行,并可能最终使系统崩溃。
为了捕获错误,我们设置了一个条件来检查第一个索引是否等于最后一个索引。然后,我们检查中间元素是否等于要搜索的项目。如果它不相等,“被发现”将是“假的”。运行此命令时,它会显示一个空数组。在我的代码中,输出是一个语句。
最后一步是调用函数,并显示结果。
结果如下:
如果元素在列表中,则输出为位置。
如果元素不在列表中,则输出为如下语句:
如果函数引用自身或以前的项来解决任务,则称其为递归函数。
递归函数是重复的,它是按顺序执行的。它从一个复杂的问题开始,并将事情分解成一种更简单的形式。
使用递归,它更简单一些,需要更少的代码。下面是它的外观:
def binary_search(list_num, first_index, last_index, to_search): if last_index >= first_index: mid_index = (first_index + last_index) // 2 mid_element = list_num[mid_index] if mid_element == to_search: return f"{mid_element} occurs in position {mid_index}" elif mid_element > to_search: new_position = mid_index - 1 # new last index is the new position return binary_search(list_num, first_index, new_position, to_search) elif mid_element < to_search: new_position = mid_index + 1 # new first index is the new position return binary_search(list_num, new_position, last_index, to_search) else: return " Does not appear in the list" list_container = [ 1, 9, 11, 21, 34, 54, 67, 90 ]search = 34first = 0last= len(list_container) - 1 print(binary_search(list_container,first,last,search))
最后一步是调用函数,并显示结果。
结果如下:
如果元素在列表中,则输出为位置:
如果元素不在列表中,则输出为语句:
您可能没有意识到这一点,但我们一直在执行二进制搜索。以下是您在日常生活或工作中如何使用或遇到它的一些示例:
在本文结束时,您应该熟悉二进制搜索算法的工作原理以及如何在代码中实现它们。
关注获取更多学习资料
留言与评论(共有 0 条评论) “” |