Hbase 数据结构--跳跃表

简介

在HBASE中,跳跃表有是应用在MEM上做为查询有若干的平衡数据结构像:B树、红黑树、AVL树等,这类树在大的数据量存储上会有些性能上的瓶颈。

于是搜索理论,然后找B站学习了一下相关视频:

若干数据结构讲究CRUD操作,今天我们来简单地把这些原理性问题解释一下,看看跳跃表是如何实现这类操作的。

同时,跳跃表有各个版本,版本的逻辑细节上有些出入,大体都一样的,然后找了其他博客一些案例作为解释:

 

数据结构

先说一下这个常用的数据结构几个特点:

(1) 由很多层结构组成

(2) 最底层(Level 1)的链表是双向有序链表,上面每一层是单向有序链表   

(3) 最底层(Level 1)的链表包含所有元素

(4) 除最底层(Level 1)的链表,上面的元素如果一个元素出现在 Level i 的链表中,则它在 Level i 之下的链表也都会出现。

(5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素。

 

C:增加

C也就是我们说的增加数据

STEP1:产生随机数

1 import random
2 
3 def random_level():
4     k = 1
5     while random.randint(0,1):
6         k += 1
7     return k

用这个随机数来决定当前增加的层级,如果为真则增加一层,直到停止; :有些表的操作是直接加入层级,比如k = 1 就将增加上一层或Kn层,根据随机数来决定增加几层。

STEP2:插入

利用前面生面的层级k ,决定插入的层级数,这里引用了别人的案例;

例子:插入 119, K = 2

 

如果 K 大于链表的层数,则要添加新的层。

例子:插入 119, K = 4

 

R:删除

删除还是比较容易的,跳跃树有一个特点,就是第一层是双面链表,上面的层级都是单向链表,所以只需修改链表指针即可实现删除操作;

例子:删除 71

 

U:更新

更新的操作实际就是二个操作,即增加+删除操作。

当数据存在我们的列表中,则直接更新即可以。

如果数据不在我们的列表中,先将列表元素删除,然后增加,最后将指针修正正确。

 

D:搜索

搜索就so easy了,从最顶层开始找,找不到就下沉一层一直找到为止,当然有可能找不到;

 

例子:查找元素 117

(1) 比较 21, 比 21 大,往后面找

(2) 比较 37,   比 37大,比链表最大值小,从 37 的下面一层开始找

(3) 比较 71,  比 71 大,比链表最大值小,从 71 的下面一层开始找

(4) 比较 85, 比 85 大,从后面找

(5) 比较 117, 等于 117, 找到了节点。

 

ref : https://www.cnblogs.com/thrillerz/p/4505550.html

 

posted @ 2021-04-03 21:30  lenomail  阅读(230)  评论(0编辑  收藏  举报