來自:
我們都知道二分查詢演算法,實際上二分查詢以及其擴充套件應用是很廣泛的。這裡收集了一些和二分查詢有關的有趣問題。強烈建議大家看完問題後最小化瀏覽器,先嘗試自己去解決,然後再看**,問題都不是太難。
給乙個已經排序的陣列,其中有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 #include8 #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 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。查詢過程 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後...
二分查詢的平均查詢長度 二分查詢
資料的查詢在計算機的操作中非常常見,那麼我們應該怎樣在計算機中實現查詢操作呢?最簡單的一種方法 傻找 也就是乙個乙個的找,我們把陣列中的每個元素都和我們想要查詢的目標元素進行比對,看一下列表中是否有和這個元素相同的元素,如果我們想要尋找的那個目標元素在列表 現了,那麼就宣告查詢成功,這種演算法寫成 ...