头条创作挑战赛是什么 在原始链表一个个查询的基础上增加索引跳过整个列表中的几个元素。如查找7从顶层开始1713,发现13大于7则进入下一层直到原始链表中的7比原来从1到7减少多次查询。 怎么用 如何判断这个数据插在哪里 从跳表的当前的最大层开始查找,在当前水平地逐个比较直到当前节点的下个节点大于等于目标节点,for(intilevel1;i0;i){找到第i层小于且最接近num的元素while(curr。forward〔i〕!nullcurr。forward〔i〕。valnum){currcurr。forward〔i〕;}update〔i〕} 然后移动到下一层查找,重复直到第一层。设新加入的节点为newNode,计算这个二节点插入的层数lv,privateintrandomLevel(){intlv1;随机生成lvwhile(random。nextDouble()PFACTORlvMAXLEVEL){}} 如果level小于lv,则同时更新level。用数组update保存每一层查找的最后一个结点,第i层最后的结点为update〔i〕。将newNode的后续结点指向update〔i〕的下个节点,同时更新update〔i〕的后续结点为newNode。for(inti0;i){对第i层的状态进行更新,将当前元素的forward指向新的节点newNode。forward〔i〕update〔i〕。forward〔i〕;update〔i〕。forward〔i〕newN} 和b树比哪个效率更高 B树需要调整树结构,算法较复杂。增加和删除上需要维护索引。 跳表只需要处理链表。通过randomLevel获取lv,删除和更新时链表本身优势数据变动少,负载因子默认0。25,lv32。 跳表是Redis的有序集合zset的实现之一完整代码classSkiplist{staticfinalintMAXLEVEL32;staticfinaldoublePFACTOR0。25;privateSkiplistNprivateRpublicSkiplist(){this。headnewSkiplistNode(1,MAXLEVEL);this。level0;this。randomnewRandom();}publicbooleansearch(inttarget){SkiplistNodecurrthis。for(intilevel1;i0;i){找到第i层小于且最接近target的元素while(curr。forward〔i〕!nullcurr。forward〔i〕。valtarget){currcurr。forward〔i〕;}}currcurr。forward〔0〕;检测当前元素的值是否等于targetif(curr!nullcurr。valtarget){}}publicvoidadd(intnum){SkiplistNode〔〕updatenewSkiplistNode〔MAXLEVEL〕;Arrays。fill(update,head);SkiplistNodecurrthis。for(intilevel1;i0;i){找到第i层小于且最接近num的元素while(curr。forward〔i〕!nullcurr。forward〔i〕。valnum){currcurr。forward〔i〕;}update〔i〕}intlvrandomLevel();levelMath。max(level,lv);SkiplistNodenewNodenewSkiplistNode(num,lv);for(inti0;i){对第i层的状态进行更新,将当前元素的forward指向新的节点newNode。forward〔i〕update〔i〕。forward〔i〕;update〔i〕。forward〔i〕newN}}publicbooleanerase(intnum){SkiplistNode〔〕updatenewSkiplistNode〔MAXLEVEL〕;SkiplistNodecurrthis。for(intilevel1;i0;i){找到第i层小于且最接近num的元素while(curr。forward〔i〕!nullcurr。forward〔i〕。valnum){currcurr。forward〔i〕;}update〔i〕}currcurr。forward〔0〕;如果值不存在则返回falseif(currnullcurr。val!num){}for(inti0;i){if(update〔i〕。forward〔i〕!curr){}对第i层的状态进行更新,将forward指向被删除节点的下一跳update〔i〕。forward〔i〕curr。forward〔i〕;}更新当前的levelwhile(level1head。forward〔level1〕null){}}privateintrandomLevel(){intlv1;随机生成lvwhile(random。nextDouble()PFACTORlvMAXLEVEL){}}}classSkiplistNode{SkiplistNode〔〕publicSkiplistNode(intval,intmaxLevel){this。this。forwardnewSkiplistNode〔maxLevel〕;}} 链接WilliamPughSkipLists:AProbabilisticAlternativetoBalancedTrees 力扣leetcode设计跳表 数据结构跳表skiplistOvercautious的博客CSDN博客跳表数据库randomlevel什么用