1. 程式人生 > >資料結構----Java中陣列的查詢

資料結構----Java中陣列的查詢

線性查詢時間複雜度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;
    }
}