二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。
(1)確定排序好的陣列的中間位置mid=(left+right)/2(left=0,right=n-1),將陣列分為兩部分。
(2)用要t[mid]與查詢的value進行比較;
若相等,則查詢成功,返回陣列位置,結束。
若大於,則要從左邊較小的陣列進行查詢,所以將right置為mid的值。
若小於,則要從右邊較大的陣列進行查詢,所以將left置為mid的值。
(3)重複步驟1和2,不斷地將陣列進行二分,直到找到或者left>right,表明沒有找到,返回0。
插值查詢是基於二分查詢演算法的,其本質在於改變了查詢的mid點,可以將查詢的點改進為如下
mid=left+(value-t[left])/(t[right]-t[left])*(right-left)
將上述的比例引數1/2改進為自適應的,根據關鍵字在整個有序表中所處的位置,讓mid值的變化更靠近關鍵字value,這樣也就間接地減少了比較次數。
mid的計算方式發生改變。這樣的好處在於,對錶長較長,且關鍵字分分布比較均勻,插值查詢演算法的平均效能要比折半查詢要好的多。但是,如果表中關鍵字分布極端不均勻,插值查詢不如二分查詢。
int
binarysearch
(int t,
int value,
int n)
return0;
//沒有找到則返回0
}int
insertionsearch
(int t,
int value,
int n)
return0;
//沒有找到返回0
}
二分查詢演算法的時間複雜度是o(logn)
插值查詢演算法的時間複雜度是o(log(logn))
對於較大且分布又比較均勻的陣列來說,插值查詢演算法的平均效能比折半查詢要好的多。若陣列分布不均勻,此時二分查詢更為合適。
二分查詢及插值查詢
二分查詢和插值查詢都是基於減而治之的原理 1 細節 二分查詢的範圍的下標 lo和hi代表 lo,hi 因此,選擇mid的時候,兩部分是 lo,mid 和 mid 1,hi 插值查詢的含義類似於在字典中確定乙個字母的範圍,比如選擇b的話,會在較前的頁碼處查詢,這裡,字母相當於陣列的下標,而頁碼相當於要...
查詢演算法之二分查詢 插值查詢
對半查詢和斐波那契查詢對於元素關鍵字的整體分布沒有要求,可以均勻分布,也可以不均勻分布。對於關鍵字分布不均勻且沒有規律的情況,確實很難找到更好的方法提高演算法的查詢效率 但是如果查詢序列的關鍵字分布均與,那麼是可以利用這種均勻性來提高演算法效率的,例如使用插值查詢。在關鍵字值分布均勻的情況下,使用插...
二分查詢之高階(插值查詢)
1.二分查詢即是折半查詢,即把資料分成2份進行比較判斷。前提是有序列表 二分查詢 function bsearch list,item else if guess item else return null 2.如果要查詢的數十分接近於low端或者height端,那麼用四分查詢會比二分查詢更快 如何...