跳表skiplist

增加了向前指針的鏈表叫作跳表。跳表全稱叫做跳躍表,簡稱跳表。跳表是一個隨機化的數據結構,實質就是一種可以進行二分查找的有序鏈表。跳表在原有的有序鏈表上面增加了多級索引,通過索引來實現快速查找。跳表不僅能提高搜索性能,同時也可以提高插入和刪除操作的性能。(來自百度百科)

原理

鏈表本身是無法使用二分查找的,只能順序查找,為了提高查找效率,可以在鏈表上一半的節點數據建立索引,這是一種以空間換時間的典型算法。

skipList.png

查找

查找數據時,先從最高層索引開始查找,相等則存在;否則找到索引比val大的前一個索引,然后進入下一層繼續查找,直到層數為0。

比如要查找6,先從二級索引開始,找到5,然后向下進入一級索引,然后再進入原始鏈表,找到6。

skipList - 副本.png

插入

插入操作和查找的過程一致,先查找需要插入的位置,最終插入到原始鏈表中。當鏈表的節點相對于上級索引超過某個數量時,需要向上建立索引,跳表是使用拋硬幣的方式決定節點是否提拔,每個節點有50%的概率,保證索引大致均勻。

刪除

刪除操作和查找的過程一致,先查找需要刪除的位置,然后向下逐層刪除。如果該層只有這一個索引,則刪除該層。

寫在最后

在Redis中Sort Set就是用跳表實現的,但從效率的角度來講,當數據量比較大時,RBT的效率要高于跳表,Redis為什么用跳表而不是RBT,查了一些資料,最大的可能就是跳表實現更簡單。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 原文鏈接:SkipList 跳表 為什么選擇跳表 目前經常使用的平衡數據結構有:B樹,紅黑樹,AVL樹,Splay...
    Oomcc閱讀 907評論 0 1
  • Redis為什么用跳表而不用平衡樹? 本文是《Redis內部數據結構詳解》系列的第六篇。在本文中,我們圍繞一個Re...
    meng_philip123閱讀 4,030評論 0 26
  • 跳躍表簡介 我們先拋開redis,單獨了解下跳越表 skiplist本質上也是一種查找結構,用于解決算法中的查找問...
    super_pirlo閱讀 3,385評論 0 59
  • 在數據結構中,集合的最基本的體現方式無外乎兩種,一種是內存結構連在一起的數組的結構,一種是內存分散的通過指針連接的...
    陸小飛閱讀 3,370評論 1 3
  • 自從混跡簡書,每當看到有人為我點贊或者粉了自己那么一下,就會開心很久!比起那些大牛來,我這一顆顆點亮的小心心看著如...
    糖小醬閱讀 446評論 6 13