什么是算法?
算法其实就是解决问题的有效方法
eg:比如打开易拉罐的问题
方法1:使用金属撬棍
方法2:直接手扣
方法3:一阳指戳
二分法使用的前提: 数据集必须有此案后顺序(升序或者降序)
二分法原理
获取数据集中间的元素 比对大小
如果中间的元素大于目标数据 那么保留数据集的左边一半
如果中间的元素小于目标数据 那么保留数据集的右边一半
然后针对剩下的数据集再二分
如果中间的元素大于目标数据 那么保留数据集的左边一半
如果中间的元素小于目标数据 那么保留数据集的右边一半
...
l1 = [13,21,35,46,52,67,76,87,99,123,213,321,432,564,612]
def get_target(l1,target_num): # 定义函数
if len(l1) == 0: # 长度为0 直接返回,不用找了
print('没有找到')
return
middle_index = len(l1)//2 # 将列表一分为二,为防止奇数有余,直接整除
if target_num > l1[middle_index]: # 如果目标数字大于左侧的一边
l1_left = l1[middle_index+1:] # 左侧一边往后切片[剩余全部列表]
print(l1_left) # 打印最新的左侧数据列表
get_target(l1_left,target_num) # 拿左侧列表找目标数字
elif target_num < l1[middle_index]: # 如果目标数据小于右侧数据列表那边
l1_right = l1[:middle_index] # 新列表就是左侧那一边数据列表往前切片
print(l1_right) #打印新列表(右侧一边的列表)
get_target(l1_right,target_num) # 目标数据在新列表里寻找,
else:
print('找到了', target_num)
[99, 123, 213, 321, 432, 564, 612]
[99, 123, 213]
找到了 123
二分法的缺陷
1.如果要找的元素就在数据集的开头 二分更加复杂
2.数据集必须有顺序
目前没有最完美的算法 都有相应的限制条件