二分查詢演算法
根據折半進行查詢
,但是還能根據二分查詢
進行優化嗎
?
假設我們現在有陣列arr=
,我們使用二分法查詢:1
那麼根據特性
執行會執行幾次操作
:先是找到中間值
、二分
、再進行二分
...
那麼能不能通過自適應的方案
,快速定位
到需要查詢的值呢
?
那麼就可以使用插值查詢演算法
插值查詢原理介紹:
1.插值查詢演算法類似於二分查詢
,不同
的是插值查詢
每次從自適應mid處開始
查詢。
2.將折半查詢中
的求mid索引的公式
進行優化
,key
代表查詢的值findvalue
公式為:int midindex = low + (high - low) * (key - arr[low]) / (arr[high]- arr[low]);
對應**:int mid= left+(right-left) *(findvalue -arr[left])/ (arr[right]-arr[left])
二分查詢法
為什麼是left + right / 2
呢?
因為二分法查詢的思想
:基於陣列的有序性,每次都將當前的陣列分為兩半,通過關鍵字和中間元素的比較,立即排除掉其中不可能存在和鍵值相等的元素的那一半
。
所以使用通過left + right / 2
,並比較key
和arr[mid]大小
,丟掉"一半的元素
"
(從left + right / 2
可以看出被排除的一半元素
不會納入到下一次的比較中
了)
插值查詢
為什麼是(findvalue-arr[left])/(arr[right]-arr[left])
?
首先我們根據基於陣列的有序性
,想一想查詢的位置
一定要從中間開始查詢嗎
?
那麼這時
就有了乙個思路
: 如果能在查詢前
較準確地**關鍵字
在陣列中的位置
的話,這樣的查詢方法能比二分查詢提高更多的效能
!
所以根據差值公式( key - arr[low]) / (arr[high] -arr[low])
,將要查詢的關鍵字
key 與查詢表中的最大、最小記錄的關鍵字比較
的查詢方法。
舉例:有一陣列arr=[1,2,3,4,5,6,7,8......100]
假設我們需要查詢
的值為:1
按照二分法查詢
:需要mid = (left + right ) / 2
,折半...再折半...才找到1
按照插值查詢演算法
int mid = left+(right-left) \* (findvalue -arr[left]) / (arr[right]-arr[left])
對應的**:int mid= 0+(99-0) * (1- 1) / (100-1) = 0+99 * 0 / 99 = 0
直接找到值:1
比如我們查詢的值為:100
對應的**:int mid=0 + (99-0) * (100-1) /(100-1)= 0+99 * 99/99 = 0+99=99
/**
, 用* @param arr 陣列
* @param left 左邊索引
* @param right 右邊索引
* @param findvalue 查詢值
* @return 如果找到則返回對應的下標,沒有找到返回-1 即可
*///編寫插值查詢方法
public static int insertvaluesearch(int arr,int left,int right,int findvalue)
//找出**陣列中的位置
int mid=left+(right - left) * (findvalue - arr[left]) / (arr[right]-arr[left]);
//對應的**值
int midvalue=arr[mid];
//若查詢的值比定位的值大,則需要向右遞迴
if(findvalue>midvalue)else if(findvalue在元素數值均勻分布的有序陣列裡面
這種方法查詢是很快
的。特別的,對絕對均勻分布的陣列(相鄰元素差值相同)
, 插值查詢用一次比較就能查詢成功:當然了,
前提是陣列中元素數值是均勻分布的
, 如果是對1,2,40,99,1000
這種分布很不均勻的陣列
, 插值查詢的計算會起到反效果
, 就不如二分查詢了時間複雜度平均為:
o(logn)
查詢演算法之插值查詢
插值查詢相對於重複二分查詢,則進行了複雜的四則運算,是二分查詢法的優化。插值查詢 param string find 要查詢的值 param array array 要查詢的陣列 return bool string function interpolationsearch find array a...
插值查詢演算法
插值查詢演算法是基於二分查詢演算法的,只是在查詢的過程中計算middle的方式有所改變,比如一組可以通過二分查詢演算法計算出的nmid索引的值,是這樣子計算的 nmid nlow nhigh 2,但是插值查詢演算法是根據比率算出的,nmid nlow key narr nlow narr nhigh...
插值查詢演算法
在均勻分布的有序數列中,會比二分查詢次數少很多 思想跟二分查詢一直,都是找到其中乙個值,小了往左找,大了往右找 區別是 也跟二分查詢差不多,就公式不同,不過因為公式複雜了一些,需要一些判斷條件來保證它的正確性 public static int binarysearch int arr,int ke...