比二分查詢法更好的,我的估算值查詢法

2021-04-13 08:32:09 字數 1422 閱讀 1803

我們知道,對於有序資料序列進行查詢,二分查詢法效能是相當好的,時間效率達到o(log2n),但該演算法其實還有些可以進行改進的地方。

普通的二分查詢法,直接通過折半的方式來對有序資料序列進行篩選,這種方法實際上不是十分有效。對於大多數的有序資料序列,通常分布都是比較均勻的,我們完全可以通過對資料的分布進行估算,找出合理位置,減少折半次數。

基於估算資料序列折點的方式進行查詢,在資料分布最好的情況下,與二分查詢法一樣,時間效率都是o(1), 但在最壞的情況下,與普通情況下,都有著比二分查詢法,更優越的情能。

以下是乙個簡單的估算查詢法實現:

#include

#include

using namespace std;

//普通估算法,沒有對分布不均勻的情況進行特殊處理

int feval(int a, int first, int last, int targe)

//對分布不均勻的情況,進行了特殊(跳躍式)處理

int feval2(int a, int first, int last, int targe)

else

}//普通二分查詢法

int fbin(int a, int first, int last, int targe)

template

int find(int a, int first, int last, int targe, eval feval)

else if (nevalmid != nevallast && targe > a[nevalmid])

else if (nevalmid != nevallast && targe < a[nevalmid])

else

++count;

}cout << count << "/n";

return result;

};int main(int argc, char *argv)

;cout << find(a, 0, 6, 201, fbin) << "/n";

cout << find(a, 0, 6, 201, feval) << "/n";

cout << find(a, 0, 6, 201, feval2) << "/n";

//最好情況

int b = ;

cout << find(b, 0, 6, 4, fbin) << "/n";

cout << find(b, 0, 6, 4, feval) << "/n";

//普通情況

int c = ;

cout << find(c, 0, 85, 123, fbin) << "/n";

cout << find(c, 0, 85, 123, feval) << "/n";

system("pause");

return exit_success;

}

二分法查詢陣列中的值

public class main 宣告中間值 int middle 0 宣告開始值 int start 0 查詢的值為3,在該陣列中查詢值為3的元素 int value 3 宣告結束值 int end nums.length 用for迴圈是知道迴圈的次數,此處用while是因為不知道能迴圈多少次,...

順序查詢法,二分查詢法,差值查詢法,斐波那契查詢法

迴圈遍歷,逐一比對關鍵值和陣列元素,時間複雜度o n n為陣列長度 二分查詢,又稱折半查詢,查詢效率高 以陣列中間元素為界限,將陣列分為前半部分,後半部分 如果查詢元素大於中間元素,說明查詢元素在前半部分,縮小查詢範圍 如果查詢元素小於中間元素,說明查詢元素在後半部分,縮小查市價找範圍 每次查詢範圍...

二分查詢法的例項分析

二分查詢 折半查詢,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後兩個子表,如果中間位置 記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或...