首页 > 其他 > 详细

SkipList

时间:2015-10-14 15:54:10      阅读:246      评论:0      收藏:0      [点我收藏+]

SkipList

1、插入操作。

  由于跳表数据结构整体上是有序的,所以在插入时,需要首先查找到合适的位置,然后就是修改指针(和链表中操作类似),然后更新跳表的level变量。

  技术分享

  

boolean insert(l,key,value) 
    register list l;
    register keyType key;
    register valueType value;
{
  register int k;
  // 使用了update数组
  node update[MaxNumberOfLevels];
  register node p,q;
  p = l->header;
  k = l->level;
  /*******************1步*********************/
  do {
        // 查找插入位置
        while (q = p->forward[k], q->key < key)
            p = q;
        
        // 设置update数组
        update[k] = p;
    } while(--k>=0);    // 对于每一层进行遍历
    
    // 这里已经查找到了合适的位置,并且update数组已经
    // 填充好了元素
   if (q->key == key)
   {
     q->value = value;
     return(false);
   };
    
   // 随机生成一个层数
   k = randomLevel();  
  if (k>l->level) 
  {
      // 如果新生成的层数比跳表的层数大的话
    // 增加整个跳表的层数
    k = ++l->level;
    // 在update数组中将新添加的层指向l->header
    update[k] = l->header;
  };
        
  /*******************2步*********************/
  // 生成层数个节点数目
  q = newNodeOfLevel(k);
  q->key = key;
  q->value = value;
      
  // 更新两个指针域
  do 
  {
        p = update[k];
        q->forward[k] = p->forward[k];
        p->forward[k] = q;
    } while(--k>=0);
    
    // 如果程序运行到这里,程序已经插入了该节点
  return(true);
} 

 2、删除某个节点。

  和插入是相同的,首先查找需要删除的节点,如果找到了该节点的话,那么只需要更新指针域,如果跳表的level需要更新的话,进行更新。

  技术分享

参考:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html

SkipList

原文:http://www.cnblogs.com/tekkaman/p/4877564.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!