理論 二分查詢(1) 基礎樣例

2021-07-09 14:15:01 字數 1024 閱讀 7500

二分搜尋法, 是通過不斷縮小接的可能存在的範圍, 從而求得問題最優解的方法。在程式競賽中, 經常可以見到二分搜尋演算法和其他演算法結合的題目。 接下來給大家介紹經典的二分搜尋的題目。

例題: lower_bound函式手動實現;

給定乙個非嚴格單調的遞增數列和乙個整數k。

求滿足 ai >= k 條件的最小的i。 在不存在的情況下返回 n。

當然, 如果步數的按照順序逐個的查詢的話, 也可以找到答案。 但是利用數列的有序性這一條件可以得到效率更高的演算法。 首先我們來看一下第 n / 2個值。 如果a[n / 2] >= k的話, 那麼就可以知道最終解i 的值不會大於 n / 2。 反之, 如果a[n / 2] < k, 就可以知道解大於你/ 2. 通過這個樣的一次不叫, 就可以把解的範圍縮小一半。 反覆與區間的中點進行比較, 就可以不斷地把舊的範圍縮小到原來的一半, 最終在o(logn)次比較之後求得最終解。

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 種不同的船。每一艘船有乙個稀有值,任意兩...