數據結構--靜態查找表

靜態查找表:僅作查詢和檢索操作的查找表。

查找的方法取決於查找表的結構。 由於查找表中的數據元素之間不存在明顯的組織規律,因此不便於查找。 爲了提高查找的效率,需要在查找表中的元素之間人爲地附加某種確定的關係,換句話說,用另外一種結構來表示查找表。

順序查找表----順序查找法

此處以存儲結構爲順序表的順序查找表爲例。所謂順序查找法即是對數組進行遍歷,當找到所要的元素後返回其下標。

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);
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章