自己动手实现java数据结构(九) 跳表

Java37

1. 跳表介绍

在之前关于数据结构的博客中介绍了两种基本数据结构:基于连续内存空间(线性表)的矢量和基于链接节点结构的链表。

[En]

Two basic data structures have been introduced in previous blogs on data structures: vectors based on continuous memory space (linear tables) and linked lists based on linked node structures.

有序的向量可以通过二分查找以logn对数复杂度完成随机查找,但由于插入/删除元素时可能导致内部数组内整体数据的平移复制,导致随机插入/删除的效率较低。而普通的一维链表结构虽然可以做到高效的插入/删除元素(只是关联的节点拓扑结构改变),但是在随机查找时却效率较低,因为其只能从头/尾节点顺序的进行遍历才能找到对应节点。

计算机科学家发明了能够兼具向量与链表优点的平衡二叉搜索树(Balance Binary Search Tree BBST),这其中红黑树是平均性能最高,也最复杂的一种BBST。

正是因为高性能的平衡二叉树过于复杂,使得计算机科学家另辟蹊径,发明了被称为 跳表(Skip List)的数据结构。跳表通过建立具有层次结构的索引节点,解决了普通链表无法进行二分查找的缺陷。跳表是基于链表的,因此其插入和删除效率和链表一样优秀;而由于索引节点的引入,也使得跳表可以以类似二分查找的形式进行特定元素的搜索,其查找性能也达到了O(logn)的对数复杂度,和有序向量以及平衡二叉树查询渐进时间复杂度一致。

总的来说,跳表是一个平均性能很优秀,结构相对简单的数据结构,在redis以及LevelDB、RocksDB等KV键值对数据库中被广泛使用。

2. 跳表工作原理

跳表查询

跳转表是具有多层索引节点的链表,最低层是链表,它保存所有原始数据节点。索引节点建立在最底层的链表节点上,索引节点的数量自下而上逐渐稀疏。

[En]

A jump table is a linked list with multi-tier index nodes, and the lowest level is a linked list, which holds all the original data nodes. The index node is built on the lowest linked list node, and the number of index nodes from bottom to top is gradually sparse.

在查询时,从最高层开始以 类似二分查找的方式 跳跃着的逐步向下层逼近查找最终的目标节点。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

类加载器ClassLoader

1.双亲委派模型 java是根据双亲委派模型的加载类的,当一个类加载器加载类时,会先尝试委托给父类加载器去加载,直到到达启动类加载器顶层若加载不了,则再让子类加载器去加载直到类成功加载,否则抛出异常。...
Java

Hibernate基础入门2

HQL与Criteria HQL(Hibernate Query Language)-官方推荐面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写...
Java

java设计模式

开闭原则:是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭 依赖反转原则:指在设计代码结构时,高级模块不应依赖于低级模块,两者都应依赖于它们的抽象而不是具体。[En]Dependency ...
Java

设计模式之责任链模式

本文通过图书馆管理系统中,用户名校验、密码校验、需要增加问题,每次都要增加if判断语句,将其改用责任链模式进行链式调用,为了让代码更加的优雅,我们使用之前学过的建造者模式就代码进行改造。接着我们会介绍...
Java

Mysql的基础知识

基础知识 多版本并发控制MVCC MVCC是怎么提高并发能力 MVCC的实现 快照读和当前读 快照读 当前读 Update的执行过程 聚簇索引和辅助索引 事务隔离级别 基础知识 多版本并发控制MVCC...
Java

TypeScript(4)接口

介绍 TypeScript 的核心原则之一是对值所具有的结构进行 类型检查。我们使用接口(Interfaces)...
Java

如何下载 blob 地址的视频资源

如何下载视频资源以blob:http开头的资源 一、问题场景 想下载知乎视频资源,却发现视频链接是这个样子的 blob:https://v.vzuu.com/b6146956-6e52-406d-89...
Java

自己挖坑自己埋

谨用于记录自己在设计时由于考虑不周导致的隐患,阿门。 2021-07-19 新近上线了《智能串接》功能,该功能类似于各种工程项目中的quickStart功能,在该模块设计时留下了两个弊端。 一是部分无...
Java

Springboot3.0+spring6.0+JDK17+配置jsp和打war包

由于某些缘故,公司的产品需要升级,但并不希望花费大量时间重写前端代码(原来的就不是前后分离的)。所以虽然spring和springboot都升级为最新的版本,但是依然还是需要支持jsp,并继续用打包为...
Java

一些基本的jar包

jackson与前端传送数据 com.fasterxml.jackson.core jackson-databind 2.13.3 lombok可以自动生成一些方法 org.projectlombok...
Java

List的同步类比较

TL;NRs CopyOnWriteArrayList类在多线程顺序读取上有很大的优势,但在随机读取上反而有较大的劣势,且在写入方面性能极差。 Vector类在顺序读取方面性能较差,但在随机读取方面有...