https://www.jianshu.com/p/fcd18946994enode
跳表是一种随机化的数据结构
跳表具备以下性质:mysql
void SkipList::insertNode(int key, void *data) { SkipListNode *update[MAX_LEVEL]; SkipListNode *curr = head; // 寻找每一层上待插入节点以前的节点 for(int i = MAX_LEVEL - 1; i >= 0; --i) { if(curr->next_nodes[i] == tail || curr->next_nodes[i]->key > key) update[i] = curr; else { while(curr->next_nodes[i] != tail && curr->next_nodes[i]->key < key) curr = curr->next_nodes[i]; if(curr->next_nodes[i] != tail && curr->next_nodes[i]->key == key) { curr->next_nodes[i]->data = data; return; } update[i] = curr; } } // 生成待插入节点 int level = RandomLevel(); SkipListNode *temp = new SkipListNode; temp->key = key; temp->data = data; temp->level = level; temp->next_nodes = new SkipListNode *[level + 1]; // 在每层上的链表中插入节点 for(int i = 0; i <= level; ++i) { temp->next_nodes[i] = update[i]->next_nodes[i]; update[i]->next_nodes[i] = temp; } } //级别越高,几率越小 int SkipList::RandomLevel(void) { int level = 0; while(rand() % 2 && level < MAX_LEVEL - 1) ++level; return level; }
Redis 有序集合和集合同样也是string类型元素的集合,且不容许重复的成员。不一样的是每一个元素都会关联一个double类型的分数。redis正是经过分数来为集合中的成员进行从小到大的排序。有序集合的成员是惟一的,但分数(score)却能够重复。集合是经过哈希表实现的,因此添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每一个集合可存储40多亿个成员)。固然,redis一样支持对无序集合的sort输出。可是显然更为耗时。c++
redis 127.0.0.1:6379> ZADD runoobkey 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD runoobkey 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
Redis做者为了适合本身功能的须要,对原来的跳跃表进行了一下修改:web