靜態查找表:僅作查詢和檢索操作的查找表。
查找的方法取決於查找表的結構。 由於查找表中的數據元素之間不存在明顯的組織規律,因此不便於查找。 爲了提高查找的效率,需要在查找表中的元素之間人爲地附加某種確定的關係,換句話說,用另外一種結構來表示查找表。
順序查找表----順序查找法
此處以存儲結構爲順序表的順序查找表爲例。所謂順序查找法即是對數組進行遍歷,當找到所要的元素後返回其下標。
function linearSearch(arr, keyword){
for(let i=arr.length-1; i--;){
if(arr[i] === keyword){
return i;
}
}
//找不到返回-1
return -1;
}
還可以用“設置哨兵”的方法進行遍歷。
int linearSearch(int[] arr, keyword){
//假設數組第0號位置沒有元素,將要查找的元素放進0號位置,這就是設置哨兵
arr[0] = keyword;
for(int i=arr.length; i>0; i--){
if(arr[i] == keyword){
return i;
}
}
}
哨兵的作用就是確保一定能在數組中查到元素,也確保了返回的數值是邏輯上的順序而不是下標。
性能
定義: 查找算法的平均查找長度(Average Search Length) 爲確定記錄在查找表中的位置,需和給定值進行比較的關鍵字個數的期望值.
有序查找表----折半查找法
上述順序查找表的查找算法簡單,但平均查找長度較大,特別不適用於表長較大的查找表。 若以有序表表示靜態查找表,則查找過程可以基於“折半”進行。
function divideSearch(arr, keyword, low, high, mid){
if(arr[mid] === keyword){return mid;}
if(low > high){return -1;}
if(keyword > arr[mid]){
low = mid + 1;
mid = Math.floor((low + high) / 2);
return divideSearch(arr, keyword, low, high, mid);
} else {
high = mid - 1;
mid = Math.floor((low + high) / 2);
return divideSearch(arr, keyword, low, high, mid);
}
}