二分查詢作為高效的查詢演算法,可以說是每個學計算機的都應該懂的,在每年的面試中,可以說是必須考察的點;
其實我們小時候就用過這個演算法,只是沒注意罷了,比如一本書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...