最新要闻
- 当前动态:Wine 8.1版本正式发布:首次默认启用“Windows 10”前缀
- 为博眼球太奇葩 四川男子用扳手代替方向盘开车拍视频:结果被扣4分
- 今日热闻!苹果刚发布的2299元新品HomePod 2仅支持老掉牙Wi-Fi 4:原因不服不行
- “聪明的”ChatGPT 是否拥有生命?
- 天天热议:速度是根本!威刚UE800 U盘评测:真正跑满1GB/s
- 报道:韩国刷新世界最低生育率纪录:无人店铺数量持续增长 人工智能需求强
- 苹果营收4年来首降 库克:裁员是最后手段
- 低于20万会买吗?特斯拉新款Model 3外形曝光:续航、动力大增
- 天天热讯:今晚油价或迎年内第二次上调:预计每升上涨0.17元
- 播报:奔驰销售吐槽:向每位进店客户推荐买新能源 直到客户崩溃或打我
- 全球焦点!微软回应Xbox 360商店关闭:只是搞错了
- 全球最新:每逢佳节胖三斤 专家提醒:节后运动“甩膘”要注意三点
- 环球快报:13倍浓缩:日本隅田川胶囊咖啡1.16元/杯史低
- 充会员才解封?爱奇艺回应一号三用被封:技术故障 跳转错误页面
- 《卧龙》天柱山介绍公开:红晶小姐姐美如画!
- 天天热点!对Intel穷追猛打!AMD Zen4c 128核心上半年杀来
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球快看:跳表java实现(可直接运行)
(资料图片仅供参考)
跳表类
package com.yjz.example.跳表;/** * @author: yuanjinzhong * @date: 2023/1/28 3:00 PM * @description: * 跳表类,参考项目:https://github.com/wangzheng0822/algo/blob/b2c1228ff915287ad7ebeae4355fa26854ea1557/java/17_skiplist/SkipList2.java#L119 * 跳表里面每个值只有一个节点,每个节点含有该节点在每一层的下一个节点 * */public class SkipList { /** 晋升成为索引的概率 ---新插入的节点有{@linkplain SKIP_LIST_P}的概率成为索引; redis设置的是0.25的概率晋升为索引 */ public static final double SKIP_LIST_P = 0.5; /** 跳表的最大高度,包括原始skipList */ private static final int MAX_LEVEL = 8; /** 跳表的当前高度 */ private int levelCount = 1; /** 头节点,每个skipList都需要一个头节点,但是打印的时候不会打印出来 */ public Node head = new Node(MAX_LEVEL); /** * 插入元素 * * @param e * @return */ public void insert(int e) { int level = head.nextInEachLayer[0] == null ? 1 : randomLevel(); /** * 一层一层的增加索引, * *
若随机的层数比当前最大值大(或者大很多),那么只向上增加一层索引; * *
不然可能出现,其他节点都在同一层,这个新插入的索引,单独七八层 * *
不过可以不加,看个人理解 */ if (level > levelCount) { /** 俩种策略 */ level = ++levelCount; // levelCount=level; } Node newNode = new Node(level); newNode.data = e; Node p = head; for (int i = levelCount - 1; i >= 0; i--) { /** * 为啥不比较p.data?因为p是头节点啊,头节点没有值;所以比较:p.nextInEachLayer[i].data * *
p.nextInEachLayer[i].data其实就是第一个真实的节点 */ while (p.nextInEachLayer[i] != null && p.nextInEachLayer[i].data < e) { p = p.nextInEachLayer[i]; } /** * i=levelCount-1,levelCount会大于当前随机出来的level;也就是i会大于level * *
新插入的节点只有level层,高于该层的层数肯定不需要维护后继指针 */ if (level > i) { /** * 插入值,就插在{@link p和p的后继 }之间 * *
有的实现还判断p.nextInEachLayer[i]是否为空,其实大可不必 */ Node temp = p.nextInEachLayer[i]; p.nextInEachLayer[i] = newNode; newNode.nextInEachLayer[i] = temp; } } } /** * 查找 * * @param e * @return */ public Node find(int e) { Node p = head; // 从最高层开始查找 for (int i = levelCount - 1; i >= 0; i--) { while (p.nextInEachLayer[i] != null && p.nextInEachLayer[i].data < e) { p = p.nextInEachLayer[i]; System.out.println("查找路径" + p); } } System.out.println("最终确定的节点" + p); // 肯定是到跳表最下面一层查找 if (p.nextInEachLayer[0] != null && p.nextInEachLayer[0].data == e) { return p.nextInEachLayer[0]; } return null; } /** * 删除元素 * * @param e */ public void delete(int e) { Node p = head; Node[] preNodes = new Node[levelCount]; for (int i = levelCount - 1; i >= 0; i--) { while (p.nextInEachLayer[i] != null && p.nextInEachLayer[i].data < e) { p = p.nextInEachLayer[i]; } // 将目标节点的每一层前驱节点保存下来(这个层数多了,下面数值相等判断过滤了) preNodes[i] = p; } if (p.nextInEachLayer[0] != null && p.nextInEachLayer[0].data == e) { for (int i = levelCount - 1 - 1; i >= 0; i--) { if (preNodes[i].nextInEachLayer[i] != null && preNodes[i].nextInEachLayer[i].data == e) { preNodes[i].nextInEachLayer[i] = preNodes[i].nextInEachLayer[i].nextInEachLayer[i]; } } } // 悬浮在上方的空引用删除 while (levelCount > 1 && head.nextInEachLayer[levelCount] == null) { levelCount--; } } /** * 期望建立的索引结构, * *
正金字塔结构 每一层是下一层的1/2的元素数量 * *
最下面一层,完整的链表 最下面第二层(1级索引),1/2的节点做索引 最下面第二层(2级索引),1/2的1/2节点做索引 * *
新加入一个节点,则有1/2的可能是1级索引 有1/4的可能是2级索引 有1/8的可能是3级索引 (是2级索引的同时肯定也是1级索引,3级索引的同时肯定也是1级和2级索引) * *
该方法会随机生成 1~MAX_LEVEL 之间的数(MAX_LEVEL表示索引的最高层数), * *
且该方法有 1/2 的概率返回 1、 1/4 的概率返回 2、 1/8的概率返回 3,以此类推 * *
1,2,3,4 不是对应 1,2,3,4级索引,需要减1,才等于索引的级别 *
randomLevel() 方法返回 1 表示当前插入的该元素不需要建索引,只需要存储数据到原始链表即可(概率 1/2) * randomLevel() 方法返回 2 表示当前插入的该元素需要建一级索引(概率 1/4) * randomLevel() 方法返回 3 表示当前插入的该元素需要建二级索引(概率 1/8) * randomLevel() 方法返回 4 表示当前插入的该元素需要建三级索引(概率 1/16) * 以此类推。。。 * * *
返回1不建立索引,大于1则必定会建一级索引,大于1的概率为1-1/2=二分之一, * 大于2必然会创建二级索引,大于2的概率为1-1/2-1/4=四分之1 * 类推 * * @return */ public int randomLevel() { int level = 1; /** 随机数连续2次小于1/2才会使得level+1(第一次加1),即level+1(第一次加1)的概率为1/2乘以1/2= 1/4) */ // 当 level < MAX_LEVEL,且随机数小于设定的晋升概率时,level + 1 while (Math.random() < SKIP_LIST_P && level < MAX_LEVEL) { level += 1; } return level; } public void printAll() { Node p = head; while (p.nextInEachLayer[0] != null) { System.out.print(p.nextInEachLayer[0] + " "); p = p.nextInEachLayer[0]; } System.out.println(); } public static void main(String[] args) { SkipList skipList = new SkipList(); skipList.insert(3); skipList.insert(1); skipList.insert(2); skipList.insert(6); skipList.insert(9); skipList.insert(8); skipList.printAll(); System.out.println("跳表的当前高度:" + skipList.levelCount); System.out.println("查找到的结果" + skipList.find(6)); System.out.println("++++++++++++++++删除节点之后打印数据++++++++++++++++++"); skipList.delete(6); skipList.printAll(); }}
节点类
package com.yjz.example.跳表;/** * @author: yuanjinzhong * @date: 2023/1/28 2:49 PM * @description: * 跳表节点,存储正整数 *
每个值只有一个node节点 *
如何表示层级关系呢? *
使用{@linkplain nextInEachLayer[]}来表示该节点在不同层级的后驱节点 */public class Node { // 数据域,默认-1,因为想存储正整数嘛 int data = -1; /** * 普通的链表使用next或者pre指针指向前驱和后继 * *
这里使用{@linkplain nextInEachLayer[]}来表示该节点在不同层级的后驱节点 * *
数组下标表示层级 */ Node nextInEachLayer[]; // 该节点的最大层级 int maxLevelOfThisNode; /** * 新键节点的时候,就已经知道该节点有几层,就知道该节点需要维护几层的后驱节点 * * @param level */ Node(int level) { this.maxLevelOfThisNode = level; this.nextInEachLayer = new Node[level]; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("{ data: "); builder.append(data); builder.append("; levels: "); builder.append(maxLevelOfThisNode); builder.append(" }"); return builder.toString(); }}
关键词: 以此类推
-
环球快看:跳表java实现(可直接运行)
跳表类packagecom yjz example 跳表; ***@author:yuanjinzhong*@date:2023 1 283:00PM*@descriptio
来源: 环球快看:跳表java实现(可直接运行)
热消息:[概率论与数理统计]笔记:5.5 单正态总体的参数假设检验
依赖注入(DI注入)
当前动态:Wine 8.1版本正式发布:首次默认启用“Windows 10”前缀
为博眼球太奇葩 四川男子用扳手代替方向盘开车拍视频:结果被扣4分
今日热闻!苹果刚发布的2299元新品HomePod 2仅支持老掉牙Wi-Fi 4:原因不服不行
“聪明的”ChatGPT 是否拥有生命?
天天热议:速度是根本!威刚UE800 U盘评测:真正跑满1GB/s
世界新动态:【算法训练营day38】动态规划理论基础 LeetCode509. 斐波那契数 LeetCode70. 爬楼梯 LeetCode746. 使用最小花
报道:韩国刷新世界最低生育率纪录:无人店铺数量持续增长 人工智能需求强
苹果营收4年来首降 库克:裁员是最后手段
低于20万会买吗?特斯拉新款Model 3外形曝光:续航、动力大增
天天热讯:今晚油价或迎年内第二次上调:预计每升上涨0.17元
播报:奔驰销售吐槽:向每位进店客户推荐买新能源 直到客户崩溃或打我
Webpack解析与讲解
全球焦点!微软回应Xbox 360商店关闭:只是搞错了
全球最新:每逢佳节胖三斤 专家提醒:节后运动“甩膘”要注意三点
天天快资讯丨el表达式注入漏洞
环球快报:13倍浓缩:日本隅田川胶囊咖啡1.16元/杯史低
充会员才解封?爱奇艺回应一号三用被封:技术故障 跳转错误页面
《卧龙》天柱山介绍公开:红晶小姐姐美如画!
天天热点!对Intel穷追猛打!AMD Zen4c 128核心上半年杀来
突然暴雷!世界第一辆量产太阳能汽车 黄了
讯息:操作系统的体系结构
天天热头条丨2023年新势力首月销量成绩单:理想最显眼 零跑暴跌
全球新资讯:蔚来大降价超10万?总裁回应:没有 展车最多2.4万优惠
【全球报资讯】比尔·盖茨盛赞ChatGPT:称其“不亚于互联网诞生”
环球视点!女子拍抖音私闯已关闭自然保护区 或处5000元以下罚款
一个手机号搞定!微信正式支持注册小号:生活、工作能分开吗?
世界语言的分布是什么?世界语言难度排行
三星手机怎么截屏图片?三星手机如何防盗?
韩国游戏公司有哪些?韩国游戏公司排名
穿越火线什么时候出的?穿越火线怎么安装?
饱和石灰水是什么意思?饱和石灰水变浑浊的原因是什么?
诺基亚5000刚出来是多少钱?诺基亚5000手机参数
宽带连接怎么创建?宽带连接怎么设置到桌面上?
一次JSF上线问题引发的MsgPack深入理解,保证对你有收获
全球快看点丨springboot实战——总结
全球观点:(笔记)【NTP系列:05】NTP时间同步失败:Windows(W32Time)作为NTP时钟源服务端,Linux作为客户端
[概率论与数理统计]笔记:5.4 假设检验概述
西门子手机怎么样?西门子手机哪年进入中国?
联想y470双显卡驱动怎么装?联想y470双显卡怎么切换?
dota2怎么改成国服?DOTA2配置要求是什么?
世界新动态:传奇大佬、联想PC全球第一的功臣蒋凡可·兰奇去世 享年69岁
不叫003 极氪第三款车型ZEEKR X官图发布:20万买不
世界观焦点:智商碾压 新养的边牧把养5年金毛拐跑丢弃
当前滚动:办公党等到了!小米笔记本12.4二合一发布:2.5K触屏 2999元
荣耀Magic5通过3C认证:1/1.1英寸主摄、标配66W充电头
世界关注:非常强大的gsap动画
2023年值得收藏的开源或免费的web应用防火墙
keycloak~JWT各字段说明及扩展字段的方法
苹果业绩暴雷:iPhone卖不动了!库克感谢国人支持 要降价刺激销量?
《巫师3:狩猎》4.01版更新上线:光追性能更强 帧率又高了
美国新造车告急:造一辆亏23万 CEO深感抱歉
极氪009被吐槽像灵车、棺材 车主亲身评测:死人躺并不舒适
比亚迪又一大杀器 全新海鸥出街被拍:超个性涂装上身
快看:iPhone 12/13/14灵魂设计师离职 苹果直接取消工业设计总监职位
动态焦点:男孩为网游充值4万 家长控诉腾讯监控不力未尽义务:该不该退钱?
全球微动态丨国内油价今晚调整 或迎兔年“第一涨”:加满一箱预计多花8.5元
环球滚动:20个小猫身上笑死人的奇葩花纹:只有你想不到!
萌萌哒的兔子竟是“头号杀手”!澳大利亚曾研制病毒专杀兔兔
全球新资讯:澳大利亚搞丢一枚剧毒放射性胶囊 相关单位仅被罚款1000块:下不为例?
专家称年轻人工资低可能是能力不够引争议:企业点赞 打铁还应自身硬
世界今热点:触控体验碾压iPhone 14 Pro Max!一加Ace 2做到了
火箭弹电子版领取处>>(密码博主昵称 全部小写)
天天观点:Pandas分析泰坦尼克号生还比例
天天新资讯:图卷积的演变-从谱图卷积到GCN
.NET Core 3.1 通过 Web Service 读写 Salesforce 数据
【全球新要闻】打开它 游戏性能飙升46%!NVIDIA为啥不要呢?
每日资讯:麦当劳赢了:世界第一美食APP
即时看!地球最稀有矿石就一个标本!已知6000多种矿石就它特殊
【天天速看料】《流浪地球2》票房破30亿!下一部或两年后上映
最新消息:这两年大家都在吃瘪 结果微软闷声发大财了!全靠它
视焦点讯!Spring中Bean的生命周期
一名老了的普通程序员的未来在哪里
元宵节将至:北京周五晚高峰将达严重拥堵
焦点报道:334个小核心反超AMD!Intel下代至强“增肥”70%
出厂安卓13 三星Galaxy S23承诺四次大版本迭代:包你升级Android 17
世界热点!在欧洲大陆上奔跑的中国新能源车正越来越多!当地人慌了
当前热讯:编写干净代码的 9 条必须知道的规则
有钱玩家真多!越来越多Steam用户配置RTX 4090显卡:已超2万人
Python教程:OS与sys模块用法教程
世界看点:mybatis-plus代码生成器
女子误用八千元一斤茶叶煮茶叶蛋 以为过期:网友称这茶叶蛋真吃不起
天天观天下!专家:年轻人工资低是因为能力不够 很少有人反思这问题
全球微速讯:爱奇艺回应3台设备登录账号被封:改密码能解封 不用充值更贵会员
全球滚动:PS游戏启动失败?PS日本教你如何进行问题排查
剧版一集就被砍之后 DC电影版《沼泽怪物》物色导演
订单破5万!比亚迪腾势D9登35万以上新能源豪华MPV销量第一
环球微动态丨导演评价《狂飙》:可能是可以刻在自己墓碑上的一部戏
每日快报!12.4万的保时捷带来诸多疑问 故意营销质疑越来越多!
造车新势力第一!广汽埃安1月交付10206辆 今年冲击60万辆
天天观热点:CSS 清除浮动
今日快讯:蔚来开启降价 内部员工回应:像小鹏那样直接降太没面子
彻底不冒黑烟!沃尔沃天然气重卡发布:发动机最大500马力
世界速讯:30岁中国女子在日本买70万平小岛成岛主:永久使用权
天天资讯:体育纳入高考、鲨鱼咬人?朋友圈十大谣言出炉
环球速看:800W核弹 老外猜测RTX Titan Ada售价:2.5万元都是良心价
每日信息:程序员应该专注技术,还是优雅转管理?
环球今日报丨超越三星 中国电视品牌出货量首次登顶全球第一