zoukankan      html  css  js  c++  java
  • Redis系列(十二):数据结构SortedSet跳跃表中基本操作命令和源码解析

    1.SkipList

    Redis的sortedSet数据结构是有序不重复的(索引为唯一的,数据(score)却可以重复),

    跳表是redis的一个核心组件,也同时被广泛地运用到了各种缓存地实现当中,它的主要优点,

    就是可以跟红黑树、AVL等平衡树一样,做到比较稳定地插入、查询与删除。理论插入查询删除的算法时间复杂度为O(logN)。

     2.什么是跳表

    链表,相信大家都不陌生,维护一个有序的链表是一件非常简单的事情,我们都知道,在一个有序的链表里面,查询跟插入的算法复杂度都是O(n)。

    我们能不能进行优化呢,比如我们一次比较两个呢?那样不就可以把时间缩小一半?同理,如果我们4个4个比,那不就更快了?

    跳表就是这样的一种数据结构,结点是跳过一部分的,从而加快了查询的速度。跳表跟红黑树又有什么差别呢?

    既然两者的算法复杂度差不多,

    为什么Redis要使用跳表而不使用红黑树呢?

    跳表相对于红黑树,主要有这几个优点:1.代码相对简单,手写个跳表还有可能,

    手写个红黑树试试?2.如果我们要查询一个区间里面的值,用平衡树可能会麻烦。这里的麻烦指的是实现和理解上,

    平衡二叉树查询一段区间也是可以做到的。3.删除一段区间,这个如果是平衡二叉树,就会相当困难,毕竟设计到树的平衡问题,而跳表则没有这种烦恼。

    好了,相信你对跳表已经有一些认识了,我们来简单介绍平衡二叉树的几个基本操作。

    2.源码分析

    #include<stdio.h>
    
    #include<stdlib.h>
    
     
    
    #define ZSKIPLIST_MAXLEVEL 32
    
    #define ZSKIPLIST_P 0.25
    
    #include <math.h>
    
     
    
    //跳表节点
    
    typedef struct zskiplistNode {
    
        int key;
    
        int value;
    
        struct zskiplistLevel {
    
            struct zskiplistNode *forward;
    
        } level[1];
    
    } zskiplistNode;
    
     
    
    //跳表
    
    typedef struct zskiplist {
    
        struct zskiplistNode *header;
    
        int level;
    
    } zskiplist;
  • 相关阅读:
    Python—将py文件编译成so文件
    Python—网络通信编程之套接字基本原理
    Python—IO多路复用之epoll总结
    Python—IO多路复用之poll总结
    Python—IO多路复用之select总结
    希尔排序
    直接插入排序
    冒泡排序
    选择排序(C++,Java,Python实现)
    二叉搜索树的相关功能的实现
  • 原文地址:https://www.cnblogs.com/vic-tory/p/13225111.html
Copyright © 2011-2022 走看看