编程珠玑第四章总结

第二题:用来用二分搜索法返回所搜寻元素出现的第一个位置。

def bin_search_first(array,t):
    n = len(array)
    if n == 0 :return -1
    l = 0;u = n-1
    p = -1
    while l <= u:
        m = (l+u)//2
        if array[m] == t:
            p = m
            if m>0 and array[m-1]==t:
                u = m-1
            else:break
        elif array[m] < t:
            l = m+1
        else:
            u = m-1
    return p
def test():
    import random
    for i in range(2,100):
        array = [random.randint(0,5) for k in range(100)]
        array.sort()
        t = random.randint(0,5)
        print(t,bin_search_first(array,t),array.index(t))
test()

第3题:编写一个递归版本的二分搜索

def recur_bin_search(array,t):
    def bin_search(l,u):
        if l>u:return -1
        m = (l+u)//2
        if array[m]==t:return m
        elif array[m]<t:return bin_search(m+1,u)
        else:return bin_search(l,m-1)
    return bin_search(0,len(array)-1)
def test():
    import random
    for i in range(2,100):
        array = [k for k in range(100)]
        t = random.randint(0,i-1)
        print(t,recur_bin_search(array,t),array.index(t))
test()

第六题:选豆子问题,本题比较简单,基本思路如下:

首先假设黑白豆子的数量分别是a,b有三种情况:

[1]豆子不同
a1

[2]都是白色豆子
b2,a+1

[3]都是黑色豆子
a1

综上可知,白色豆子每次少两个,因此它的奇偶性不变,所以只有白色豆子时奇数时才会剩下1个白色豆子。白色豆子是偶数时就会会剩下黑色豆子。

第7题:确定两条线段,还是二分搜索的思想,只是比较的过程发生了变化。将相邻线段组成的区间作为一个元素,进行二分查找!

def find_segment(a,b,x,y):
    assert(len(a)==len(b))
    n = len(a)
    def line(m):return  a[m]*x+b[m]
    def bin_search(x,y):
        l = 0;u = n-2
        p = -1
        while l<=u:
            m = (l+u)//2
            print(m)
            if line(m) > y and line(m+1) < y:
                p = m;break
            elif line(m) < y:
                u = m-1
            elif line(m+1) > y:
                l = m+1
        return p
    return bin_search(x,y)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值