對半查詢和斐波那契查詢對於元素關鍵字的整體分布沒有要求,可以均勻分布,也可以不均勻分布。對於關鍵字分布不均勻且沒有規律的情況,確實很難找到更好的方法提高演算法的查詢效率;但是如果查詢序列的關鍵字分布均與,那麼是可以利用這種均勻性來提高演算法效率的,例如使用插值查詢。
在關鍵字值分布均勻的情況下,使用插值查詢可以提高效率,那插值查詢的原理是怎樣的?下面舉乙個例子:
關鍵字246
8101214
1618
20元素值
1112
1513
1416
1820
2524
這組序列的關鍵字在2~20之間均勻分布,這時如果要查詢關鍵字為18的元素值,是不是可以直接計算出關鍵字為18的元素的儲存位置呢?
用陣列來儲存這組序列:
陣列下標01
2345
6789
關鍵字246
8101214
1618
20元素值
1112
1513
1416
1820
2524
用 (18-2)/(20-2) 可以計算出關鍵字18在整個關鍵字序列中的相對位置,是在關鍵字序列的 8
9\frac89
98位置,然後用這個相對位置乘上整個序列長度,即(18-2)/(20-2)*(9-0),就可以轉換為該關鍵字在子表中的相對位置,當然這個式子嚴格意義上並不完整,完整的應該是 (18-2)/(20-2)*(9-0)+0。
所以在插值查詢演算法中的i
ii的計算公式為:
i =l
ow+k
ey−k
lowk
high
−klo
w∗(h
igh−
low)
i = low+\frac}-k_}\ast(high-low)
i=low+
khig
h−k
low
key−
klow
∗(
high
−low
)這是個極端例子,關鍵字是完全均勻分布的,所以只需計算一次i
ii值就可以查詢到對應元素;但是這種情況極為少見,更多的是相對均勻的情況,一次計算並不能解決,這時仍然要採用二分查詢的策略,將查詢範圍一步步劃分為更小的子表。
從這個例子來看,在關鍵字值分布均勻的情況下,插值查詢的平均效能優於對半查詢;但是如果關鍵字值分布非常不均勻的情況下,插值查詢的平均效能會差很多。
本篇完 ?
二分查詢及插值查詢
二分查詢和插值查詢都是基於減而治之的原理 1 細節 二分查詢的範圍的下標 lo和hi代表 lo,hi 因此,選擇mid的時候,兩部分是 lo,mid 和 mid 1,hi 插值查詢的含義類似於在字典中確定乙個字母的範圍,比如選擇b的話,會在較前的頁碼處查詢,這裡,字母相當於陣列的下標,而頁碼相當於要...
二分查詢與插值查詢
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。1 確定排序好的陣列的中間位置mid left right 2 left 0,right n 1 將陣列分為兩部分。2 用要t mid ...
查詢演算法之 二分查詢
這個例項給出了二叉搜尋演算法在9個元素的陣列arr中查詢某個目標值的過程01 2345 678 7 35812 1623 3355 例子1 查詢目標值2301 2345 678 7 35812 1623 3355 步驟1 索引範圍 0,9 索引first 0,last 9,mid 0 9 2 4 t...