跳跃链表
跳躍列表(也稱跳表)是一種隨機化數據結構,基于并聯的鏈表,其效率可比擬于二叉查找樹(對于大多數操作需要O(log n)平均時間)。
基本上,跳躍列表是對有序的鏈表增加上附加的前進鏈接,增加是以隨機化的方式進行的,所以在列表中的查找可以快速的跳過部分列表,因此得名。所有操作都以對數隨機化的時間進行。
跳躍列表是按層建造的。底層是一個普通的有序鏈表。每個更高層都充當下面列表的“快速跑道”,這里在層 i 中的元素按某個固定的概率 p (通常為0.5或0.25)出現在層 i+1 中。平均起來,每個元素都在 1/(1-p) 個列表中出現,而最高層的元素(通常是在跳躍列表前端的一個特殊的頭元素)在 O(log1/p n) 個列表中出現。
要查找一個目標元素,如上圖所示,起步于頭元素和頂層列表,并沿著每個鏈表搜索,直到到達小于或著等于目標的最后一個元素。通過跟蹤起自目標直到到達在更高列表中出現的元素的反向查找路徑,在每個鏈表中預期的步數顯而易見是 1/p。所以查找的總體代價是 O((log1/p n) / p),當p 是常數時是 O(log n)。通過選擇不同 p 值,就可以在查找代價和存儲代價之間作出權衡。
插入和刪除的實現非常像相應的鏈表操作,除了"高層"元素必須在多個鏈表中插入或刪除之外。
跳躍列表不像某些傳統平衡樹數據結構那樣提供絕對的最壞情況性能保證,因為用來建造跳躍列表的扔硬幣方法總有可能(盡管概率很小)生成一個糟糕的不平衡結構。但是在實際中它工作的很好,隨機化平衡方案比在平衡二叉查找樹中用的確定性平衡方案容易實現。跳躍列表在并行計算中也很有用,這里的插入可以在跳躍列表不同的部分并行的進行,而不用全局的數據結構重新平衡。
這個期望步數為1/p不好理解,后來看了英文文檔也不是特別懂,就是用公式推導出來的,相關文檔見ftp://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf
其中關鍵說法如下:
C(K)為爬到第K層所付出的代價,代價為在本層的代價,加上往下爬 一層的代價,以(1-p)的概率在本層,以p的概率在下一層,這個公式看著迷糊……
最后就推導出了C(k) = k/p,極限為n/p,最低層的代價,然后后面引出平均期望代價就是平均層數/p,也就變成了上述O((log1/p n) / p)。
還是很迷糊,還是記住吧……
其他資料也沒有找到詳細的講解過程,只是有個結論而已
總結
- 上一篇: 由创建一个不能被继承的类引发的对象模型的
- 下一篇: 最小编辑距离