演算法(查詢)

weixin_34146805發表於2017-03-24
順序查詢

Java程式碼

/**順序查詢平均時間複雜度 O(n) 
 * @param searchKey 要查詢的值 
 * @param array 陣列(從這個陣列中查詢) 
 * @return  查詢結果(陣列的下標位置) 
 */  
public static int orderSearch(int searchKey,int[] array){  
    if(array==null||array.length<1)  
        return -1;  
    for(int i=0;i<array.length;i++){  
        if(array[i]==searchKey){  
            return i;  
        }  
    }  
    return -1;  
      
}  
二分法查詢
/** 
 * 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。 【二分查詢要求】:1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。 
 *  
 * @param array 
 *            有序陣列 * 
 * @param searchKey 
 *            查詢元素 * 
 * @return searchKey的陣列下標,沒找到返回-1 
 */  
public static int binarySearch(int[] array, int searchKey) {  
  
    int low = 0;  
    int high = array.length - 1;  
    while (low <= high) {  
        int middle = (low + high) / 2;  
        if (searchKey == array[middle]) {  
            return middle;  
        } else if (searchKey < array[middle]) {  
            high = middle - 1;  
        } else {  
            low = middle + 1;  
        }  
    }  
    return -1;  
}  

3.分塊查詢
a. 首先將查詢表分成若干塊,在每一塊中資料元素的存放是任意的,但塊與塊之間必須是有序的(假設這種排序是按關鍵字值遞增的,也就是說在第一塊中任意一個資料元素的關鍵字都小於第二塊中所有資料元素的關鍵字,第二塊中任意一個資料元素的關鍵字都小於第三塊中所有資料元素的關鍵字,依次類推);
b. 建立一個索引表,把每塊中最大的關鍵字值按塊的順序存放在一個輔助陣列中,這個索引表也按升序排列;
c. 查詢時先用給定的關鍵字值在索引表中查詢,確定滿足條件的資料元素存放在哪個塊中,查詢方法既可以是折半方法,也可以是順序查詢。
d. 再到相應的塊中順序查詢,便可以得到查詢的結果。

分塊查詢
/** 
 * 分塊查詢 
 *  
 * @param index 
 *            索引表,其中放的是各塊的最大值 
 * @param st 
 *            順序表, 
 * @param key 
 *            要查詢的值 
 * @param m 
 *            順序表中各塊的長度相等,為m 
 * @return 
 */  
public static int blockSearch(int[] index, int[] st, int key, int m) {  
    // 在序列st陣列中,用分塊查詢方法查詢關鍵字為key的記錄  
    // 1.在index[ ] 中折半查詢,確定要查詢的key屬於哪個塊中  
    int i = binarySearch(index, key);  
    if (i >= 0) {  
        int j = i > 0 ? i * m : i;  
        int len = (i + 1) * m;  
        // 在確定的塊中用順序查詢方法查詢key  
        for (int k = j; k < len; k++) {  
            if (key == st[k]) {  
                System.out.println("查詢成功");  
                return k;  
            }  
        }  
    }  
    System.out.println("查詢失敗");  
    return -1;  
}  

相關文章