版权声明:转载请声明出处Catalog Spri https://blog.csdn.net/qq_33404767/article/details/83865992
算法是一组完成任务的指令。任何代码片段都可视为算法。
来自百度百科:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
A搜索算法
集束搜索
二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
说白了就是当我们有一个需求:要查找一个数字是否在一个序列中,我们就可以使用二分法进行查找。
首先我们要对序列进行排序(无论升序还是降序),然后把序列从中间一分为二,拿我们要查找的数字与中间数字做对比,根据判断的结果进行下一步操作。
具体实现如下:
笔者目前还比较小白,只会python。各位将就着看一下吧
# 这里我们用列表来举例
nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101] # 从小到大排列的数字列表
# 如果传入的序列是无序的,我们可以先对序列进行排序
def binary_search(find_num, nums):
'''
二分法查找数字是否存在于列表中
:param find_num: 要查找的数字
:param nums: 序列
:return: 返回布尔值, 存在为True
'''
# 先判断传入的序列的长度
if len(nums) == 0:
# 如果序列长度为0,则要查找的数字不在此序列中
print('not exists')
return False
# 将序列从中间一分为二,然后拿我们要查找的数字与中间数字做对比,判断大小
# 这里我们默认序列为从小到大
mid_index = len(nums) // 2
# 要查找的数字大于序列中间数字,则我们要查找的数字要么在序列右侧(较大一侧),要么不存在
if find_num > nums[mid_index]:
# 取列表右半部分赋值给新变量
nums = nums[mid_index + 1:]
# 重新运行功能,传入新列表
binary_search(find_num, nums)
# 要查找的数字小于序列中间数字,则我们要查找的数字要么在序列右侧(较大一侧),要么不存在
elif find_num < nums[mid_index]:
# 取列表左半部分赋值给新变量
nums = nums[:mid_index]
# 重新运行功能,传入新列表
binary_search(find_num, nums)
# 要查找的数字等于中间数字,则找到数字,返回True
else:
return True
# 函数有返回值,找个变量接收一下
res = binary_search(95, nums)
# 查看结果
print(res)