找工作專題 二分查詢

2022-04-01 12:00:25 字數 2637 閱讀 6581

二分查詢作為高效的查詢演算法,可以說是每個學計算機的都應該懂的,在每年的面試中,可以說是必須考察的點;

其實我們小時候就用過這個演算法,只是沒注意罷了,比如一本書300頁,你要找第100頁,你翻到了第20頁,那麼你肯定向後翻,你又翻到了第80頁,你肯定繼續向後找,每次砍掉一些。還比如英語字典,是按照單詞的字典序排列的,你也是利用上面的演算法在找。其實這就是二分查詢。

有序的線性表(一定得是陣列儲存的,由於需要快速取得對應位置的值)

int binarysearch(int arr, int beg, int end, int target)
1、安全性檢測

assert(beg >= 0 && beg <= end && end < sizeof(arr)/sizeof(int)); /*sizeof這個語法貌似不一定對*/
2、特殊判斷

如何出入的是乙個空陣列,此時begend0,計算mid會得0,然後訪問arr[0]會報錯所以應該加一句:

if (beg == end && beg == 0)

return -1;

3、注意mid的求法:

/*method1:*/ int mid = (beg + end) / 2;

/*method2:*/ int mid = beg + (end - beg) /2 ;

/*method3:*/ int mid = beg + ((end - beg) >> 1);

方法1:存在溢位的風險例如0x02 0x7fffffff

方法2、方法3:對於現代的編譯器,兩者執行效率應該一樣;

注意:加法的優先順序大於右移,所以需要在》操作加括號(掉過坑,冏)

在何的博文中有乙個網友提到的(beg + end)/2的語意是向0取整而不是向下取整,比如(-3 + 2)/ 2 == 0的,而beg + (end - beg) / 2是向下取整則為-1

4、迴圈的結束條件

迴圈和遞迴程式應注意的三點:1、初始條件;2、轉換條件;3、終止條件;

對於二分需要注意的是終止條件情況比較複雜,可以利用畫圖來描述

beg----------mid------------end

beg <= mid <= end 是天然成立的

分類討論:

arr[mid] < target 說明目標值在mid的右邊

arr[mid] == target 恰好等於目標值

arr[mid] > target 目標值在mid的左邊

最終結束條件(除隨機選擇乙個與目標值相等的需求)是beg == end 或者beg + 1 == end剛好在臨界點,判斷條件一般是while (beg + 1 < end)可以避免死迴圈

int findequal(int arr, int beg, int end, int target)

else if (arr[mid] > target)else

}return ret;

}

int findminequal(int arr, int beg, int end, int target)

}else if (arr[mid] > target)else

}return ret;

}```c++

###給定乙個有序(不降序)陣列arr,求解最大i使得arr[i]等於v,不存在則返回-1

```c++

int findmaxequal(int arr, int beg, int end, int target)

else

}else if (arr[mid] > target)else

}return ret;

}

int findmaxless(int arr, int beg, int end, int target)

else

}if (arr[end] < target)

return end;

else if (arr[beg] < target)

return beg;

else

return -1;

}

int findmingreat(int arr, int beg, int end, int target)

if (arr[beg] > target)

return beg;

else if (arr[end] > target)

return end;

else

return -1;

}/*別人的寫法*/

int findother(int arr, int beg, int end, int target)

if (arr[beg] <= target)

return -1;

else

return beg;

}

引用貌似得fq

由於水平有限,若發現錯誤請告知,共同進步;

1、二分查詢(binary search)需要注意的問題,以及在資料庫核心中的實現

2、程式設計之美p261頁

字串專題,歡迎繼續支援

二分專題題解

題目大意為給一條直線上的n個點,讓你隨意選取c個點,然後使得這c個點兩兩之間的最小距離最大,如何選取這c個點使這個最小距離最大,輸出最大的最小距離max。先把座標排序,之後界定二分的範圍,二分的縮小範圍的條件則為當兩點距離大於所輸入的點時,s 返回s。如若s大於所處的點,說明值太小,將左界變為mid...

整體二分專題

何謂整體二分?一般的二分只適用於單個詢問的,如果有很多個詢問,就變成了n 2n 2 n2或更高但整體二分則可以迅速處理多個詢問的問題 首先需要離線,讀入所有詢問 然後我們二分答案,這時候我們將詢問分成兩個部分,如果l r就直接更新答案,否則考慮分治,詢問的答案在左邊的丟到左邊,答案在右邊的則丟到右邊...

專題總結 二分搜尋專題

1.1從有序陣列中查詢某值 陣列長 目標值 int n,k int arr n void solve return lst 此時 fst 1 lst stl關於二分的應用 stl lower bound begin,end,key 從陣列的begin位置到end 1位置二分查詢第乙個大於或等於num...