python---算法之二分法

什么是算法?
    算法其实就是解决问题的有效方法
      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.数据集必须有顺序
目前没有最完美的算法 都有相应的限制条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值