弄懂分治系列(3):换个模型,二分查找还会用吗?
体验卡片游戏
模拟二分查找过程
3.程序代码
利用上一次的算法代码,只是更改了列表,从1位置开始,需要左边界初始为1.
#!/usr/bin/env python3
def search(cards, x):
a = 1
b = len(cards)-1
# 逐级分割查找范围,缩小查询规模
while a <= b:
m = (a + b) // 2
print("m的变化过程:",m) # 跟踪中位序号
if x == cards[m]:
return m
elif x < cards[m]:
b = m - 1
else:
a = m + 1
return -1 # 找不到目标,返回-1
# 主程序
# d作为cards的原始数据。弃用0号元素,卡片编号从1开始
d = ["卡片内容:",1, 5, 7, 8, 12, 15, 18, 21, 27, 29, 30, 31]
print(d)
r = 29 # 假设抽查日期为29日
y = search(d, r) # 调用search函数,传入d与r数据
if y > 0:
print("抽查日期",r,"的序号为",y)
print("恭喜,可获得神秘礼物")
else:
print("抽查日期",r,"不存在")
print("本月没有神秘礼物,下月继续努力哦!")
小经验:
print("m的变化过程:",m) # 跟踪中位序号
这种数据跟踪策略是最常用的程序纠错方法,
也是理解通过数据变化算法的关键过程。