Skip to content

Commit 0e54e90

Browse files
authored
跳表跳转逻辑描述不清
参考源码: 循环中比较时,实际比的是当前节点的forward指针对应的节点的score和ele ``` for (i = zsl->level-1; i >= 0; i--) { /* store rank that is crossed to reach the insert position */ rank[i] = i == (zsl->level-1) ? 0 : rank[i+1]; while (x->level[i].forward && (x->level[i].forward->score < score || (x->level[i].forward->score == score && sdscmp(x->level[i].forward->ele,ele) < 0))) { x = x->level[i].forward; } update[i] = x; } ```
1 parent d9e2e6b commit 0e54e90

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

redis/data_struct/data_struct.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -804,10 +804,10 @@ typedef struct zskiplist {
804804

805805
查找一个跳表节点的过程时,跳表会从头节点的最高层开始,逐一遍历每一层。在遍历某一层的跳表节点时,会用跳表节点中的 SDS 类型的元素和元素的权重来进行判断,共有两个判断条件:
806806

807-
- 如果当前节点的权重「小于」要查找的权重时,跳表就会访问该层上的下一个节点。
808-
- 如果当前节点的权重「等于」要查找的权重时,并且当前节点的 SDS 类型数据「小于」要查找的数据时,跳表就会访问该层上的下一个节点。
807+
- 如果当前节点指向的下一个节点(forward指向的节点)的权重「小于」要查找的权重时,跳表就会访问该层上的下一个节点。
808+
- 如果当前节点指向的下一个节点(forward指向的节点)的权重「等于」要查找的权重时,并且下一个节点的 SDS 类型数据「小于」要查找的数据时,跳表就会访问该层上的下一个节点。
809809

810-
如果上面两个条件都不满足,或者下一个节点为空时,需要先根据当前节点的*backward 后向指针跳回前一个节点,使用该节点的 level 数组里的下一层指针,然后沿着下一层指针继续查找,这就相当于跳到了下一层接着查找。
810+
如果上面两个条件都不满足,或者下一个节点为空时,跳表就会使用目前遍历到的节点的 level 数组里的下一层指针,然后沿着下一层指针继续查找,这就相当于跳到了下一层接着查找。
811811

812812
举个例子,下图有个 3 层级的跳表。
813813

0 commit comments

Comments
 (0)