算法

算法之二分法

二分法使用有前提: 数据集必须有先后顺序(升序 降序)

l1 =[13,21,35,46,52,67,76,87,99,123,213,321,432,564,612]
# 查找一个数 123

"""
二分法原理
    获取数据集中间的元素 比对大小
    如果中间的元素大于目标数据  那么保留数据集的左边一半
    如果中间的元素小于目标数据  那么保留数据集的右边一半
    然后针对剩下的数据集再二分
    如果中间的元素大于目标数据  那么保留数据集的左边一半
    如果中间的元素小于目标数据  那么保留数据集的右边一半
    ...
"""

def get_target(l1, target_num):
    # 最后需要考虑找不到的情况 l1不可能无限制二分
    if len(l1) == 0:
        print('不好意思 真的没有 找不到')
        return
    # 1.获取中间元素的索引值(只能是整数)
    middle_index = len(l1) // 2
    # 2.判断中间索引对应的数据与目标数据的大小
    if target_num > l1[middle_index]:
        # 3.保留数据集右侧
        l1_left = l1[middle_index + 1:]
        # 3.1.对右侧继续二分 重复执行相同代码 并且复杂度降低
        print(l1_left)
        get_target(l1_left, target_num)
    elif target_num < l1[middle_index]:
        # 4.保留数据集左侧
        l1_right = l1[:middle_index]
        print(l1_right)
        # 4.1.对右侧继续二分 重复执行相同代码 并且复杂度降低
        get_target(l1_right, target_num)
    else:
        print('找到了', target_num)


get_target(l1, 13)

"""
二分法的缺陷
    1.如果要找的元素就在数据集的开头 二分更加复杂(分更多次)
    2.数据集必须有顺序
目前没有最完美的算法 都有相应的限制条件
"""
posted @ 2022-03-21 21:44  Rain_Kz  阅读(16)  评论(0编辑  收藏  举报