zoukankan      html  css  js  c++  java
  • 0518Python基础-内置函数-二分查找

    1、昨日内容回顾

        len() 测试个数

        eval() 去掉字符串的引号,返回内部结果

        eval('1+1') ---> 2

        exec() 去掉字符串的引号,执行内部代码

        ret = ''' if True:

                print(666)

        '''

        exec(ret)

        range

        next()

        iter()

        reversed() 返回的是迭代器

        sorted(iterable,key,reverse)  return list       key

        zip(iter1,iter2,iter3....) 拉链方法  迭代器

        map(key,iterable) 循环模式。[i for i in iterable] 返回的是迭代器。     key

        filter(key,iterable) 筛选模式[i for i in iterable if ...] 返回的是迭代器。   key

        min() 最小值,返回是int str。    key

        sum(iterable,argv) 求和。

        max() 最大值。返回是int str。    key

        open() 文件操作

        repr 原形毕露。

        divmod(被除数,除数)    返回值(商,余数)

        dir()

        abs() 绝对值。

        callable

        bytes()   str ---> bytes

        locals() 当前位置的局部变量。

        globals() 全局变量。

    2、递归函数

    递归函数:在一个函数里在调用这个函数本身。自己调用自己

    递归的最大深度:998

    修改默认递归深度

    import sys

    sys.setrecursionlimit(100000)

    可以通过这种方式来修改递归的最大深度,刚刚我们将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了~~~

    def foo(n):

        print(n)

        n += 1

        foo(n)

    foo(1)

    '''

    n = 1  太白   age(1) = 23

    n = 2  日天   age(2) = age(1) + 2

    n = 3  wusir  age(3) = age(2) + 2

    n = 4  alex  age(4) = age(3) + 2

    '''

    def age(n):

        if n == 1:

            return 23

        else:

            return age(n-1) + 2

    print(age(4)) # 23 + 2 + 2 + 2

    """

    def age(4):

        if n == 1:

            return 23

        else:

            return age(n-1) + 2        age(4) =  age(3) + 2

    ret = age(4)

    def age(3):

        if n == 1:

            return 23

        else:

            return age(n-1) + 2        age(3) = age(2) + 2

           

    def age(2):

        if n == 1:

            return 23

        else:

            return age(1) + 2          age(2) = age(1) + 2

    def age(1):

        if n == 1:

            return 23                   age(1) = 23

        else:

            return age(1) + 2         

    """

    3、二分查找

    l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

    你观察这个列表,这是不是一个从小到大排序的有序列表呀?

    如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

     

    这就是二分查找算法!

    那么落实到代码上我们应该怎么实现呢? 

      

    简单版二分法

    l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

    print(l.index(66))

     

    count = 0

    for i in l:

        if i == 66:

            print(count)

        count += 1

    for i in range(len(l)):

        if l[i] == 47:

            print(i)

            break

     

    else:

        print('找不到....')

    '''

    目标值:aim = 66

    寻找中间索引: min_index = len(l) // 2

    aim 与 中间索引对应的值进行比较

        aim > l[min_index]:

            l[min_index+1:]

        aim < l[min_index]:

            l[:min_index-1]

        aim == l[min_index]

            return min_index

    '''

     

    升级版二分法

     

    l1 = [1, 3, 5, 7, 8, 10, 11]

     def binary_search(li,aim,start=0,end=None):      # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6,start 0,end 6

                                                      第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3

                                                      第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:2,end:3

                                                      第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

                                                      第五次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

        end = len(li)  if end is None else end

        mid_index = (end - start) // 2 + start # 第一次 mid 3  第二次:mid 1  第三次:mid:2  第四次:mid:3

        if start <= end:

            if aim > li[mid_index]:

                return binary_search(li, aim, start=mid_index+1, end=end)  # 第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 2 end:3

                                                                           第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 3 end:3

            elif aim < li[mid_index]:

                return binary_search(li, aim, start=start, end = mid_index) # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3

                                                                            第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

            elif aim == li[mid_index]:

                return mid_index

        else:

            return None

    print(binary_search(l1,3))

    print(binary_search(l1,11))

     

     

     

  • 相关阅读:
    P3916 图的遍历
    P1656 炸铁路
    P6722 「MCOI-01」Village 村庄
    P1341 无序字母对
    P1072 [NOIP2009 提高组] Hankson 的趣味题
    10大主流自动化测试工具介绍
    Altium Designer中off grid pin问题的解决方法
    Easylogging++的使用及扩展
    博客园粒子特效稳定版
    C#中使用jieba.NET、WordCloudSharp制作词云图
  • 原文地址:https://www.cnblogs.com/dzh0394/p/9057919.html
Copyright © 2011-2022 走看看