跳躍表(SkipList)

跳躍表在查詢、添加、刪除的時間複雜度上做到O(logN)

跳躍表(SkipList)是一種基於有序鏈表的擴展,簡稱跳錶

 

思考:如何才能更快找到一個有序鏈表的某一節點

以上做法雖然增加了50%的額外空間,但是性能提高了一倍,此外還可以繼續提取

當大量的新節點通過逐層比較,最終插入到原鏈表之後,上層的索引節點會漸漸變得不夠用,所以需要考慮如何從新節點當中選取一部分提取到上一層(採用拋硬幣的方式,隨機決定新節點是否提拔,每向上提拔一層的機率是50%)

之所以使用拋硬幣的方式,是因爲跳躍表刪除和添加的節點是不可預測的,很難用一種有效的算法來保證跳錶的索引分佈始終均勻

綜上:跳躍表插入節點的流程有以下幾步

1、新節點和各層索引節點逐一比較,確定原鏈表的插入位置。O(logN)

2、把索引插入到原鏈表。O(1)

3、利用拋硬幣的隨機方式,決定新節點是否提升爲上一級索引。結果爲“正”則提升並繼續拋硬幣,結果爲“負”則停止。O(logN)

4、總體上,跳躍表插入操作的時間複雜度是O(logN),而這種數據結構所佔空間是2N,既空間複雜度是 O(N)。

 

刪除流程:

1、自上而下,查找第一次出現節點的索引,並逐層找到每一層對應的節點。O(logN)

2、刪除每一層查找到的節點,如果該層只剩下1個節點,刪除整個一層(原鏈表除外)。O(logN)

3、總體上,跳躍表刪除操作的時間複雜度是O(logN)。

 

 

跳躍表和二叉查找樹的區別:

跳躍表維持結構平衡的成本比較低,完全依靠隨機。而二叉查找樹在多次插入刪除後,徐亞Rebalance來重新調整結構平衡

 

應用:Redis中的Sorted-set

 

參考鏈接:

需要了解本文更詳細內容的,請參考以下鏈接

http://blog.jobbole.com/111731/

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