zoukankan      html  css  js  c++  java
  • SkipList的实现

    当做笔记记录下来:)

    相比于bTree,skiplist占用更多的空间。

    而在并发的环境下skiplist会比bTree效率更高。

    (bTree插入的时候需要rebalance,需要lock比较多的结点,而skiplist则只需要lock跟node相关的几个结点)

    SkipList.h

     1 #define MAX_LEVEL 16
     2 
     3 typedef int KeyType;
     4 typedef int ValueType;
     5 
     6 typedef struct nodeStructure* Node;
     7 struct nodeStructure
     8 {
     9     KeyType key;
    10     ValueType value;
    11     Node forward[1];
    12 };
    13 
    14 class SkipList
    15 {
    16 public:
    17     SkipList();
    18     Node createNode(int level, const KeyType& key, const ValueType& value);
    19     void createList();
    20     bool insert(const KeyType& key, const ValueType& value);
    21     bool erase(const KeyType& key, ValueType& value);
    22     bool search(const KeyType& key, ValueType& value);
    23 private:
    24     int randomLevel();
    25 private:
    26     int _level;
    27     Node _header;
    28 };
    View Code

    SkipList.cpp

      1 #include "SkipList.h"
      2 #include <iostream>
      3 
      4 SkipList::SkipList()
      5 {
      6     _level = 0;
      7     _header = createNode(MAX_LEVEL, 0, 0);
      8     Node tail = createNode(1, 0x7fffffff, 0);
      9     for (int i = 0; i < MAX_LEVEL; ++i) 
     10         _header->forward[i] = tail;
     11         
     12 }
     13 
     14 Node SkipList::createNode(int level, const KeyType& key, const ValueType& value)
     15 {
     16     Node node = (Node)malloc(
     17         sizeof(nodeStructure) + sizeof(Node) * level);
     18     node->key = key;
     19     node->value = value;
     20     return node;
     21 }
     22 
     23 int SkipList::randomLevel()
     24 {
     25     int k = 1;
     26     // 50% k++
     27     while (rand() % 2)
     28         k++;
     29     return (k < MAX_LEVEL) ? k : MAX_LEVEL - 1;
     30 }
     31 
     32 bool SkipList::insert(const KeyType& key, const ValueType& value)
     33 {
     34     Node update[MAX_LEVEL];
     35     Node node = _header;
     36     // search
     37     for (int i = _level; i >= 0; --i)
     38     {
     39         while (node->forward[i]->key < key)
     40             node = node->forward[i];
     41         // record previous node
     42         update[i] = node;
     43     }
     44 
     45     // same key
     46     if (node->forward[0]->key == key)
     47         return false;
     48 
     49     int level = randomLevel();
     50     // update level
     51     if (level > _level)
     52     {
     53         for (int i = _level + 1; i <= level; ++i)
     54             update[i] = _header;
     55         _level = level;
     56     }
     57 
     58     // update pointer
     59     Node insNode = createNode(level, key, value);
     60     for (int i = level; i >= 0; --i)
     61     {
     62         node = update[i];
     63         insNode->forward[i] = node->forward[i];
     64         node->forward[i] = insNode;
     65     }
     66     return true;
     67 }
     68 
     69 // similar to insert
     70 bool SkipList::erase(const KeyType& key, ValueType& value)
     71 {
     72     Node update[MAX_LEVEL];
     73     Node node = _header;
     74     for (int i = _level; i >= 0; --i)
     75     {
     76         while (node->forward[i]->key < key)
     77             node = node->forward[i];
     78         update[i] = node;
     79     }
     80 
     81     node = node->forward[0];
     82     if (node->key != key)
     83         return false;
     84 
     85     for (int i = 0; i < _level; ++i)
     86     {
     87         if (update[i]->forward[i] != node)
     88             break;
     89         update[i]->forward[i] = node->forward[i];
     90     }
     91     free(node);
     92     return true;
     93 }
     94 
     95 bool SkipList::search(const KeyType& key, ValueType& value)
     96 {
     97     Node node = _header;
     98     for (int i = _level; i >= 0; --i)
     99         // find the last node->key < key
    100         while (node->forward[i]->key < key)
    101             node = node->forward[i];
    102     // node->key >= key
    103     node = node->forward[0];
    104     if (node->key == key)
    105     {
    106         value = node->value;
    107         return true;
    108     }
    109     return false;
    110 }
    View Code
  • 相关阅读:
    jython resources
    Installing a Library of Jython ScriptsPart of the WebSphere Application Server v7.x Administration Series Series
    jython好资料
    ulipad install on 64bit win7 has issue
    an oracle article in high level to descibe how to archtichre operator JAVA relevet project
    table的宽度,单元格内换行问题
    Linux常用命令大全
    dedecms系统后台登陆提示用户名密码不存在
    登录织梦后台提示用户名不存在的解决方法介绍
    Shell常用命令整理
  • 原文地址:https://www.cnblogs.com/runnyu/p/5917626.html
Copyright © 2011-2022 走看看