數據結構總結(三):查找

1、二分從查找

最簡單的狀況:有序數組中不存在重複元素,查找特定元素:數組

const biaryFind = (sortedArr, target) => {
    if (sortedArr.length === 0) return -1
    let low = 0
    let high = sortedArr.length - 1
    while (low <= high) {
        const mid = Math.floor((low + high) / 2)
        //可寫成:low+(high-low)/2。防止數據溢出
        //進一步優化 low+((high-low)>>1)。相比除法運算來講,計算機處理位運算要快得多
        if (target === sortedArr[mid]) {
            return mid
        } else if (target < sortedArr[mid]) {
            high = mid - 1
        } else {
            low = mid + 1
        }
    }
    return -1
}

時間複雜度: O(logn)
適用場景:函數

  • 數組,能按照下標隨機訪問元素
  • 數據排好序
  • 數據量不能太大,由於須要連續存儲空間

二分查找的相關問題:大數據

  • 查找第一個值等於給定值的元素
  • 查找最後一個值等於給定值的元素
  • 查找第一個大於等於給定值的元素
  • 查找最後一個小於等於給定值的元素

拓展
對有序鏈表的查找:跳錶,查找時間複雜度O(logn)優化

2、散列表(Hash Table)

散列表也叫哈希表,使用數組支持按照下標隨機訪問數據的特性
散列函數計算key,獲得散列值,做爲下標。
裝載因子=填入表中的元素個數/散列表的長度
解決散列衝突:code

  • 開放尋址法
    有線性探測法、二次探測、雙重散列(用多個散列函數)
    注意點:刪除不能直接將元素置空,要作標記,不然影響正常的查找
    缺點: 隨着插入數據,空閒位置愈來愈少,衝突機率也變大,查找效率就會下降。適合數據量比較小、裝載因子小
  • 鏈表法 每一個槽位存一個鏈表。比較適合存儲大對象、大數據量的散列表
相關文章
相關標籤/搜索