查詢 四種查詢演算法

2021-10-08 14:29:52 字數 2806 閱讀 4904

順序查詢(sequential search)又叫線性查詢,是最簡單直接暴力的查詢方法。就是從頭至尾挨個尋找,找到位置。當遍歷完沒找到就說明要找的資料不存在。它不要求資料有序。該演算法的時間複雜度為o(n)。

public static int seqsearch(int arr, int value) 

}return -1;

}

自我感覺是相對用的比較廣泛的,效率也挺高的。不過它要求資料是有序的。在有序的情況下,一半一半地找。先與中間值對比,判斷要找的值是在前半部分還是後半部分。然後就根據判斷結果鎖定下一次查詢區間,這相當於一次縮小一半的查詢量。

public static int binarysearch(int arr, int value) 

int v;

int mid = 0;

while(low <= high) else if(v == value) else

}return -1;

}

以查詢陣列中20為例。流程跟蹤:

基於二分查詢演算法,將查詢點的選擇改進為自適應選擇,可以提高查詢效率。差值查詢也需要資料有序。二分查詢是每次都選擇乙個區間的中間來縮小查詢範圍,不論資料如何都是從中間劈開。而差值查詢是一種自適應地選擇分割區間值。兩種思路對比:

對於資料量較大,關鍵字分布比較均勻的查詢表來說,採用插值查詢,速度較快。關鍵字分布不均勻的情況下,該方法不一定比折半查詢要好。 沒有更好更壞,只有合適。

public static int insertvaluesearch(int arr, int value) 

int v;

while(low <= high) else if(v == value) else

}return -1;

}

下面查詢分布均勻和不均勻為例測試,查詢次數:

public static void main(string args) ;

int arr3 = new int[100];

for(int index = 0; index < 100; index ++)

system.out.println();

int flag = insertvaluesearch(arr2, 20);

system.out.println(flag == -1 ? "沒有這個數" : "找到了 下標為:" + flag);

flag = insertvaluesearch(arr3, 20);

system.out.println(flag == -1 ? "沒有這個數" : "找到了 下標為:" + flag);

**分割:**分割點是指把一條線段分割為兩部分,使其中一部分與全長之比等於另一部分與這部分之.比。取其前三位數字的近似值是0.618。由於按此比例設計的造型十分美麗,因此稱為**分割。這是乙個神奇的數字,會帶來意向不到的效果。

斐波那契數列可以發現斐波那契數列的兩個相鄰數的比例,無限接近**分割值0.618

斐波那契查詢原理與前兩種相似,僅僅改變了中間結點(mid) 的位置,mid不再是中間或插值得到,而是位於**分割點附近,即mid=low+f(k-1)-1(f代表斐波那契數列,  k代表的是斐波那契數列的第k個元素),如下圖所示 

對f(k-1)-1的理解:

由斐波那契數列 f[k]=f[k- 1]+f[k-2]的性質,可以得到(f[k]-1) = (f[k-1]-1) + (f[k-2]-1) +1。該式說明:只要順序表的長度為f[k]-1, 則可以將該錶分成長度為f[k-1]-1和f[k-2]-1的兩段,即如上圖所示。從而中間位置為mid=low+f[k-1]-1

類似的, 每一子段也可以用相同的方式分割

但順序表長度n不一定剛好等於f[k]-1, 所以需要將原來的順序表長度n增加至flk1-1.這裡的k值只要能使得f[k)-1恰好大於或等於n即可

public class fibsearch 

return fib;

}//斐波那契數列管理索引。 陣列必須是有序的

public static int fsearch(int arr, int value)

//因為fib[k]的值可能大於arr的長度,所以需要構造新的陣列

int tmp = arrays.copyof(arr, fib[k]);

for(int index = high + 1; index < tmp.length; index++)

while(low <= high) else if(value > tmp[mid]) else else

} }

return -1;

}

流程分析:

【我們見到的太陽是8分鐘之前的太陽,見到的月亮是1.3秒之前的月亮,見到一英里以外的建築是5微妙之前的存在,即使你在我一公尺之外,我見到的也是3奈米秒之前的你,在宇宙的尺度上,我們所見的都是過去。】

四種基本的查詢演算法

public class demo1 int i seqsearch arr,3 if i 1 else public static intseqsearch int arr,int value return 1 要求是有序陣列 public class demo2 system.out.print...

最優的的四種查詢演算法

public void seqsearch 沒有順序的陣列 int value 11,index 1 for int i 0 i arr.length i if index 1 else public void binarysearch int resindex binarysearch arr,0...

Mysql四種模糊查詢

下面介紹mysql中模糊查詢的四種用法 1,表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文,請使用兩個百分號 表示。比如 select from user where u name like 三 將會把u name為 張三 張貓三 三腳貓 唐三藏 等等有 三 的記錄全找出來。...