查找概論
查找表是由同一類型的數據元素(或記錄)構成的集合。
關鍵字是數據元素中某個數據項的值,又稱為鍵值,用它來標示一個數據元素。也可以標示一個記錄的某個數據項(字段)的值,稱之為關鍵碼。
- 若此關鍵字課可以唯一的標示一個記錄,那么此關鍵字為主關鍵字。主關鍵字所在的數據項稱為主關鍵碼。
- 對於那些可以識多個數據元素(或記錄)的關鍵字,我們稱之為此次關鍵字。次關鍵字可以理解為是不以唯一標示一個數據元素的關鍵字,它對應的數據項就是次關鍵碼
按照查找表操作方式可以分為:靜態查找表和動態查找表
靜態查找表:只做查找操作的查找表
主要的操作:
- 查詢某個”特定的“數據元素是否在查找表中。
- 檢索某個”特定的“數據元素和各種屬性。
動態查找表:在查找過程中同時插入查找表中不存在的數據元素,或者從查找表中刪除已經存在的某個數據元素。
動態查找表的操作: - 查找時插入數據元素
- 查找時刪除數據元素
為了提高查找的效率,專門為查找操作設置數據結構,這種面向查找操作的數據結構成為查找結構
順序表查找
又叫做線性查找,是查找算法中最基本的查找,它的過程是:從表中第一個(或最后一個)記錄開始,逐個進行記錄的關鍵字和給定值比較,若某個記錄的關鍵字和給定值相等,則查找成功,找到所查的記錄;如果直到最后一個(或第一個)記錄,其關鍵字和給定值比較都不等時,則表中沒有所差的記錄,查找不成功。
算法實現如下:
/**
* 順序表查找
* @param a
* @param n
* @param key
* @return
*/
public int Sequential_Search(Object[] a, int n, Object key) {
for (int i = 0; i < n; i++) {
if(a[i] == key) {
return i;
}
}
return 0;
}
順詢表查找優化:
設置哨兵
/**
* 順序表查找的優化
* 設置哨兵
* 注意數組中元素值下標從1開始
* @param a
* @param n
* @param key
* @return
*/
public int Sequential_Search2(Object[] a, int n, Object key) {
int i = n;
a[0] = key;
i = n;
while(a[i] != key) {
i--;
}
return i;
}
該算法的時間復雜度為O(n)