今天看分治法那塊,裡面提到了二分搜尋,想想好多年沒寫這個簡單的程式了,話說當年第乙個真正意義上理解的是三分查詢,即二分搜尋的拓展,所以根據分治法的思想,重新寫了二分搜尋,三分搜尋這兩個程式,突然回憶起來,當初對m=(l+r)/2,竟一點沒有懷疑過,那些分割點是怎麼求出來的,要提醒像我一樣初寫程式的朋友,一定要用數學的眼光去看演算法問題,比如二分搜尋裡,我們在紙上畫出乙個線段,而這個線段的中分點,m的求法,真實的求法應該是m=l+(r-l)/2=(l+r)/2,依據這個思路,三分搜尋,三分之一等分點應為m1=l+(r-l)*1/3=r/3+2*l/3,m2=l+(r-l)*2/3=2*r/3+l/3;我記得自己當初把這些重要的等分點求錯,很大的原因是沒有用數學的眼光去思考去看待,我只是在紙上畫了一條線,而沒有左右邊界的概念,以及那個隱藏的零點概念,我想儘管有很多人不屑看到這裡,我必須承認自己沒有很多人聰明,但只要你從頭再來一次,慢一點,重新出發,也許慢了一點,但至少堅持了下來,同樣也希望給有幫助的人一點啟示。
話不多說,上傳**,**裡,實現了二分查詢,三分查詢的遞迴以及非遞迴形式
#include#includeusing namespace std;
int binarysearch(int x,int a,int left,int right)
{ int l= left;
int r=right;
while (l<=r)
{ int mid = (l+r)/2;
if(a[mid]==x) return mid;
else if(x>a[mid]) return binarysearch(x,a,mid+1,r);
else if(xa[mid]) l=mid+1;
else if(xa[m2]) l=m2+1;
else if(x>a[m1]&&xa[m2]) return threesearch_2(x,a,m2+1,r);
else if(x>a[m1]&&x
二分與三分查詢
一 二分查詢 二分查詢很常見了,放乙個模板就溜。時間複雜度 o logn log以2為底。最後得到的是可行域的閉區間 l,r while r l 二 三分查詢三分查詢用於查詢乙個凸 凹 函式的極值點。時間複雜度 o 2 logn log以3為底。對於乙個區間 l,r 先取中點mid l r 2,再取...
二分查詢與三分查詢演算法 C
首先是二分查詢法,時間複雜度o 2log2 n static bool find int sortedarray,int number return false 然後是三分查詢演算法,時間複雜度o 3log3 n static bool find int sortedarray,int number...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...