增加了向前指針的鏈表叫作跳表。跳表全稱叫做跳躍表,簡稱跳表。跳表是一個隨機化的數據結構,實質就是一種可以進行二分查找的有序鏈表。跳表在原有的有序鏈表上面增加了多級索引,通過索引來實現快速查找。跳表不僅能提高搜索性能,同時也可以提高插入和刪除操作的性能。(來自百度百科)
原理
鏈表本身是無法使用二分查找的,只能順序查找,為了提高查找效率,可以在鏈表上一半的節點數據建立索引,這是一種以空間換時間的典型算法。
skipList.png
查找
查找數據時,先從最高層索引開始查找,相等則存在;否則找到索引比val大的前一個索引,然后進入下一層繼續查找,直到層數為0。
比如要查找6,先從二級索引開始,找到5,然后向下進入一級索引,然后再進入原始鏈表,找到6。
skipList - 副本.png
插入
插入操作和查找的過程一致,先查找需要插入的位置,最終插入到原始鏈表中。當鏈表的節點相對于上級索引超過某個數量時,需要向上建立索引,跳表是使用拋硬幣的方式決定節點是否提拔,每個節點有50%的概率,保證索引大致均勻。
刪除
刪除操作和查找的過程一致,先查找需要刪除的位置,然后向下逐層刪除。如果該層只有這一個索引,則刪除該層。
寫在最后
在Redis中Sort Set就是用跳表實現的,但從效率的角度來講,當數據量比較大時,RBT的效率要高于跳表,Redis為什么用跳表而不是RBT,查了一些資料,最大的可能就是跳表實現更簡單。