二分查詢的學習

2022-06-02 13:39:09 字數 1544 閱讀 4188

來自:

我們都知道二分查詢演算法,實際上二分查詢以及其擴充套件應用是很廣泛的。這裡收集了一些和二分查詢有關的有趣問題。強烈建議大家看完問題後最小化瀏覽器,先嘗試自己去解決,然後再看**,問題都不是太難。

給乙個已經排序的陣列,其中有n個互不相同的元素。要求使用最小的比較次數找出其中的乙個元素。(你認為二分查詢在排序陣列裡找乙個元素是最優的演算法的嗎?)

不需要太多的理論,這是乙個典型的二分查詢演算法。先看下面的**:

1

//返回要查詢元素的下標,-1為沒有找到

2int binarysearch(int a, int l, int r, int

key)317

18return -1

;19 }

理論上,我們最多需要 logn+1 次比較。仔細觀察,我們在每次迭代中使用兩次比較,除了最後比較成功的一次。實際應用上,比較也是代價高昂的操作,往往不是簡單的資料型別的比較。減少比較的次數也是優化的方向之一。

下面是乙個比較次數更少的實現:

1

//迴圈不變式: a[l] <= key & a[r] > key2//

邊界: |r - l| = 13//

輸入: a[l .... r-1]

4int binarysearch(int a, int l, int r, int

key)516

if( a[l] ==key )

17return

l;18

else

19return -1

;20 }

在while迴圈中,我們僅依賴於一次比較。搜尋空間( l->r )不斷縮小,我們需要乙個比較跟蹤搜尋狀態。

需要注意的,要保證我們恒等式(a[l] <= key & a[r] > key)正確,後面還會用到迴圈不變式。

自己可以實現一下:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include

9 #include 10 #include 11

using

namespace

std;

12int binarysearch(int a,int l,int r,int

k)21

if(a[l]==k)

22return

l;23

else

24return -1;25

}26intmain()

2733 sort(a,a+5

);34 scanf("

%d",&n);

35 m=binarysearch(a,0,5

,n);

36if(m!=-1

)37 printf("

%d\n

",a[m]);

38else

39 cout<<"no"

<40return0;

41 }

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...

二分查詢 折半查詢 學習

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。查詢過程 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後...

二分查詢的平均查詢長度 二分查詢

資料的查詢在計算機的操作中非常常見,那麼我們應該怎樣在計算機中實現查詢操作呢?最簡單的一種方法 傻找 也就是乙個乙個的找,我們把陣列中的每個元素都和我們想要查詢的目標元素進行比對,看一下列表中是否有和這個元素相同的元素,如果我們想要尋找的那個目標元素在列表 現了,那麼就宣告查詢成功,這種演算法寫成 ...