Administrator
Published on 2025-03-09 / 7 Visits
0
0

Reids 跳表(Skip List)的原理

Reids 跳表(Skip List)的原理。


场景设定:图书馆的书架

想象你正在管理一个图书馆,书架上摆满了书,这些书是按照书名的字母顺序排列的。现在,你经常需要快速找到某本书,或者查找某个字母区间内的所有书。如果只有一排书架,你只能从头到尾一本一本地找,效率非常低。


跳表的出现:多层索引的书架

为了提高查找效率,你决定在书架上增加多层索引。每一层索引都是一些关键的书名,这些书名指向下面一层的对应位置。这样,你就可以通过索引来快速跳过一些不必要的书,从而快速定位到目标书名。


跳表的结构:多层索引的书架

  1. 最底层(Level 0):这是最详细的一层,包含了每一本书,就像普通的链表一样,书名是按顺序排列的。
  2. 更高层(Level 1、Level 2……):每一层的索引书名都比下一层稀疏。例如,Level 1 可能每隔几本书就有一个索引,Level 2 的索引则更稀疏,每隔更多本书才有一个索引。

查找过程:快速定位目标书名

假设你要找一本叫《Redis实战》的书:

  1. 从最高层开始:你从最高层的索引开始查找。比如,最高层的索引书名是《A》《C》《E》《G》……
    • 如果《Redis实战》在《C》和《E》之间,你就可以跳过《A》和《C》之间的所有书。
  2. 向下一层移动:在 Level 1,你可能会看到《C》《D》《E》……
    • 你发现《Redis实战》在《D》和《E》之间,于是你继续向下一层查找。
  3. 到达最底层:在最底层,你终于找到了《Redis实战》的具体位置。

插入过程:添加一本新书

假设你要插入一本新书《Redis入门》:

  1. 随机决定层数:你随机决定这本书在索引中的层数。比如,它可能在 Level 0 和 Level 1 上有索引,但在 Level 2 上没有。
  2. 更新索引:你找到《Redis入门》应该插入的位置,并在对应的层级上更新索引。比如,在 Level 0 上,它插入在《Redis实战》之前;在 Level 1 上,它插入在《D》和《E》之间。

删除过程:移除一本书

假设你要删除《Redis实战》:

  1. 找到目标书:按照查找过程找到这本书。
  2. 更新索引:在每一层的索引中删除这本书,并更新指针,让前面的书直接指向后面的书。

跳表的随机性

跳表的层数是随机的,就像你在书架上随机决定哪些书需要在更高层索引一样。这种随机性保证了跳表的平均查找复杂度是 O(log n),同时避免了像平衡树那样复杂的旋转操作。


总结

跳表就像一个多层索引的书架,通过在不同层级上设置稀疏的索引,能够快速跳过不必要的部分,从而快速定位目标数据。它既简单又高效,非常适合实现有序集合(Sorted Set)这样的数据结构。


Comment