面试题答案
一键面试- 确定插入位置
- 从跳跃表的最高层开始,沿着每一层的链表进行查找,比较当前节点的分值(score)。
- 如果当前节点的分值小于要插入节点的分值,则向右移动到下一个节点;如果当前节点的分值大于要插入节点的分值,则向下移动到下一层。
- 持续这个过程,直到在最底层链表找到合适的插入位置。
- 生成随机层数
- Redis跳跃表通过随机化的方式确定新插入节点的层数。通常采用抛硬币的方式,假设抛硬币正面向上的概率为
p
(Redis默认p = 0.25
)。 - 从第一层开始,每次抛硬币,如果正面向上,则新节点的层数加1,继续抛硬币,直到出现反面,此时得到新节点的层数。
- Redis跳跃表通过随机化的方式确定新插入节点的层数。通常采用抛硬币的方式,假设抛硬币正面向上的概率为
- 插入节点
- 为新节点分配内存空间,并初始化其分值、成员对象以及指针数组(根据生成的随机层数确定数组大小)。
- 从最高层到最底层,依次调整指针,将新节点插入到每一层链表的合适位置。
- 在插入过程中,需要记录每一层的前驱节点,以便正确调整指针。
- 更新指针
- 对于每一层链表,将前驱节点的后继指针指向新插入节点,同时将新插入节点的后继指针指向原来前驱节点的后继节点。
- 通过这种方式,将新节点正确地插入到每一层链表中,完成多层索引结构的调整,以保证跳跃表的查询效率。