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=H(k);若HST為空,則查詢失敗;若HST=k,則查詢成功;否則,執行step2(處理衝突)。
2) Step2 重複計算處理衝突的下一個儲存地址 Dk=R(Dk-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