順序查詢(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為 張三 張貓三 三腳貓 唐三藏 等等有 三 的記錄全找出來。...