zoukankan      html  css  js  c++  java
  • Python 利用二分法查询数据

    一. 二分法的适用条件
      二分法查找适用于数据量较大时, 但是数据需要先排好顺序.
      优点: 二分法查找效率特别高
      缺点: 二分法只适用于有序序列

    二. 二分法的主要思想是:
    设查找的数组区间为array[low, high]
    (1)确定该区间的中间位置k
    (2)将查找的值T与array[k]比较. 若相等, 查找成功返回此位置, 否则确定新的查找区域, 继续二分查找.
    区域确定如下: 1) T < array[k] 由数组的有序性可知T < array[k,k+1,……,high], 故新的区间为array[low,……,k-1]
    2) T > array[k] 由数组的有序性可知T > array[low,……,k-1], 故新的区间为array[k,k+1,……,high]
    每一次查找与中间值比较, 可以确定是否查找成功,不成功则当前查找区间将缩小一半, 递归查找即可.



    三. 例题: 用二分法查找一个数是否在随机数列中
    1. 方法1(使用while循环):

    步骤1: 拿到一个有100个随机数的列表
    import random   # 引入一个随机数模块
    def random_100(amount):
        li = []
        for i in range(amount):     # 循环多少次就拿多少个随机数
            s = random.randint(0, 100)
            li.append(s)
        return li   # 返回随机数列表
    lst = sorted(random_100(100))     # count=100 拿到由100个随机数组成的列表lst,并将其排序(默认为升序)
    步骤2: 任意输入一个数(范围是0~100),查看它是否在随机数列表中
    n = int(input("请输入一个数:"))
    left = 0        # 左临界点left = 0
    right = len(lst) - 1      # 右临界点right = len(lst) - 1
    
    while left <= right:
        mid = (left + right) // 2     # 索引只能是整数,因此用地板除
        if n > lst[mid]:
            left = mid + 1
        elif n < lst[mid]:
            right = mid - 1
        elif n == lst[mid]:
            print("你输入的数在这个列表中,它的位置是{}".format(mid))
            break
    else:
        print("你输入的数不在这个数列中")
    2. 方法2: 使用递归函数
    步骤1:
    # 仍然引入随机数模块, 拿到一个随机数列表
    import random
    def random_100(amount):
        li = []
        for i in range(amount):
            s = random.randint(0, 100)
            li.append(s)
        return li
    lst = sorted(random_100(100))
    步骤2:
    # 定义一个递归函数
    def func(n, lst):
        left = 0    # 左临界点
        right = len(lst) - 1    # 右临界点
        if left <= right:
            mid = (left + right) // 2
            if n < lst[mid]:
                new_lst = lst[:mid]
                return func(n, new_lst)
            elif n > lst[mid]:
                new_lst = lst[mid + 1:]
                return func(n, new_lst)
            else:
                print("你输入的数在这个列表中\n")
                return True
        else:
            print("你输入的数不在这个列表中\n")
            return False
    步骤3:
    while 1:
        n = int(input("请输入你要查找的数:"))
        func(n, lst)

    3. 方法3: 使用递归函数(方法2的优化)
    # 仍然引入随机数模块, 拿到一个随机数列表
    import random
    def random_100(amount):
        li = []
        for i in range(amount):
            s = random.randint(0, 100)
            li.append(s)
        return li
    lst = sorted(random_100(100))
    
    # 定义一个递归函数
    def func(n, lst, left=0, right=None):
        if right == None:
            right = len(lst) - 1
        if left <= right:
            mid = (left + right) // 2
            if n < lst[mid]:
                right = mid - 1
            elif n > lst[mid]:
                left = mid + 1
            else:
                print("你输入的数在这个列表中,它的位置{}\n".format(mid))
                return True
            return func(n, lst, left, right)
        else:
            print("你输入的数不在这个列表中\n")
            return False
    
    while 1:
        n = int(input("请输入你要查找的数:"))
        func(n, lst)
  • 相关阅读:
    Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
    Oracle Instant Client 安装配置
    Android Studio配置文件路径修改
    Java压缩技术(三) ZIP解压缩——Java原生实现
    Java压缩技术(二) ZIP压缩——Java原生实现
    Java压缩技术(一) ZLib
    [JavaEE] JBoss主要版本下载链接一览
    EL表达式
    如何实现hibernate的缓存机制
    如何理解hibernate当中的锁机制
  • 原文地址:https://www.cnblogs.com/haitaoli/p/9692586.html
Copyright © 2011-2022 走看看