• python(二分法)


    一. while循环二分

      二分查找.每次能排除掉一半的数据.查找的效率非常高.但是局限性比较大,必须是有序的序列才能用二分查找.

      要求:

        要查找的序列必须是有序序列.

    #二分法查找某一个数的索引位置
    lst = [11,22,33,44,55,66,77,88,99,111,122,133,144,155,166,177,188,199]
    n = 122
    left = 0
    right = len(lst) - 1  # 以索引为边界
    while left<=right:
        middle = (left + right) // 2  # 取一个在中间位置的索引
        if n >lst[middle]:   #如果要查找的数大于列表中索引在中间的元素
            left = middle +1    #重新定义边界,将左边界向右边挪一位
        elif n < lst[middle]:    #如果查找的数小于中间值
            right = middle -1   #重新定义边界,将右边界向左边挪一位
        else:   #如果查找的数等于中间值,直接打印middle
            print('在索引为'+ str(middle) +'的位置上!')
            break
    else:
        print('不存在')
    
    #结果:
    #在索引为10的位置上!

    二. 函数递归二分法

    lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 122, 133, 144, 155, 166, 177, 188, 199]
    def f(left,right ,n):   #定义一个函数,给三个形参
        middle = (left+right)//2
        if n >lst[middle]:
            left = middle +1
        elif n<lst[middle]:
            right = middle - 1
        else:
            return middle
        return f(left,right,n)  #必须要加return,要不然会返回none,因为它只会返回给调用它的函数
    i = f(0,len(lst)-1,99)
    print(i)
    #结果:
    #8

    三. 函数递归第二种方法(只能查找在不在序列内,不能查找具体位置)

    lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 122, 133, 144, 155, 166, 177, 188, 199]
    def f(lst,n):   #因为这个方法会改变列表,所以要将列表作为参数
        left = 0
        right = len(lst) - 1
        middle = (left+right)//2
        if middle<0:
            print('没找到')
            return
        if n >lst[middle]:
            lst = lst[middle+1:]    #对列表切割
        elif n<lst[middle]:
            lst = lst[:middle-1]
        else:
            print('找到了')
            return
        f(lst,n)    #递归再次调用函数
    f(lst, 76)
    
    #结果:
    #没找到

      

      

  • 相关阅读:
    Linux I2C设备驱动编写(一)
    Device Tree常用方法解析
    Linux查看CPU型号及内存频率及其它信息的命令
    编译错误error: invalid storage class
    Mysql技术内幕——表&索引算法和锁
    mysql 锁
    MySQL 索引方式
    通过show status 来优化MySQL数据库
    linux shell 字符串操作(长度,查找,替换)详解
    bash中将字符串split成数组的方法
  • 原文地址:https://www.cnblogs.com/dong-/p/9351037.html
Copyright © 2020-2023  润新知