1. 程式人生 > >對二分思想的體會以及結對編程的感想

對二分思想的體會以及結對編程的感想

二分 規範 stl ++ code 註意 [] 別人 val

二分查找可以在有序的支持隨機訪問的容器中快速查找某個元素的信息
時間復雜度: \(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;
}

需要註意的是傳入的區間都是左閉右開

結對編程感想:
兩人一起寫代碼時因為思路和代碼風格的差異,往往會難以理解對方的代碼。
結對編程提高了我閱讀別人代碼的能力,同時我也更註重自身代碼的規範,盡量清晰易懂,讓同伴方便閱讀。

對二分思想的體會以及結對編程的感想