算法心經——二分法

二分法

引例:給定數組[0,1,2,4,5]查找2、3,請設計查找方案。要求:當所找元素不存在時,要輸出最接近的值。
很明顯,引例中是想讓我們找一個不存在的數。此時我們需要兼顧到存在的時候答案正確,再來考慮對於不存在的數返回一個什麼樣的值。下面先給出算法。

第一種情況我們將區間劃分爲[left, mid]和[mid+1,right],更新時,left = mid + 1,或者right = mid。
int bitsearche1(int left, int right) {
	while (left < right) {
		int mid = left + right >> 2;
		if (check(mid)) {
			right = mid;
		}
		else {
			left = mid + 1;
		}
	}
	return left;//要看你的check期望返回
}
第二種情況,我們將區間劃分爲[0,mid-1],[mid,right]更新時right = mid - 1或left = mid`
int bitsearche2(int left, int right) {
	while (left < right) {
		int mid = left + right >> 2;
		if (check(mid)) {
			right = mid - 1;
		}
		else {
			left = mid;
		}
	}
	return left;//要看你的check期望返回
}
那麼問題來了,這兩種二分法有什麼區別呢?正如我們引例中要求,輸出最接近的值,最接近的方向有兩個,分別是左邊和右邊。
所以第一種方法返回的是從左到右最接近所查元素的值.
第二種則是從右到左最接近所查元素的值。具體選哪個要看實際要求。

二分法固然簡單,但裏面有着大學問,網絡上的博客也是魚龍混雜,不着邊際,囉裏囉嗦.所以特意寫了這篇文章,希望對你有幫助。
THE END
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章