当面试的时候被问及redis Zset数据结构的时候要回答的要点是什么?

文章介绍了跳表作为一种数据结构,其多级索引链表的特性,以及在查找、插入和删除操作中接近O(logn)的时间复杂度。重点阐述了跳表在插入数据时如何构建索引,利用概率统计思想决定元素晋升各级索引的概率,以及随机函数在其中的作用。
摘要由CSDN通过智能技术生成

很多人面试被问及zset的时候,绕来绕去讲一大堆,面试官各种引导想让你把要点说处理,及时回答不到点子上,很多时候恨不得替你回答下,我们在这里列一下要点:

1.说明跳表是什么,关键词:多级索引链表

2.时间复杂度:查找,插入,删除 时间复杂度都接近红黑树O(logn)

3.空间复杂度O(n)

4.核心重点:插入数据时多级索引的构建:

(图有点懒了直接从google上找了张图)

大家看上面这张图

a是一个简单的链表 也可以立即为高度为1的跳表

b是一个高度为2的跳表  c d e 大家自己脑补

那么插入的就是要回答插入过程怎样构建索引:

跳表区别于数的一个核心点是,实现过程充满了运用概率统计的思想。

1. 高度:skipList的高度为 logn(原因为对跳表的增删的基础都是查询,跳表的查询过程是一个类似二分查找的过程)

2. 插入过程,假如跳表每一层的晋升概率是 1/2,最理想的索引就是在原始链表中每隔一个元素抽取一个元素做为一级索引。换种说法,我们在原始链表中随机的选 n/2 个元素做为一级索引是不是也能通过索引提高查找的效率呢? 当然可以了,因为一般随机选的元素相对来说都是比较均匀的。我们可以认为:当原始链表中元素数量足够大,且抽取足够随机的话,我们得到的索引是均匀的。我们要清楚设计良好的数据结构都是为了应对大数据量的场景,如果原始链表只有 5 个元素,那么依次遍历 5 个元素也没有关系,因为数据量太少了。所以,我们可以维护一个这样的索引:随机选 n/2 个元素做为一级索引、随机选 n/4 个元素做为二级索引、随机选 n/8 个元素做为三级索引,依次类推,一直到最顶层索引。这里每层索引的元素个数已经确定,且每层索引元素选取的足够随机,所以可以通过索引来提升跳表的查找效率。

每次新插入元素的时候,尽量让该元素有 1/2 的几率建立一级索引、1/4 的几率建立二级索引、1/8 的几率建立三级索引,以此类推,就能满足我们上面的条件。现在我们就需要一个概率算法帮我们把控这个 1/2、1/4、1/8 ... ,当每次有数据要插入时,先通过概率算法告诉我们这个元素需要插入到几级索引中,然后开始维护索引并把数据插入到原始链表中。

基于上述思想,每次插入的时候可以依赖一个概率函数返回这个插入数据需要构建的索引层级即可。

随机函数可以这样实现:

private int randomLevel() {
  int level = 1;
  // 当 level < MAX_LEVEL,且随机数小于设定的晋升概率时,level + 1
  while (Math.random() < 0.5 && level < MAX_LEVEL)
    level += 1;
  return level;
}

基本到这儿就可以了。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值