【算法之Python篇】分治策略

分治策略:

保证子问题独立

二分查找当找不到关键字时就返回不大于关键字的数

先书写一下二分查找经典算法

#-----------------------二分查找------------------------------#
def search(L,key):
    low,high=0,len(L)-1
    while low<=high:
        mid=(low+high)//2
        if L[mid]==key:
            print("{}在{}位置上".format(key,mid))
            return 
        elif L[mid]<key:
            low=mid+1
        else:
            high=mid-1
        
    print("找不到{}".format(key))

能找到key

L=[2,5,6,8,9,18,22,100]
search(L,100)
>>>1007位置上

不能找到key

L=[2,5,6,8,9,18,22,100]
search(L,80)
>>>找不到80

在二分算法的基础上稍作研究得出,当key找不到时候会出现两个结果
①当key处于前段时候是停留在比它小的数上
②当key处于后段时候是停留在比它大的数上
所以依据这个原理我们就可以轻松解决返回不大于关键字的数。

def search(L,key):
    low,high=0,len(L)-1
    while low<=high:
        mid=(low+high)//2
        if L[mid]==key:
            print("{}在{}位置上".format(key,mid))
            return 
        elif L[mid]<key:
            low=mid+1
        else:
            high=mid-1
    if key<L[mid]:
        print("不大于{}的数是{}".format(key,L[mid-1]))
    else:
        print("不大于{}的数是{}".format(key,L[mid]))
#    print("{}".format(mid))
L=[2,5,6,8,9,18,22,100]
search(L,101)

思考

1.当不大于key的值找到了那不小于key的值是不是轻而易举的就可以实现呢?
那当然是加一个越界时的判断即可实现

def search(L,key):
    low,high=0,len(L)-1
    while low<=high:
        mid=(low+high)//2
        if L[mid]==key:
            print("{}在{}位置上".format(key,mid))
            return 
        elif L[mid]<key:
            low=mid+1
        else:
            high=mid-1
    if key<L[mid]:
        print("不小于{}的数是{}".format(key,L[mid]))
    elif key>L[mid]:
        if mid+1>=len(L):
            print("不存在")
        else:
            print("不小于{}的数是{}".format(key,L[mid+1]))
L=[2,5,6,8,9,18,22,100]
search(L,4)
>>>不小于4的数是5
L=[2,5,6,8,9,18,22,100]
search(L,101)
>>>不存在

2.那二分法的时间复杂度为多少呢?O(lgn)

进阶查找二维数组某个关键字在什么位置

def arry_search(arr,key):
    row=len(arr)  #行号
    col=len(arr[0]) #列号
    
    i=row-1  #设在最后一行
    j=0  #设在第一列
    
    while i>0 and j<col:  #如果列号有,行号也有就遍历
        if key==arr[i][j]:
            print("{}在数组({},{})位置上".format(key,i,j))
            return
        elif key<arr[i][j]:  #要找的关键字小于此处,就说明不在这一行
            i=i-1
        else:#要找的关键字大于此处,就说明不在这一列
            j=j+1
    print("{}在不在数组上".format(key))

arr=[[1,4,7,11,15],
         [2,5,8,12,19],
         [3,6,9,16,22],
         [10,13,14,17,24],
         [18,21,23,26,30]]
arry_search(arr,16)
arr=[[1,4,7,11,15],
         [2,5,8,12,19],
         [3,6,9,16,22],
         [10,13,14,17,24],
         [18,21,23,26,30]]
arry_search(arr,16)
16在数组(2,3)位置上
arr=[[1,4,7,11,15],
         [2,5,8,12,19],
         [3,6,9,16,22],
         [10,13,14,17,24],
         [18,21,23,26,30]]
arry_search(arr,25)
25在不在数组上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IsQiya

很庆幸我的文章对您有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值