1. 程式人生 > >java實現順序查詢、二分查詢、雜湊表查詢、二叉排序樹查詢

java實現順序查詢、二分查詢、雜湊表查詢、二叉排序樹查詢

順序查詢、二分查詢、雜湊表查詢、二叉排序樹查詢這幾種查詢演算法是面試中常被問到的幾種演算法。

1. 順序查詢

    對於陣列,按順序比較給定的值,時間複雜度0(n),,以下是實現:

public static int Linear_Search(int[] data, int key) {
		if (data == null || data.length <= 0) {
			return -1;
		}
		for (int i = 0; i < data.length; i++) {
			if (data[i] == key) {
				return i;
			}
		}
		return -1;
	}

2.二分查詢

   二分查詢是針對已有序的序列進行的高效查詢,時間複雜度0(n),,以下是實現:

/**
	 * 二分查詢的前提是有序,迴圈
	 * 
	 * @param data
	 * @param key
	 * @return
	 */
	public static int binarySearch(int[] data, int key) {
		if (data == null || data.length <= 0) {
			return -1;
		}
		int low = 0;
		int high = data.length - 1;
		while (low < high) {
			int mid = (low + high) / 2;
			if (data[mid] == key) {
				return mid;
			} else if (data[mid] > key) {
				high = mid - 1;
			} else if (data[mid] < key) {
				low = mid + 1;
			}
		}
		return -1;
	}

	/**
	 * 二分查詢的前提是有序,遞迴
	 * 
	 * @param data
	 * @param key
	 * @return
	 */
	public static int recursiveBinarySearch(int[] data, int low, int high, int key) {
		if (data == null || data.length <= 0) {
			return -1;
		}
		if (low < high) {

			int mid = (low + high) / 2;
			if (data[mid] == key) {
				return mid;
			} else if (data[mid] > key) {
				recursiveBinarySearch(data, low, mid - 1, key);
			} else if (data[mid] < key) {
				recursiveBinarySearch(data, mid + 1, high, key);
			}

		}
		return -1;
	}


3.雜湊表查詢

  雜湊查詢是通過計算資料元素的儲存地址進行查詢的一種方法。O(1)的查詢,即所謂的秒殺。雜湊查詢的本質是先將資料對映成它的雜湊值。雜湊查詢的核心是構造一個雜湊函式,它將原來直觀、整潔的資料對映為看上去似乎是隨機的一些整數。

雜湊查詢的操作步驟:

1)       用給定的雜湊函式構造雜湊表;

2)       根據選擇的衝突處理方法解決地址衝突;

3)       在雜湊表的基礎上執行雜湊查詢。

建立雜湊表操作步驟:

1)       step1 取資料元素的關鍵字key,計算其雜湊函式值(地址)。若該地址對應的儲存空間還沒有被佔用,則將該元素存入;否則執行step2

解決衝突。

2)       step2 根據選擇的衝突處理方法,計算關鍵字key的下一個儲存地址。若下一個儲存地址仍被佔用,則繼續執行step2,直到找到能用的儲存地址為止。

雜湊查詢步驟為:

1)       Step1 對給定k值,計算雜湊地址 Di=Hk);若HST為空,則查詢失敗;若HST=k,則查詢成功;否則,執行step2(處理衝突)。

2)       Step2 重複計算處理衝突的下一個儲存地址 Dk=RDk-1),直到HST[Dk]為空,或HST[Dk]=k為止。若HST[Dk]=K,則查詢成功,否則查詢失敗。


4.二叉排序樹查詢

構造一棵二叉排序樹的目的,其實並不是為了排序,而是為了提高查詢和插入刪除的效率。

二叉排序樹具有以下幾個特點。

1,若根節點有左子樹,則左子樹的所有節點都比根節點小。

2,若根節點有右子樹,則右子樹的所有節點都比根節點大。

3,根節點的左,右子樹也分別為二叉排序樹。

查詢的實現:
boolean Search(BiTree T, int key, BiTree f, BiTree p){  
    if(T==null) {  
        p == f;  
        return false;  
    }  
    if(T.data == key) {  
        p == T;  
        return true;  
    }  else if(T.data > key) {  
           return Search(T.lchild,key,T,p);  
    } else {  
           return Search(T.rchild,key,T,p);  
    }  
}  
插入的實現:
boolean Insert(BiTree T, int key)  
{  
    if(!Search(T,key,null,p)) {  
        BiTree e = new BiTree(key);  
        if(p==null)//說明f是null,說明一開始就是一顆空樹  
       {  
         T = e;  
       } else if(p.data > key)  
          p.lchild = e;  
       else  
           p.rchild = e;  
      retrun true;  
    }  
    return false;  
}  
參考:http://www.cnblogs.com/mcgrady/archive/2013/08/25/3280624.html