Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

注:

ZRANGE key start stop [WITHSCORES] 由索引返回一个成员范围的有序集合(从低到高)

 

Redis数据结构与对象(跳跃表)

 

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

 

Redis数据结构与对象(跳跃表)

 

 

 

 

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

 

 

Redis数据结构与对象(跳跃表)

Redis数据结构与对象(跳跃表)

 

skiplist与平衡树、哈希表的比较

(1) skiplist 和各种树(如AVL树、红黑树等)的元素是有序排列的,而哈希表不是有序的。因此,在哈希表上只能做单个key的查找,不适宜做范围查找。

注:范围查找,指的是查找那些大小在指定的两个值之间的所有节点。

 

(2)在做范围查找的时候,平衡树比skiplist操作要复杂。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。而在skiplist 上进行范围查找就非常简单,只需要在找到小值之后,对第1层链表进行若干步的遍历就可以实现。

 

(3)平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。

 

(4)从内存占用上来说,skiplist 比平衡树更灵活一 些。一 般来说,平衡树每个节点包含2个指针(分别指向左右子树),而skiplist每个节点包含的指针数目平均为1/(1-p), 具体取决于参数p的大小。如果像Redis里的实现一样, 取p=1/4, 那么平均每个节点包含1.33 个指针,比平衡树更有优势。

 

(5)查找单个key, skiplist 和平衡树的时间复杂度都为O(logn),大体相当:而哈希表在保持较低的哈希值冲突概率的前提下,查找时间复杂度接近0(1),性能更高一些。 所以我们平常使用的各种Map或dictionary结构,大都是基于哈希表实现的。

 

(6)从算法实现难度上来比较,skiplist 比平衡树要简单得多

 

摘录自: redis设计与实现(第二版)

相关文章: