c++实现跳跃表(Skip List)的方法示例

2020-01-06 17:43:02王冬梅

c,list,skip,skiplist,排行榜

通过上面的跳表的很容易设计这样的数据结构:

定义每个节点类型:


typedef struct nodeStructure *node;
typedef struct nodeStructure
{
 keyType key; // key值
 valueType value; // value值
 // 向前指针数组,根据该节点层数的
 // 不同指向不同大小的数组
 node forward[1]; 
};

c,list,skip,skiplist,排行榜

上面的每个结构体对应着图中的每个节点,如果一个节点是一层的节点的话(如7,12等节点),那么对应的forward将指向一个只含一个元素的数组,以此类推。

定义跳表数据类型:


// 定义跳表数据类型
typedef struct listStructure{
 int level; 
 struct nodeStructure * header;
} * list; 

先不看代码先用图来描述一下Skip List构造,插入和删除的过程:

构造Skip List

       1、给定一个有序的链表。

       2、选择连表中最大和最小的元素,然后从其他元素中按照一定算法(随机)随即选出一些元素,将这些元素组成有序链表。这个新的链表称为一层,原链表称为其下一层。

       3、为刚选出的每个元素添加一个指针域,这个指针指向下一层中值同自己相等的元素。Top指针指向该层首元素

       4、重复2、3步,直到不再能选择出除最大最小元素以外的元素。

c,list,skip,skiplist,排行榜

插入过程

例子:插入 119, level = 2

c,list,skip,skiplist,排行榜

如果 K 大于链表的层数,则要添加新的层。

例子:插入 119, K = 4

c,list,skip,skiplist,排行榜

删除 21

c,list,skip,skiplist,排行榜

看到这就很清楚了,上面已经提到所谓的Skip List是每层从它的下一层按照某种规律抽出一些元素,它的操作也很简单,它的操作其实按层来操作链表,基本上是从上往下来操作。