跳跃表
首先,跳跃表是一种有序的数据结构,其查找的平均复杂度为O(logN),最坏的时间复杂度为O(N),大部分情况下可以与平衡树媲美。Redis使用它作为有序集合的实现,和集群节点中作为数据结构。
跳跃表的数据结构定义如下,左边为node,右边为表:
其中左图的后退指针是用来进行反向遍历链表,而成员对性robj必须为唯一的,每个节点的层高是1-32中的随机数。
整数集合
整数不多的时候作为集合的底层实现,其数据结构的定义如下:
各个整数元素在数组中按大小顺序排列,且没有重复项。注意contents中的元素类型取决于编码方式,而不是int8_t
升级
何为升级?当把一个元素添加到整数集合时,如果新元素的类型比原来contents的元素类型要长时,就要先进行升级。所以添加元素的时间复杂度为O(N),而且不支持数组的降级~
- 根据新元素的类型在原来的contents基础上扩大容量
- 将旧的元素移动过去(倒着移动)
- 将新元素加入
这种自动升级有啥好处呢?
首先肯定是方便,加入元素的时候无需考虑大小范围,不够了它会自己增长;其次,节约内存,只有需要的时候才用到大的整数int64~