python学习(二分法)

Posted 唯你如我心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

#结果:
#没找到

 

  

  

以上是关于python学习(二分法)的主要内容,如果未能解决你的问题,请参考以下文章

Python深度学习案例1--电影评论分类(二分类问题)

Python学习总结

python学习(二分法)

火炉炼AI深度学习005-简单几行Keras代码解决二分类问题

python学习写一个二分算法的程序

学习 PyQt5。在我的代码片段中找不到错误 [关闭]