对二分思想的体会以及结对编程的感想

时间:2021-07-15 23:46:45

二分查找可以在有序的支持随机访问的容器中快速查找某个元素的信息
时间复杂度: \(O(logN)\)

原始版本:
递归实现:

int binarySearch(int a[],int val,int l,int r)
{
    if(l > r) return -1;
    
    int m = l + r >> 1;
    if (val == a[m])
        return m;
    else if (val < a[m])
        return binarySearch(a,val,l,m-1);
    else
        return binarySearch(a,val,m+1,r);
}

非递归实现:

int binarySearch(int a[],int val,int l,int r)
{
    int m, ret = -1;
    while(l <= r)
    {
        m = l + r >> 1;
        if (val == a[m])
        {
            ret = m;
            break;
        }
        else if(val < a[m]) 
            r = m - 1;
        else 
            l = m + 1;
    }
    return ret;
}

C++ STL中提供了三种二分查找函数
1、binary_search(f1,f2,val)
    返回区间\([f1,f2)\)中是否存在val,存在则返回\(true\),否则返回\(false\)

2、****lower_bound(f1,f2,val)****
  返回区间\([f1,f2)\)中第一个大于等于\(val\)的元素的下标
丑陋的实现:

int my_lower_bound(int a[],int val,int l,int r)
{
    int m;
    while(l < r)
    {
        m = l + r >> 1;
        if(val <= a[m])
            r = m;
        else
            l = m + 1;
    }
    return l;
}

3、****upper_bound(f1,f2,val)****
  返回区间\([f1,f2)\)中第一个大于\(val\)的元素的下标
丑陋的实现:

int my_upper_bound(int a[],int val,int l,int r)
{
    int m;
    while(l < r)
    {
        m = l + r >> 1;
        if(val < a[m])
            r = m;
        else
            l = m + 1;
    }
    return l;
}

需要注意的是传入的区间都是左闭右开

结对编程感想:
两人一起写代码时因为思路和代码风格的差异,往往会难以理解对方的代码。
结对编程提高了我阅读别人代码的能力,同时我也更注重自身代码的规范,尽量清晰易懂,让同伴方便阅读。