二分搜尋法, 是通過不斷縮小接的可能存在的範圍, 從而求得問題最優解的方法。在程式競賽中, 經常可以見到二分搜尋演算法和其他演算法結合的題目。 接下來給大家介紹經典的二分搜尋的題目。
例題: lower_bound函式手動實現;
給定乙個非嚴格單調的遞增數列和乙個整數k。當然, 如果步數的按照順序逐個的查詢的話, 也可以找到答案。 但是利用數列的有序性這一條件可以得到效率更高的演算法。 首先我們來看一下第 n / 2個值。 如果a[n / 2] >= k的話, 那麼就可以知道最終解i 的值不會大於 n / 2。 反之, 如果a[n / 2] < k, 就可以知道解大於你/ 2. 通過這個樣的一次不叫, 就可以把解的範圍縮小一半。 反覆與區間的中點進行比較, 就可以不斷地把舊的範圍縮小到原來的一半, 最終在o(logn)次比較之後求得最終解。求滿足 ai >= k 條件的最小的i。 在不存在的情況下返回 n。
int n, x;
int a[10000000];
int find1(int t)
return u;
}int main(void)
int ans = find1(x);
printf("%d\b", ans);
}return
0;}
以上的演算法被稱之為: 二分查詢。 此外, stl中還有lower_bound函式的形式實現了二分搜尋。
這個演算法除了在上例中提到的在有序數列中查詢值意外, 在求最優解的問題上也非常有用。
讓我們考慮一下「求滿足某個區間c(x)的最小條件x」這個問題, 如果所有的x』 >= x也滿足c(x』)的話, 我們就可以利用二分查詢來搜尋來求得這個最小的x。
首先, 我們將區間的左端點初始化為不滿足c(x)的值, 右斷電初始化為滿足c(x)的值。 然後每次取中點 mid = (l + u) / 2;判斷c(mid)是否滿足並縮小範圍, 直到(l, u]足夠小了為止。
每次u就是要求的最小值。 最大化的為題也是可以用同樣的方式解決。
理論基礎 查詢 二分查詢
二分查詢又稱折半查詢,其要求線性表中的記錄必須按關鍵碼有序,且必須採用順序儲存。其基本思想是 用給定值 k 先與中間結點的關鍵字比較,中間結點把線形表分成兩個子表,若相等則查詢成功 若不相等,再根據 k 與該中間結點關鍵字的比較結果確定下一步查詢哪個子表,這樣遞迴進行,直到查詢到或查詢結束發現表中沒...
題目1 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...
題目1 二分 二分查詢
link 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩...