vlambda博客
学习文章列表

弄懂分治系列(3):换个模型,二分查找还会用吗?

  1. 体验卡片游戏

  2. 模拟二分查找过程


    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)     # 跟踪中位序号

这种数据跟踪策略是最常用的程序纠错方法,

也是理解通过数据变化算法的关键过程。