資料結構----Java中陣列的查詢
阿新 • • 發佈:2018-12-11
線性查詢:時間複雜度O(n);適合於儲存結構為順序儲存或連結儲存的線性表。
原理:順序查詢也稱為線形查詢,屬於無序查詢演算法。從資料結構線形表的一端開始,順序掃描,依次將掃描到的結點關鍵字與給定值k相比較,若相等則表示查詢成功;若掃描結束仍沒有找到關鍵字等於k的結點,表示查詢失敗。
//線性查詢 public class LinearSearch{ public static int linearSearch(int num[], int value){ //如果陣列有序加上下面這個判斷效率會更優 if(num == null || num[0] > value || num[num.length-1] < value){ //不滿足條件直接輸出 return -1; } for(int i = 0; i < num.length; i++){ //查詢 if(num[i] == value){ return i; } } return -1; } }
二分查詢:時間複雜度O(logn);元素必須是有序的
原理:也稱為是折半查詢,屬於有序查詢演算法。用給定值k先與中間結點的關鍵字比較,中間結點把線形表分成兩個子表,若相等則查詢成功;若不相等,再根據k與該中間結點關鍵字的比較結果確定下一步查詢哪個子表,這樣遞迴進行,直到查詢到或查詢結束髮現表中沒有這樣的結點。
//二分查詢 public class BinarySearch{ public static int binarySearch(int num[], int value){ if(num == null || num[0] > value || num[num.length-1] < value){//不符合條件直接輸出-1 return -1; } int low = 0, middle, high = num.length-1; while(low <= high){ middle = (low + high) / 2; //折半思想 if(num[middle] == value){ //如果找到直接返回下標 return middle; }else{ if(num[middle] > value){ high = middle-1; }else{ low = middle + 1; } } } return -1; } }
插值查詢:時間複雜度O(logn),和折半思想一樣,在定位mid時與折半略有不同,在大數量時會體現其優勢所在。
原理:和折半思路一樣。演算法精華:middle = low + (value - num[low])/(num[high]-num[low]) * (high - low);
//菲波那切查詢 public class ChazhiSearch{ public static int chazhiSearch(int num[], int value){ if(num == null || num[0] > value || num[num.length-1] < value){ return -1; } int low = 0, middle, high = num.length-1; while(low <= high){ middle = low + (value - num[low])/(num[high] - num[low]) * (high-low); if(num[middle] == value){ return middle; }else{ if(num[middle] > value){ high = middle - 1; }else{ low = middle + 1; } } } return -1; } }