我所知道查詢演算法之插值查詢

2021-10-25 21:34:39 字數 2948 閱讀 2002

二分查詢演算法根據折半進行查詢,但是還能根據二分查詢進行優化嗎

假設我們現在有陣列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,並比較keyarr[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...