二分查詢,三分查詢

2021-06-22 16:02:10 字數 957 閱讀 1318

今天看分治法那塊,裡面提到了二分搜尋,想想好多年沒寫這個簡單的程式了,話說當年第乙個真正意義上理解的是三分查詢,即二分搜尋的拓展,所以根據分治法的思想,重新寫了二分搜尋,三分搜尋這兩個程式,突然回憶起來,當初對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小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...