题目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个格子的网格。
- 1.一次画一个
一种方法是以每次画一个的方式画16个格子。记住,大O表示法计算的
是操作数。在这个示例中,画一个格子是一次操作,需要画16个格子。
如果每次画一个格子,需要执行多少次操作呢?
- 2.对折
你每折一次,绘制出的格子数都翻倍,因此4步就能“绘制”出16个格
子。这种算法的运行时间是多少呢?请搞清楚这两种算法的运行时间之
后,再接着往下读。
- 结论
算法1的运行时间为O (n ),算法2的运行时间为O (log n )。
常见查找算法
算法的速度指的并非时间,而是操作数的增速。谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。算法的运行时间用大O表示法表示。O (log n )比O (n )快,当需要搜索的元素越多时,前者比后者快得越多。
参考资料
- 本文最新版本地址
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载
- python工具书籍下载-持续更新
- 本文代码
- 本文配套视频在线播放 下载
旅行商算法简介
有一位旅行商。他需要前往5个城市。
这位旅行商(姑且称之为Opus吧)要前往这5个城市,同时要确保旅程
最短。为此,可考虑前往这些城市的各种可能顺序。
推而广之,涉及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,降低了效率。