常见存储、查找算法
存儲
散列存儲:即哈希的存儲方式。
順序存儲:數組的存儲方式
鏈式存儲:鏈式前向星、vector<>
壓縮存儲
索引存儲
查找
常見查找算法
順序查找
一個一個往下找,復雜度 \(O(\dfrac{n+1}{2})\) 。
適合順序存儲,不適合壓縮存儲、索引存儲等。
折半查找、二分查找
查找次數:\(a<\log_2 n<b(a,b,c\in \mathbb{Z})\)
查找失敗時,至少比較 \(a\) 次關鍵字;查找成功時,最多比較關鍵字次數是 \(b\) 。
差值查找
咕咕咕
斐波那契查找
咕咕咕
二叉查找樹
二叉查找樹(英語:Binary Search Tree),也稱為二叉搜索樹、有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:
若任意節點的左子樹不空,則左子樹上所有節點的key值均小于它的根節點的值;
若任意節點的右子樹不空,則右子樹上所有節點的key值均大于它的根節點的值;
任意節點的左、右子樹也分別為二叉查找樹;
沒有鍵值相等的節點。
分塊查找
分塊查找又稱索引順序查找,它是順序查找的一種改進方法。
算法的思想是將 \(n\) 個數據元素"按塊有序"劃分為 \(m\) 塊( \(m\le n\) )。每一塊中的結點不必有序,但塊與塊之間必須"按塊有序",每個塊內的的最大元素小于下一塊所有元素的任意一個值。
在塊與塊之間進行二分操作。
時間復雜度:\(O(\log m + \dfrac{n}{m})\)
哈希查找
哈希通過散列表來實現存儲與查找。
其中散列函數只要有一下幾類:
直接定址法:取關鍵字或關鍵字的某個線性函數值為散列地址。即 \(\text{Hash}(k) = k\) 或 \(\text{Hash}(k) = a \times k + b\) ,其中 \(a,b\) 為常數(這種散列函數叫做自身函數)
數字分析法:假設關鍵字是以 \(r\) 為基的數,并且哈希表中可能出現的關鍵字都是事先知道的,則可取關鍵字的若干數位組成哈希地址。
平方取中法:取關鍵字平方后的中間幾位為哈希地址。通常在選定哈希函數時不一定能知道關鍵字的全部情況,取其中的哪幾位也不一定合適,而一個數平方后的中間幾位數和數的每一位都相關,由此使隨機分布的關鍵字得到的哈希地址也是隨機的。取的位數由表長決定。
折疊法:將關鍵字分割成位數相同的幾部分(最后一部分的位數可以不同),然后取這幾部分的疊加和(舍去進位)作為哈希地址。
隨機數法
除留余數法:取關鍵字被某個不大于散列表表長m的數p除后所得的余數為散列地址。即 \(\text{Hash}(k) = k \pmod{p}\) , \(p\le m\) 。不僅可以對關鍵字直接取模,也可在折疊法、平方取中法等運算之后取模。對 \(p\) 的選擇很重要,一般取素數或 \(m\) ,若 \(p\) 選擇不好,容易產生沖突。
為了避免哈希沖突,一般有一下幾種方法:
-
開放尋址法
-
線性探測法:若發現位置已經被占用,則一個一個往后找。
-
二次探測法:采用開放定址法處理沖突中的二次探測再散列(也即是題目中的二元探測法),則哈希函數變為 \(\text{Hash}(k)=(\text{Hash}(k)+d) \pmod{mod}\),其中 \(d=1^2,-1^2,2^2,-2^2,3^2,\dots\)
-
雙重散列
-
-
鏈地址法:把數值加入哈希的鏈表中。
(復賽中)也可以使用線性探測法解決哈希沖突問題
總結
- 上一篇: 没有父亲的父亲节说说内容 没有父亲的父亲
- 下一篇: 如何设置短信加密