三步了解跳表
#头条创作挑战赛#是什么
在原始链表一个个查询的基础上增加索引跳过整个列表中的几个元素。如查找7从顶层开始1 7 13,发现13大于7则进入下一层直到原始链表中的7比原来从1到7减少多次查询。
怎么用
如何判断这个数据插在哪里
从跳表的当前的最大层开始查找,在当前水平地逐个比较直到当前节点的下个节点大于等于目标节点, for (int i = level - 1; i >= 0; i--) { /* 找到第 i 层小于且最接近 num 的元素*/ while (curr.forward[i] != null && curr.forward[i].val < num) { curr = curr.forward[i]; } update[i] = curr; }
然后移动到下一层查找,重复直到第一层。设新加入的节点为newNode,计算这个二节点插入的层数lv,private int randomLevel() { int lv = 1; /* 随机生成 lv */ while (random.nextDouble() < P_FACTOR && lv < MAX_LEVEL) { lv++; } return lv; }
如果level小于lv,则同时更新level。用数组update保存每一层查找的最后一个结点,第i层最后的结点为update[i]。将newNode的后续结点指向update[i]的下个节点,同时更新update[i]的后续结点为newNode. for (int i = 0; i < lv; i++) { /* 对第 i 层的状态进行更新,将当前元素的 forward 指向新的节点 */ newNode.forward[i] = update[i].forward[i]; update[i].forward[i] = newNode; }
和 b+树比哪个效率更高
B+树需要调整树结构,算法较复杂。增加和删除上需要维护索引。
跳表只需要处理链表。通过randomLevel获取lv,删除和更新时链表本身优势数据变动少,负载因子默认0.25,lv32.
跳表是Redis的有序集合zset的实现之一完整代码class Skiplist { static final int MAX_LEVEL = 32; static final double P_FACTOR = 0.25; private SkiplistNode head; private int level; private Random random; public Skiplist() { this.head = new SkiplistNode(-1, MAX_LEVEL); this.level = 0; this.random = new Random(); } public boolean search(int target) { SkiplistNode curr = this.head; for (int i = level - 1; i >= 0; i--) { /* 找到第 i 层小于且最接近 target 的元素*/ while (curr.forward[i] != null && curr.forward[i].val < target) { curr = curr.forward[i]; } } curr = curr.forward[0]; /* 检测当前元素的值是否等于 target */ if (curr != null && curr.val == target) { return true; } return false; } public void add(int num) { SkiplistNode[] update = new SkiplistNode[MAX_LEVEL]; Arrays.fill(update, head); SkiplistNode curr = this.head; for (int i = level - 1; i >= 0; i--) { /* 找到第 i 层小于且最接近 num 的元素*/ while (curr.forward[i] != null && curr.forward[i].val < num) { curr = curr.forward[i]; } update[i] = curr; } int lv = randomLevel(); level = Math.max(level, lv); SkiplistNode newNode = new SkiplistNode(num, lv); for (int i = 0; i < lv; i++) { /* 对第 i 层的状态进行更新,将当前元素的 forward 指向新的节点 */ newNode.forward[i] = update[i].forward[i]; update[i].forward[i] = newNode; } } public boolean erase(int num) { SkiplistNode[] update = new SkiplistNode[MAX_LEVEL]; SkiplistNode curr = this.head; for (int i = level - 1; i >= 0; i--) { /* 找到第 i 层小于且最接近 num 的元素*/ while (curr.forward[i] != null && curr.forward[i].val < num) { curr = curr.forward[i]; } update[i] = curr; } curr = curr.forward[0]; /* 如果值不存在则返回 false */ if (curr == null || curr.val != num) { return false; } for (int i = 0; i < level; i++) { if (update[i].forward[i] != curr) { break; } /* 对第 i 层的状态进行更新,将 forward 指向被删除节点的下一跳 */ update[i].forward[i] = curr.forward[i]; } /* 更新当前的 level */ while (level > 1 && head.forward[level - 1] == null) { level--; } return true; } private int randomLevel() { int lv = 1; /* 随机生成 lv */ while (random.nextDouble() < P_FACTOR && lv < MAX_LEVEL) { lv++; } return lv; } } class SkiplistNode { int val; SkiplistNode[] forward; public SkiplistNode(int val, int maxLevel) { this.val = val; this.forward = new SkiplistNode[maxLevel]; } }
「链接」William Pugh 「Skip Lists: A Probabilistic Alternative to Balanced Trees」
力扣leetcode 设计跳表
数据结构——跳表skip list_Overcautious的博客-CSDN博客_跳表数据库randomlevel 什么用
寂寞的冬夜文山野村夫飘着雪花的冬夜思念萦绕心头寒冷的风中我流下了想你的泪虽然还不曾说些什么但我知道你已不能给我安慰我知道你心里想的是什么你要的幸福,我无法去给就不要再想入非非树枯了,叶黄了白
我与奥密克绒共舞了一场作者冉茂林推开窗户,苍天终于晴了。那伴随我们三载的乌云散了吗?恐慌的气息正在大地上漫延,也让多年见的克绒羊终于附体了。漫步在人生之旅中怪我在人群之中而多看了你一眼你就像一个挥之不去
做特立独行的自己原创汉留香午夜呓语202212181833发表于内蒙古请尊重你的身体她是神奇的小宇热血随夏花而奔放内敛雾凇而隐匿日出而作日落而息神魂安稳体态婀娜妙趣直播间傩主在晒病网络上神医在养生
跌倒爬起来在头条看见彼此做了四年全职妈妈,没有家人的帮衬,一家三口,老公努力挣钱再努力,然而生活还是充满着压力。看到别人自媒体都可以有一些收入,是羡慕也是佩服,佩服自媒体人的坚持和付出。自己
开悟的人,都狠!总有人问我要怎样才算开悟了?才能过得舒畅一点?凡是这么问的人,基本都仍然是红尘客,还在各种人生颜色中打转,偶尔失落,偶尔雀跃,偶然狂喜,偶尔悲伤,内心总是蹉跎,但自以为心怀悲悯,俯
人在旅途我的2022,五味俱全2022年,是我人生的一道分水岭,这一年对我来说是极不平凡的,完全可以说酸甜苦辣咸,五味俱全2022年3月,鉴于身体原因,我递交了提前退休的申请,并着手开始准备退休的各种材料。从毕
又踩一脚球王加冕,天下归心文杨又华卡塔尔当地时间12月18日的夜晚,是一个神奇的夜晚,是一个美好的夜晚。波斯湾上闪烁的星空,多哈满城温煦的灯火,和全世界亿万双眼睛一起,见证了一个辉煌的时刻绿茵场上的王者,今
思皓E10X改变我们的出行方式近期油价还在不断上涨,网上加油的段子也是越来越多,更有大佬指出,随着油价的不断上涨,加电要比加油来得更加省钱,5年10万公里计算,加电比加油节省8万多,足够买四个LV或者爱马仕。虽
2023年亮相!全新布加迪超跑将搭载混动系统兰博基尼法拉利等全球知名豪车品牌电动化布局正在加速!最近,新能源车杂谈从相关渠道获悉,顶级超跑制造商布加迪电动化规划曝光,首款搭载混合动力系统的全新超跑或将于2023年正式亮相,而
Justforfun如何成为一名Hacker一什么是黑客?JargonFile讲了一堆关于hacker这个词的定义,大部分是关于技术高超热衷解决问题以及超越极限的内容。但如果你只想知道如何成为一名黑客的话,真正重要的只有两条
武大这个俱乐部,高校第二!在珞珈山,有个俱乐部很多学生积极加入推广开源文化,普及开源知识攻克技术难题,提高创新水平它就是武汉大学OpenHarmony俱乐部今天一起去里面看看吧OpenHarmony俱乐部是