屏蔽*.backup (#4)

This commit is contained in:
LingZhaoHui 2022-11-27 20:42:00 +08:00 committed by GitHub
parent fd77ab5eb0
commit 3f192946e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 1 additions and 78 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.backup

View File

@ -1,78 +0,0 @@
## 简介
跳跃表将有序链表中的部分节点分层,每一层都是一个有序链表。在查找时优先从最高层开始向后查找,
当到达某节点时如果next节点值大于要查找的值或next指针指向NULL则从当前节点下降一层继续向后
查找这样可以有效提升效率。如下图所示使用跳表查找51的路径为1->21->41->51需要查找4次。如果使
用链表查找路径为1->11->21->31->41->51需要查找6次效率明显提升了当数据量较大是提升更为明显。
![pic](./skiplist0001.png)
跳跃表的实现过程下图所示:
![skiplist0001](./skiplist0002.png)
- 跳跃表由很多层构成。
- 跳跃表有一个头header节点头节点中有一个64层的结构每层的结构包含指向本层的下个节点的指针指向本层下个节点中间所跨越的节点个数为本层的跨度span
- 除头节点外层数最多的节点的层高为跳跃表的高度level上图中跳跃表的高度为3。
- 每层都是一个有序链表,数据递增。
- 除header节点外一个元素在上层有序链表中出现则它一定会在下层有序链表中出现。
- 跳跃表每层最后一个节点指向NULL表示本层有序链表的结束。
- 跳跃表拥有一个tail指针指向跳跃表最后一个节点。
- 最底层的有序链表包含所有节点最底层的节点个数为跳跃表的长度length不包括头节点
- 每个节点包含一个后退指针头节点和第一个节点指向NULL其他节点指向最底层的前一个节点。
跳跃表每个节点维护了多个指向其他节点的指针,所以在跳跃表进行查找、插入、删除操作时可以跳过
一些节点,快速找到操作需要的节点。归根结底,跳跃表是以牺牲空间的形式来达到快速查找的目的。
## 跳跃表数据结构
跳跃表由多个节点构成,每个节点由很多层构成,每层都有指向本层下个节点的指针,接下来讲述跳跃表的数据结构。
### 跳跃表节点结构
下面我们来看跳跃表节点的zskiplistNode结构体:
```c
typedef struct zskiplistNode {
sds ele;
double score;
struct zskiplistNode *backward;
struct zskiplistLevel {
struct zskiplistNode *forward;
unsigned long span;
} level[];
} zskiplistNode;
```
- ele用于存储字符串类型的数据。
- score用于存储排序的分值todo分值计算方法
- backward后退指针只能指向当前节点最底层的前一个节点头节点和第一个节点——backward指向NULL从后向前遍历跳跃表时使用。
- level为柔性数组。每个节点的数组长度不一样在生成跳跃表节点时随机生成一个164的值值越大出现的概率越低。level数组的每项包含以下两个元素。
- forward指向本层下一个节点尾节点的forward指向NULL。
- spanforward指向的节点与本节点之间的元素个数。span值越大跳过的节点个数越多。
跳跃表是Redis有序集合的底层实现方式之一所以每个节点的ele存储有序集合的成员member值score存储成员score值。
所有节点的分值是按从小到大的方式排序的当有序集合的成员分值相同时节点会按member的字典序进行排序。
### 跳跃表结构
除了跳跃表节点外还需要一个跳跃表结构来管理节点Redis使 用zskiplist结构体定义如下
```c
typedef struct zskiplist {
struct zskiplistNode *header, *tail;
unsigned long length;
int level;
} zskiplist;