如何学习算法之二分查找(包含python代码示例)
admin
2023-07-05 12:44:08
0

前言

我经常听到教计算机的老师说:“想要学好计算机,冲高薪,你英语可以不好,但 数学一定要好,因为玩计算机玩到最后玩的就是数学。”这时候恐怕有人会说:我从小就不喜欢数学,大学高数课都是睡过来的。确实,课堂上数学的各种符号和表达式让人望而生畏。但学习算数也可以很有趣,就像玩一个有趣的游戏一样。慢慢的你就会爱上算法,喜欢琢磨一个问题的多种解决方案,因此找到最快最简便的解决方法。

首先,什么是算法呢?算法是一系列解决任务的指令。任何一段代码都可以称为算法,但本文只展现算法的魅力,而不是大量的代码,那样也太乏味了。我们先从最简单的二分查找开始。

何为二分查找?

假设你要曾经看过的书中查找一段内容,你已不记得大概位置了,只能根据看到的内容来推测,这个时候人们往往会从中间翻开书,然后根据翻到的内容往前或往后翻找。
又假设你要你登录一个网站,当你输完账号和密码点击登陆时,网站必须核实你的账号是否存在,因此去先去数据库里查找你的账号。可能它会从数据库的第一个账号开始往后一个个查找,但好的做法是从中间开始查找。
这是关于查找问题,而在上面提到的情境中都可使用二分查找算法来解决问题。

一个小游戏
假设我们来玩一个猜数字的游戏。你在纸上写一个数字,范围在1~100,然后找一个人来猜这个数字是多少。如果对方没有猜中,你就告诉他,他猜的数字是大了还是小了,然后让对方继续猜,直到猜中这个数字为止。
问题是怎么猜才能用最少的次数来猜到这个数字呢?假设从1开始猜,而你写的数字是100。对方先猜1,你说小了,对方继续猜2,你还是告诉对方小了,对方又猜3……,直到你说99次小了,对方终于猜到了这个数字,但整整猜了100次,这实在是一种很槽糕的算法。
那如何更快的猜到数字呢?这次对方学聪明了,他不从头开始猜,而是从中间开始猜。比如这次你还是写了100,而对方猜的第一个数字是50,你说小了。对方又猜75,还是小了。对方又猜88(75和100之间的数字)……,当对方第七次猜的时候就能猜中这个数字。实际上无论你写的数字是多少,对方总能在7次之内猜中这个数字,因为对方每次猜都能排除待选项中一半的数字。

示例代码

# 一个关于二次查找的示例,给一个列表和数字,输出这个数
# 字在列表中的序号(从1开始)和猜测的次数。
def binary_search(list, item):
    low = 0  # 计算机中的的数字从0开始
    high = len(list)  # 列表的长度是可被猜测的最大序号
    times = 1  # 猜测的次数

    # 只要范围没有缩小到只有一个元素,就检查中间的元素
    while low <= high:
        # 将第一个数加上最后一个数除以二得出中间值,并取整。
        mid = int((low + high)/2)
        guess = list[mid - 1]
        # 如果猜测的数字等于给定的数字,则打印猜测的次数,并返回中间值
        if guess == item:
            print(times)
            return mid
        # 如果猜测的数字大于给定的数字则在中间值和最小值之间继续寻找。
        if guess > item:
            high = mid - 1
            times = times + 1
        # 如果猜测的数字大于给定的数字则在中间值和最大值之间继续寻找。
        else:
            low = mid + 1
            times = times + 1
    # 如果没有这个数就返回None
    return None

测试一下

# 创建一个列表和待猜测的数字传递给函数。
my_list = range(1, 101)
print(binary_search(my_list, 75))

如何学习算法之二分查找(包含python代码示例)
显示一共猜测了2次,这个数字是列表的第75个数字。

可以看出二分查找拥有比简单查找更快的运行时间,虽然简单查找比二分查找的代码更简单不容易出bug,但所用的时间在大型项目中会造成很大的影响(比如有上千万个数据时)。一个好的算法的判别条件有很多,比如时间代价,空间代价。但一定要有有穷性,确切性,可行性,和至少一个输出。

一个笑话

可能有人就想二分查找就这么简单吗?大佬曾经说过:思路很简单,细节是魔鬼。这里讲一个笑话:

一天,小陈从图书馆出来,通过安检门的时候警报响了,保安就让他把书包里的N本书拿出来过一下,小陈刚准备一本本过的时候,保安露出鄙夷的目光说道:你难道不懂二分查找吗?于是让小陈把所有的书分成两份后拿出一份过安检,然后警报响了。然后在把那一份在分成两份……。经过logN次后,保安找到了那本引起警报的书,露出得意和嘲讽的笑容。然后小陈拿着剩下的书走了。

从此,图书馆丢了N-1本书。

因此可见先要写一个算法,需要考虑很多细节,并且要有很好的数学底子。在这里推荐两本书,一本是普林斯顿微积分读本
如何学习算法之二分查找(包含python代码示例)
这本书对于,数学底子不好的人非常友善,从简到难,循序渐进的进行教学,拥有大量通俗易懂说明让你对基本的公式和原理有更好的理解。比起学校里的数学书更加让人有兴趣阅读。

另一本叫做算法图解
如何学习算法之二分查找(包含python代码示例)
这是一本非常有趣的算法书,能让你像看漫画一样愉快的学习算法,其中的例子也鲜明有趣,其中还使用编程语言python的代码作示例。可以让你学习算法的同时,学习到一门当下最火的编程语言。

相关内容

热门资讯

我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...
原创 识... 还是那句话,机圈苦大屏久已…… 虽然大屏有大屏的美,但是小屏也有小屏的俏。在大屏旗舰占据主流的手机市...
玄戒技术取得分频电路专利,实现... 国家知识产权局信息显示,北京玄戒技术有限公司取得一项名为“分频电路、分频器、射频芯片和电子设备”的专...
为什么今年香会基调明显变了 5月29日—31日在新加坡举行的第23届香格里拉对话会(简称“香会”),见证着元首引领下大国关系继续...
成本几毛钱、假驱蚊液香精兑水,... 入夏升温,蚊虫进入活跃期,驱蚊防护成为民生刚需,《财经调查》持续接到消费者投诉,他们买到的多款网红驱...
越来越多80后90后,正在丧失... 六一儿童节到来之际,朋友圈里开始出现一种熟悉的热闹。有人晒出零食礼包,有人半开玩笑地向伴侣讨礼物,还...
洋保电子取得用于低温环境的电气... 国家知识产权局信息显示,洋保电子(太仓)有限公司取得一项名为“一种用于低温环境的电气柜”的专利,授权...
中日韩飞手争霸宁波!2026无... 潮新闻客户端 记者 陈冲 通讯员 朱凝 5月31日,2026小遛·无人机竞速世界杯(中国·宁波鄞州站...