天天看點

跳躍表-skiplist前序查找添加删除

前序

現在有一組資料,

跳躍表-skiplist前序查找添加删除

然後要從這組數組中找到某個數,比如要查找數7,一般來說,逐個逐個來查找的話,那麼時間複雜度就是O(n),

跳躍表-skiplist前序查找添加删除

當n的數量達到上百萬,或上千萬時,那性能是非常差的,在我們系統中是不能接受的。

也許我們想到了hash,平衡二叉樹結構來提高性能,今天我們來講另一個結構:跳躍表-skiplist。

比如二叉樹,它會提取一些節點作為樹的根節點,當然這裡樹指整棵樹也指樹的子樹,類似地,我們跳躍表也可以提取出一些關鍵節點出來,

跳躍表-skiplist前序查找添加删除

像上圖,我們提取1,5,11節點出來,則這裡跳躍表的最大層次高度為2。

再用上面的例子,那我們查找7的話,如何查找?

查找

跳躍表-skiplist前序查找添加删除

我們從最大高度的開始找起,首先從1節點開始,7比1大,則找1的下一個節點,從1節點的最高高度找到它的下一個節點節點5(如果7比最高高度的下一節點數少,則從1節點的最高高度往下降一高度的下一節點比較),7比5大,則在目前高度,打5的下一節點11,7比11小,則5的高度降小一級,找5的0高度的下一節點9,7比9小,則結束了,沒有找到。

路徑為:(1)->(5)->(9)

跳躍表通過關鍵節點的比較,和跳躍表高度的下一節點比較,時間複雜度為O(log2(n)。空間複雜度為O(2n)。

添加

現我們需要添加元素時,比如添加12,17:

跳躍表-skiplist前序查找添加删除

添加到跳躍表後,

跳躍表-skiplist前序查找添加删除

新的元素添加到跳躍表後,是否需要提取出新的關鍵節點,通過抛硬币,正面則提取關鍵節點,是否提取關鍵節點,可參照的說明Skip_list。

跳躍表-skiplist前序查找添加删除

再提取

跳躍表-skiplist前序查找添加删除

删除

删除節點則移除相關節點,相關的下一節點也移除,添加和删除節點,跳躍表維護比較簡單,不像紅黑樹需要重新維護紅黑樹平衡,左旋,右旋,變色等等操作。

skip list:

https://en.wikipedia.org/wiki/Skip_list

繼續閱讀