python笔试面试项目实战2020百练1二分查找法(虾皮面试题)

题目1:请补充完整如下非递归二分查找的代码

def bin_search(l, item):
    low = 0
    high = len(l) - 1
   


    return None

if __name__ == "__main__":
    l = list(range(1,30,3)) # [1, 4, 7, 10, 13, 16, 19, 22, 25, 28]
    print(bin_search(l,7)) # return 2
    print(bin_search(l,1)) # return 0 
    print(bin_search(l,29)) # return None

题目2:请补充完整如下递归二分查找的代码

def bin_search(l, low, high, item):
    if high >= low:




        else:
            return bin_search(l, mid + 1, high, item)
    else:
        return None

if __name__ == "__main__":
    l = list(range(1,30,3)) # [1, 4, 7, 10, 13, 16, 19, 22, 25, 28]
    print(bin_search(l,0,len(l)-1, 7)) # return 2
    print(bin_search(l,0,len(l)-1, 1)) # return 0 
    print(bin_search(l,0,len(l)-1, 29)) # return None

基础

二分查找是一种算法,其输入是一个有序的元素列表(必须有序的原因稍后解释)。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回None 。

假设你要画一个包含16个格子的网格。

image.png
  • 1.一次画一个

一种方法是以每次画一个的方式画16个格子。记住,大O表示法计算的
是操作数。在这个示例中,画一个格子是一次操作,需要画16个格子。
如果每次画一个格子,需要执行多少次操作呢?

image.png
  • 2.对折

你每折一次,绘制出的格子数都翻倍,因此4步就能“绘制”出16个格
子。这种算法的运行时间是多少呢?请搞清楚这两种算法的运行时间之
后,再接着往下读。

  • 结论

算法1的运行时间为O (n ),算法2的运行时间为O (log n )。

image.png

常见查找算法

算法的速度指的并非时间,而是操作数的增速。谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。算法的运行时间用大O表示法表示。O (log n )比O (n )快,当需要搜索的元素越多时,前者比后者快得越多。

参考资料

  • 本文最新版本地址
  • 本文涉及的python测试开发库 谢谢点赞!
  • 本文相关海量书籍下载
  • python工具书籍下载-持续更新
  • 本文代码
  • 本文配套视频在线播放 下载

旅行商算法简介

有一位旅行商。他需要前往5个城市。

image.png

这位旅行商(姑且称之为Opus吧)要前往这5个城市,同时要确保旅程
最短。为此,可考虑前往这些城市的各种可能顺序。

image.png

推而广之,涉及n 个城市时,需要执行n !(n 的阶乘)次操作才能计算出结果。因此运行时间为O (n !),即阶乘时间。除非涉及的城市数很少,否则需要执行非常多的操作。如果涉及的城市数超过100,根本就不能在合理的时间内计算出结果——等你计算出结果,太阳都没了。

这种算法很糟糕!Opus应使用别的算法,可他别无选择。这是计算机科学领域待解的问题之一。对于这个问题,目前还没有找到更快的算法,有些很聪明的人认为这个问题根本就没有更巧妙的算法。

练习: 用python列表实现二分查找法

此题为shopee(虾皮) 面试题,要求用非递归算法实现。代码参见参考资料中的本文代码:

https://github.com/china-testing/python-testing-examples/tree/master/interview

建议拷贝上述网址到浏览器访问。

binary_search1.py binary_search2.py

参考答案

  • python2 版本
  • 常见错误:
    • 递归时仅仅是调用bin_search(l, low, high-1, item),而不是return bin_search(l, low, high-1, item),导致大量返回None。
    • 递归时条件判断错误,不使用low > high,而是使用low==high。
    • 直接使用range(1,30,3),而不是list(range(1,30,3))。range返回的是迭代器,不是列表。
    • 没有使用mid - 1和mid + 1,直接使用mid,降低了效率。

你可能感兴趣的:(python笔试面试项目实战2020百练1二分查找法(虾皮面试题))