zoukankan      html  css  js  c++  java
  • 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)
    # 第二次优化递归实现二分法:加入返回值
    nums = [-3,4,7,10,13,21,43,77,89]
    # find_num = 3
    def binary_search(find_num,l):
        print(l)
        if len(l) == 0:
            print("该值不存在!!!")
            return False
        mid_index = len(l) // 2
    
        if find_num > l[mid_index]:
            l = l[mid_index:1]
            return binary_search(find_num,l)
        elif find_num < l[mid_index]:
            l = l[:mid_index]
            return binary_search(find_num,l)
        else:
            print('find it')
            return True
    
    res = binary_search(7,nums)
    print(res)
    
    """运行结果;没有return返回None
    [-3, 4, 7, 10, 13, 21, 43, 77, 89]
    [-3, 4, 7, 10]
    find it
    None
    """
    # 获取结果的返回值:运行返回值是None?为啥?这要追溯到函数运行时的运行结果,没有return返回None
    """加入return后运行结果:
    [-3, 4, 7, 10, 13, 21, 43, 77, 89]
    [-3, 4, 7, 10]
    find it
    True
    """
  • 相关阅读:
    MFC STATIC,Picture控件使用及无法添加变量的问题
    MFC listctrl NMCLICK消息 错误 无法从"NMHDR*"转换为"NMITEMACTIVATE"
    vs2008中将开始执行按钮(不调试按钮)添加至标准工具栏方法
    MFC 删除工具栏 默认对话框全屏 修改MFC标题栏的文字 删除菜单栏
    Visual Assist X设置
    MFC禁止窗口最大化按钮和禁止改变窗口大小
    MFC从头开始如何利用MFC分割窗口
    MFC CSplitterWnd窗口分割
    关于VS2008下提示microsoft incremental linker已停止工作的问题
    windows 下codeblocks查看容器值
  • 原文地址:https://www.cnblogs.com/liunaixu/p/12673211.html
Copyright © 2011-2022 走看看