python百题百练 二级题目_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 )快,当需要搜索的元素越多时,前者比后者快得越多。

参考资料

旅行商算法简介

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

image.png

这位旅行商(姑且称之为Opus吧)要前往这5个城市,同时要确保旅程

最短。为此,可考虑前往这些城市的各种可能顺序。

image.png

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

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

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

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

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

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,降低了效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值