打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
在Python中执行二分查找
hercules028
>《Python and AI》
2022.07.19 四川
关注
excelperfect
标签:
Python
,
二分查找
本文将展示二分查找算法的工作原理,并提供完整的示例代码,帮助你在
Python
中执行自己的二分查找。
什么是二分查找算法
二分查找算法,也称为对数查找或半间隔查找,是一种在排序数组中查找项目位置
/
索引的查找算法。之所以被称为二分查找算法,是因为它在查找项目位置时将数组分为两部分。
需要注意的是,在使用二分查找算法查找数组中的项目之前,数组或列表必须按升序排序。
下面是一个例子。假设要在初始化已排序的
nums
列表中查找整数
15
。
nums = [4,9,15,21,25,28,35,38,40,45]
开始时,起始索引将为
0
,最终索引将是该数组中最后一项的索引
9
,中间索引将为
4
。二分查找算法使用下面的公式计算中间索引:
start index + (end index – start index) // 2 = 4
上面脚本中的双正斜杠指定只返回整数部分,因此尽管
9/2=4.5
,但中间索引将为
4
。
第
4
个索引项为
25
。然而,我们正在寻找小于
25
的项目
15
。因此,整数
25
(包括整数
25
)右侧的子列表将被截断。算法将开始在以下数组中查找项
15
:
nums = [4,9,15,21]
这说明了为什么必须对列表或数组进行排序的重要性。二分查找将再次找到一个新的中间索引,即索引
1
。索引
1
处的项为
9
。由于要查找的项目
15
大于
9
,因此整数
9
(包括
9
)左侧的列表将被截断,剩下的列表如下:
nums = [15,21]
在这种情况下,新的中间索引将是原始数组(
[4,9,15,21,25,28,35,38,40,45]
)的索引
2
。在当前中间索引
15
处再次查找该项,结果匹配,返回其索引
2
。
如果开始索引大于结束索引,但在每次迭代期间在中间索引处未找到该项,则意味着该项不存在于该数组中。
二分查找算法在
Python
中的实现
下面是在
Python
中实现自己的二分查找算法需要执行的步骤:
1.
初始化三个变量:开始索引、结束索引和中间索引。开始索引将从
0
开始,结束索引将是列表或数组中最后一项的索引,例如,在前面的示例中为
9
,中间索引将是:开始索引
+
(结束索引
-
开始索引)
//2
。
2.
在中间索引处查找该项目。如果在中间索引处找到该项,返回其位置。
3.
如果要查找的项目大于中间索引处的项目,通过为其指定值:中间索引
+ 1
来更新开始索引。
4.
否则,如果要查找的项小于中间索引处的项,则通过为其指定值:中间索引
- 1
来更新结束索引。
5.
重复步骤
2
至
4
,直到开始索引小于或等于结束索引。如果开始索引大于结束索引,则找不到该项。
下面的脚本在
Python
中实现了二分查找算法。该脚本在
nums
列表中查找项目
15
。
nums = [4,9,15,21,25,28,35,38,40,45]
item = 15
start_index = 0
end_index = len(nums) - 1
value_found = False
while start_index <= end_index:
mid_index = start_index + (end_index - start_index) // 2
item_mid_index = nums[mid_index]
if item == item_mid_index:
value_found = True
print('
项目已找到
,
其索引是
', mid_index)
break;
elif item > item_mid_index:
start_index = mid_index + 1
else:
end_index = mid_index - 1
if value_found == False:
print('
项目未找到
')
运行脚本后的结果如下图
1
所示。
图
1
试运行我们的二分查找算法代码
可以通过为每个迭代输入
start_index
、
end_index
和
mid_index
的值来试运行上述代码。你将看到,在第三次迭代期间,在第二个索引处找到了项目
15
。
nums = [4,9,15,21,25,28,35,38,40,45]
start_index = 0
end_index = 9
item = 15
第
1
次迭代
mid_index = 0 + (9 – 0)//2 = 0 + 4 = 4
item_mid_index = nums[4] = 25
item (15) < item_mid_index (25)
end_index = mid_index – 1 = 4 – 1 = 3
第
2
次迭代
mid_index = 0 + (3 – 0)//2 = 0 + 1 = 1
item_mid_index = nums[1] = 9
item (15) > item_mid_index (9)
start_index = mid_index + 1 = 1 + 1 = 2
第
3
次迭代
mid_index = 2 + (3 – 2)//2 = 2 + 0 = 2
item_mid_index = nums[2] = 15
item (15) == item_mid_index (15)
return mid_index
使用函数实现二分查找算法
也可以将自己的二分查找算法实现为
Python
函数。
例如,下面的脚本实现了一个名为
bin_search()
的函数,该函数接受输入数组和要在数组中查找的项。如果找到该项,则该函数返回该项的索引。否则,该函数将返回
None
。
def bin_search(arr, item):
start_index = 0
end_index = len(arr) - 1
while start_index <= end_index:
mid_index = start_index + (end_index - start_index) // 2
item_mid_index = arr[mid_index]
if item == item_mid_index:
return mid_index
elif item > item_mid_index:
start_index = mid_index + 1
else:
end_index = mid_index - 1
return None
下面的脚本调用
binary_search()
函数来查找
nums
列表中项目
40
的位置。
nums = [4,9,15,21,25,28,35,38,40,45]
item = 40
index = bin_search(nums, item)
if index != None:
print('
项目已找到
,
其索引是
', index)
else:
print('
项目未找到
')
运行脚本后的结果如下图
2
所示。
图
2
二分查找函数也可用于查找排序列表中非数字项的位置。看下面的示例:
animals = ['cat','dog','horse','jaguar','kangaroo']
item = 'jaguar'
index = bin_search(animals, item)
if index != None:
print('
项目已找到
,
其索引是
', index)
else:
print('
项目未找到
')
运行脚本后的结果如下图
3
所示。
图
3
由于二分查找算法在每个查找步骤中将数组分为两部分,因此二分查找的最坏情况下复杂度为
log
(
n
)。
欢迎到知识星球:
完美
Excel
社群
,进行技术交流和提问,获取更
多电子资料,并通过社群加入专门的微信讨论群,更方便交流。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
二分查找算法详解
破解数据科学面试,这里有最常考的三种算法
一篇文章带你了解JavaScript 数组迭代方法
Python 标准库解读.1(对应MicroPython)
面试前必知必会的二分查找及其变种
聊一聊二分查找法
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×