線性查找算法

線性查找主要分以下三種情況:
(1)線性查找
(2)二分查找(折半查找)
(3)分塊查找

(1)線性查找
在待查數據中進行順序性輪詢查找,當存在待查的數據時返回當前數據索引位置,如果不存在則返回不存在表示-1

平均查找長度: 1/2(n+i)
計算方式:爲當前元素查找到的概率乘上所匹配的次數

時間複雜度: O(N)

Java代碼實現:

public class 線性查找 {

    public static int search(int[] number,int key){

        int[] temp = new int[number.length+1];
        //設置末尾爲監視哨
        for(int i=0;i<number.length;i++){
            temp[i] = number[i];
        }
        temp[number.length] = key;
        int result = 0;
        //進行查找匹對
        for(int i=0;;i++){
            if(temp[i] == key){
                result = i;
                break;
            }
        }
        if(result < number.length){
            return result;
        }else{
            return -1;
        }
    }

    public static void main(String[] args){
        int[] number = {12,24,53241,126,52,35,5263,7};
        int key= 52;
        System.out.println(線性查找.search(number, key));
    }

}

(2)二分查找(折半查找)

特點是待查詢的表爲有序表,設置一個左標示爲0一個右標示爲當前數組長度,讓當前待查元素與表中間元素進行匹配,如果一致則直接返回中間索引,如果小於中間索引則讓右標示等於middle,如果大於中間索引,則讓左標示等於middle。

優缺點:
優點就是因爲比較的次數大大減少索引效率很高
缺點就是要待查詢的表爲有序表,這就大大限制的所能操作的領域,並且只對查詢效率有所優化,當修改和插入數據的時候這種效率就很低了。因爲還有考慮修改或插入之後元素之間順序的問題。

平均查找長度: (n+1/n)*(log2(n+1))-1

時間複雜度: O(logN)

Java代碼實現:

public class 折半查找 {

    public static int halfSort(int[] data,int key){
        int left = 0;//左標記
        int right = data.length-1;//右標記
        int result = -1;
        while(left<=right){ //進行中間判斷
            int half = (left+right)/2;
            if(data[half] == key){
                result = half;
                break;
            }else if(data[half] < key){
                left = half;
            }else{
                right = half;
            }
        }
        return result;
    }

    public static void main(String[] args){
        int[] number = {1,2,3,4,5,6,7,8,9,10};
        int key = 6;
        int result = 折半查找.halfSort(number, key);
        if(result == -1){
            System.out.println("當前數據不存在");
        }else{
            System.out.println(result);
        }
    }
}

(3)分塊查詢
先建立一個索引表,索引表中對當前待查的元素進行了分塊處理,每一塊中包含了當前塊中的最大元素,並且後一塊中的元素全部大於之前元素,塊的個數一般都是平均分割的。這樣當查詢某一元素的時候只需要先再確定屬於哪一個塊,之後再到塊中進行查找定位,他的效率是基於順序查找和折半查找中間的,並且他比折半查找要更加靈活,不在侷限於有序表。

時間複雜度及平均查找長度:
當採用不同順序查找方式進行分塊查找和塊內查找不同。
當採用順序查找時:1/2(n/s + s) +1
當採用折半查找時: log2(n/s + 1) + 1

參考:http://www.cnblogs.com/hanjun/archive/2013/02/05/2892826.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章