ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二分查找 边界查找

2021-10-14 20:06:06  阅读:125  来源: 互联网

标签:二分 arr 边界 while 查找 key 指针


二分查找


1. 简介

二分查找是一种高效的查找算法,二分必有序,二分查找有许多细节

2. 左右指针初始化

l = -1, r = N;  指针不越界
考虑两种极端情况
情况1: arr = [1,2,3,4,5,6], key = 7, 小于时l指针不断右移
初始 l = -1, r = N
当 l = N-2, N-2+1 = N-1,
当 l = N-1,N-1+1 = N = r,  退出while, 左指针不越界
情况2: arr = [1, 2, 3, 4, 5, 6], key = 0, 大于时r指针不断左移
初始 l = -1, r = N
当 r = 1, -1+1+1 = 1,
当 r = 0,-1+1+0 = r , 退出while, 右指针不越界

3. 整数加法转换成减法,保证整数不溢出

 m = l + (l-r)/2

4. 判断条件 和返回值

例如, arr = [1,2,3,4,5,5,5,8,9]
#第一个大于 key = 5,  即 num = 8, arr[m] <= key, return arr[r]
#第一个大于等于key = 5 , 即 num = 5, arr[m] < key, return arr[r]
#最后一个小于 key = 5,  即 num = 4 , arr[m] < key,return arr[l]
#最后一个小于等于key = 5, 即 num = 5, arr[m] <= key, return arr[l]
总结就是,小于一定会返回l, 大于一定返回r; 其中,判断条件,严格小于 <, 严格大于 <=

图示:
在这里插入图片描述

5. python 实现

def binary_search(arr,key):
    N = len(arr)
    l, r = -1, N     #1
    while l+1 != r:  #2
        m = int(l + (r-l)/2) #3
        if arr[m] <= key:  #4
            l = m    #5
        else:
            r = m
    return arr[r]   #6

if __name__ == '__main__':
    arr = [1,2,3,4,5,5,5,8,9]
    key = 5
    num = binary_search(arr,key)
    print(num)

参考:bilibili

标签:二分,arr,边界,while,查找,key,指针
来源: https://blog.csdn.net/CCSUXWZ/article/details/120771067

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有