大話數據結構第八章 查找

(靜態查找表算法)

*順序表查找

優化:設置一個哨兵。

時間複雜度:O(n)

*有序表查找

***折半查找(二分查找) O(logn)

***折半改進:插值查找:mid=(key-a[low])/(a[high]-a[low])(high-low)+low  O(logn),但是對於表長較長,分佈較爲均勻的查找表而言,它的平均性能比折半查找好得多

***斐波那契查找  O(logn) 它的平均性能優於折半查找

*線性索引查找

***稠密索引,建立索引項,索引項按照關鍵碼有序排列,查找關鍵字時可以用折半、插值、斐波那契等有序查找算法。但是如果數據量過大,索引規模也會同樣大,對於內存有限的計算機,需要反覆訪問吃飯,查找性能反而降低。

***分塊索引(圖書館),對數據集進行分塊,對每個塊建立索引,減少索引項個數。

塊內無序;塊間有序:第二塊中所記錄的關鍵字要大於第一塊中記錄的關鍵字

先用有序查找找到所在的塊,再在塊中進行順序查找

***倒排索引(搜索引擎使用)

索引項的通用結構:次關鍵碼(如Term),記錄號表(如DocID)

   當用戶在主頁上搜索關鍵詞“華爲手機”時,假設只存在正向索引(forward index),那麼就需要掃描索引庫中的所有文檔,找出所有包含關鍵詞“華爲手機”的文檔,再根據打分模型進行打分,排出名次後呈現給用戶。因爲互聯網上收錄在搜索引擎中的文檔的數目是個天文數字,這樣的索引結構根本無法滿足實時返回排名結果的要求。所以,搜索引擎會將正向索引重新構建爲倒排索引,即把文件ID對應到關鍵詞的映射轉換爲關鍵詞到文件ID的映射,每個關鍵詞都對應着一系列的文件,這些文件中都出現這個關鍵詞。

(動態查找表算法:邊查找邊插入或刪除)

*二叉排序樹

順序表無序但刪除、插入快;有序表有序但刪除、插入慢;二叉樹既有序,同時刪除、插入速度快。

二叉樹的查找速度取決於樹的深度。如果深度與完全二叉樹相同,時間複雜度爲O(logn),如果情況最壞,時間複雜度爲O(n);

*平衡二叉樹:左右子樹高度差最多爲1,此時,查找、插入、刪除的時間複雜度爲O(logn)

*多路查找樹(每個結點的孩子可以多於兩個,且每個結點處可以存儲多個元素;針對內存和外存之間的存取而專門設計;2-3樹等)

*散列表(哈希表)查找:在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關係(稱爲散列、哈希函數),是的每一個關鍵字對應一個存儲位置,該存儲空間稱爲散列、哈希表。

分兩步:
1.存儲時,通過哈希函數計算散列位置,並將記錄存入散列位置。

2.查找時,通過同樣的哈希函數計算散列位置,並訪問。

哈希衝突:不同的關鍵字通過該哈希函數計算得到同一地址,設計哈希函數時,不可避免但應儘量避免。

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