Python的算法之二分法

一、算法
什么是算法?算法是高效解决问题的办法。
算法之二分法针对递归的实例
需求:有一个按照从小到大顺序排列的数字列表,查找某一个数字
# 定义一个无序的列表
nums = [3,4,5,67,8,9,124,1541,56,23637,7,37,321,21,61,515,1]
nums.sort()  # 给列表排序
print(nums)
# 运行结果:[1, 3, 4, 5, 7, 8, 9, 21, 37, 56, 61, 67, 124, 321, 515, 1541, 23637]
# nums = [-2,3,4,6,13,23,56,74,251,562,7437]
# find_num = 13
# 方案一:整体遍历效率太低
# for num in nums:
#     if num == find_num:
#         print("find it")
#         break
# for循环的弊端:效率低,得看运气。

# 使用二分法:从中间开始找,伪代码
# def binary_search(find_num,列表):
#     mid_val=找列表中间的值
#     if find_num > mid_val:
#         # 应该在列表的右半部分查找
#         # (1)新列表 = 列表切片右半部分
#         # (2)重复本身的代码(列表)
#     elif find_num < mid_val:
#         # 应该在列表的左半部分
#         # (3)新列表 = 列表切片左半部分
#         # (4)重复本身的代码(列表)
#     else: # find_num= mid_val
#         # 找到了
#         print('find it')
# 使用二分法具体实现需求
# nums = [-2,3,4,6,13,23,56,74,251,562,7437]
# find_num = 13
# def binary_search(find_num,l):
#     mid_index = len(l) // 2  # 获取列表中间值的索引
#     # mid_val=找列表中间的值
#     mid_val = l[mid_index]
#     if find_num > mid_val:
#         # 应该在列表的右半部分查找
#         # (1)新列表 = 列表切片右半部分
#         l = l[mid_index + 1:]  # 列表切片,从中间索引加1处到列表最后。
#         # (2)重复本身的代码(列表)
#         binary_search(find_num,l)
#     elif find_num < mid_val:
#         # 应该在列表的左半部分
#         # (3)新列表 = 列表切片左半部分
#         l = l[:mid_index]  # 列表切片,从列表头到中间索引处。
#         # (4)重复本身的代码(列表)
#         binary_search(find_num,l)
#     else: # find_num= mid_val
#         # 找到了
#         print('find it')
# binary_search(find_num,nums)
# 使用交互式程序获取一个列表的索引值
# >>> nums = [1,2,3,4,5]  # 定义一个含有奇数个的列表
# >>> len(nums) // 2  # 获取这个列表的中间索引值
# 2  # 这个列表的中间索引值是2
# >>> nums = [1,2,3,4,5,6]  #定义一个含有偶数个的列表
# >>> len(nums) // 2 # 获取这个列表的中间索引值
# 3  # 这个列表的中间索引值是3
# 优化:二分法+递归解决需求
nums = [-2,3,4,6,13,23,56,74,251,562,7437]
find_num = 15
def binary_search(find_num,l):
    # 查看调用列表的次数
    print(l)
    # 针对列表索引值超出范围:IndexError: list index out of range
    if len(l) == 0:
        print("找的值不存在!!")
        return
    mid_index = len(l) // 2  # 获取列表中间值的索引
    if find_num > l[mid_index]:
        l = l[mid_index + 1:]  # 列表切片,从中间索引加1处到列表最后。
        binary_search(find_num,l)
    elif find_num < l[mid_index]:
        l = l[:mid_index]  # 列表切片,从列表头到中间索引处。
        binary_search(find_num,l)
    else:
        print('find it')
binary_search(find_num,nums)

 

猜你喜欢

转载自www.cnblogs.com/liunaixu/p/12673211.html
今日推荐