在學習mooc資料結構(陳越)的有關"樹"的部分時, 作為前導知識, 同時也是一直不是很懂實現方法的二分查詢, 今天借助洛谷題單, 簡單加深了一下對二分查詢的理解以及c++相關庫的使用方法, 特此記錄
洛谷p2249【深基13.例1】查詢
給出一組排好序的數列, 詢問其中元素位置. 資料範圍較大, 普通查詢方式會tle. 由於是排好序的數列, 所以使用二分查詢即可.
另外本題與最最最最最基礎二分查詢也有些許不同, 因為題目中所需要的是所查詢的序列中最前面的元素的位址(用lower_bound可以輕鬆解決, 但這裡為了理解原理, 仍手寫**). 所以在**上有所修改.
#include
const
int maxn =
1000000+10
;int a[maxn]
;int n, m;
intfind
(int ans)
else
mid =
(left+right)/2
;}if(a[right]
==ans)
//退出迴圈時l==r, r位置即為最後確定下來的位置
else
return-1
;}intmain
(void
)for
(int i=
1; i<=m; i++
)return0;
}
洛谷 p1102 a-b 數對
給出一組數列和乙個數c, 問數列中有多少個數對a,b(a和b不相等), 使得a-b=c.
本題似乎與二分查詢沒什麼關係, 但可以用c++的兩個內建函式,lower_bound和upper_bound(這兩個函式據說是用二分查詢的原理寫的), 他們的使用形式如下:
lower_bound(查詢起始位置, 查詢結束位置, 所查詢元素), upper_bound同理.
這兩個函式需要包含標頭檔案#include
以及std空間
因此如果想使用這兩個函式得到所求元素的下標, 需要在函式後減去"查詢起始位置"的位址值.
#include
#include
using
namespace std;
const
int maxn =
200010
;long
long a[maxn]
;long
long n, c, ans;
//struct numberb[maxn];
intmain
(void
)sort
(a, a+n)
;for
(int i=
0; i
)printf
("%lld"
, ans)
;return0;
}
二分查詢個人理解分析
二分演算法理解 二分是一種我們十分熟知的演算法,在很多的地方都有著神奇的用處,在各大比賽上都是很有用的工具性演算法 我們可以把二分理解成是一種不斷縮小答案範圍最後找到解的演算法,但是需要注意的是,他的實現是在資料有序的基礎上實現的 假設我們現在有著這樣一組資料 101 2 3 4 5 6 7 8 9...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
《演算法筆記》二分查詢
二分查詢 非遞迴實現 二分查詢的前提是有序,並且每次查詢的範圍都是閉區間 include include include using namespace std int a 10 intmain else if a mid n right mid 1 else if a mid n left mid...