我們在寫程式的時候,經常會遇到這樣一類問題:在乙個陣列中查詢乙個數是不是存在。比如在下圖的陣列中,查詢8是不是存在:
如果不要求效率,我們最一般的查詢方法就是順序查詢,依次檢視a[0], a[1], …, a[n-1],檢查是不是等於8。這樣對於長度為n的陣列,平均查詢長度是n/2
如果陣列是有序的,比如是遞增的,就像上圖[1, 2, 3, 4, 5, 7, 8, 10, 11, 13]一樣的話。我們就有效率更高的查詢演算法,叫做二分查詢。例如還是在上面陣列中查詢8
第一步:我們直接找位於中間的數a[4],發現a[4]=5,比8要小,所以如果8在這個陣列裡,肯定在a[5]~a[9]之中
第二步:我們找a[5]-a[9]這個範圍裡位於中間的數a[7],發現a[7]=10,比我們要找的數大,所以如果8在這個陣列裡,肯定在a[5]-a[6]之中
第三步:我們找a[5]~a[6]這個範圍裡位於中間的數a[5],發現a[5]=7,比我們要找的8小。所以我們知道如果8在陣列裡,那它肯定是a[6]這個數
第四步也是最後一步。我們檢視a[6]的值,發現a[6]=8,於是我們找到了8的位置。假如我們這時發現a[6]不是8,則說明8沒有在這個陣列裡
二分查詢又叫「折半查詢」。因為我們每進行一步,也就
二分查詢與二分答案
主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...
二分查詢和二分答案
1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...
二分與二分答案學習
判斷left,mid,right的符號進行區間的精確。如下為遞迴二分求零點的操作 double find zero point double left,double right,double precesion double mid right left 2 if f mid 0 if f mid ...