zoukankan      html  css  js  c++  java
  • 二分查找

    问题描述:对于一个有序数组

    1. 找到第一个(大于)等于value的位置;(求下界)
    2. 找到第一个大于value的位置;(求下界)
    3. 找到最后一个小于(等于)value的位置;(求上界)
    4. 找到最后一个小于value的位置.(求上界)

     

    问题1:找到第一个(大于)等于value的位置

    可以看出来,问题1和问题4是同一类问题,只要把问题1的结果求出来,再将结果减去1,就能得到问题4的解法,因此,我们下面只介绍问题1的解法。[>=]=======[<]

    def lower_bound(array,first,last,value):
        while first < last:#搜索区间[first,last)不为空
            mid = first + (last-first) // 2#不溢出
            if array[mid] < value:
                first = mid + 1
            else:
                last = mid
        return first #last也行,因为[first,last)为空的时候他们重合

    注意点:

    1.取中位数,使用first+(last-first)//2,可以确保区间长度为1时,mid=first仍在[first,first+1)区间内;

    2.if的判断条件为<

    3.返回first和last都一样,因为循环结束之后两个指的是同一个值

    举例:

    array=[1,2,4,6,7]
    first=0
    last=len(array)-1
    res = lower_bound(array,first,last,6)
    print(res)
    
    res = 3



    问题2:找到第一个大于value的位置

    可以看出来,问题2和问题3是同一类问题,只要把问题2的结果求出来,再将结果减去3,就能得到问题3的解法,因此,我们下面只介绍问题2的解法。 [>]======[<=]

    def lower_bound(array,first,last,value):
        while first < last:#搜索区间[first,last)不为空
            mid = first + (last-first) // 2#不溢出
            if array[mid] <= value:
                first = mid + 1
            else:
                last = mid
        return first #last也行,因为[first,last)为空的时候他们重合

    举例:

    array=[1,2,4,6,7]
    first=0
    last=len(array)-1
    res2 = lower_bound2(array,first,last,6)
    print(res2)

       res = 4

    参考文献:

    【1】二分搜索

    【2】二分查找有几种写法?它们的区别是什么?

     

  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/nxf-rabbit75/p/10295902.html
Copyright © 2011-2022 走看看