当做笔记记录下来:)

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

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

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

SkipList.h

 #define MAX_LEVEL 16

 typedef int KeyType;
typedef int ValueType; typedef struct nodeStructure* Node;
struct nodeStructure
{
KeyType key;
ValueType value;
Node forward[];
}; class SkipList
{
public:
SkipList();
Node createNode(int level, const KeyType& key, const ValueType& value);
void createList();
bool insert(const KeyType& key, const ValueType& value);
bool erase(const KeyType& key, ValueType& value);
bool search(const KeyType& key, ValueType& value);
private:
int randomLevel();
private:
int _level;
Node _header;
};

SkipList.cpp

 #include "SkipList.h"
#include <iostream> SkipList::SkipList()
{
_level = ;
_header = createNode(MAX_LEVEL, , );
Node tail = createNode(, 0x7fffffff, );
for (int i = ; i < MAX_LEVEL; ++i)
_header->forward[i] = tail; } Node SkipList::createNode(int level, const KeyType& key, const ValueType& value)
{
Node node = (Node)malloc(
sizeof(nodeStructure) + sizeof(Node) * level);
node->key = key;
node->value = value;
return node;
} int SkipList::randomLevel()
{
int k = ;
// 50% k++
while (rand() % )
k++;
return (k < MAX_LEVEL) ? k : MAX_LEVEL - ;
} bool SkipList::insert(const KeyType& key, const ValueType& value)
{
Node update[MAX_LEVEL];
Node node = _header;
// search
for (int i = _level; i >= ; --i)
{
while (node->forward[i]->key < key)
node = node->forward[i];
// record previous node
update[i] = node;
} // same key
if (node->forward[]->key == key)
return false; int level = randomLevel();
// update level
if (level > _level)
{
for (int i = _level + ; i <= level; ++i)
update[i] = _header;
_level = level;
} // update pointer
Node insNode = createNode(level, key, value);
for (int i = level; i >= ; --i)
{
node = update[i];
insNode->forward[i] = node->forward[i];
node->forward[i] = insNode;
}
return true;
} // similar to insert
bool SkipList::erase(const KeyType& key, ValueType& value)
{
Node update[MAX_LEVEL];
Node node = _header;
for (int i = _level; i >= ; --i)
{
while (node->forward[i]->key < key)
node = node->forward[i];
update[i] = node;
} node = node->forward[];
if (node->key != key)
return false; for (int i = ; i < _level; ++i)
{
if (update[i]->forward[i] != node)
break;
update[i]->forward[i] = node->forward[i];
}
free(node);
return true;
} bool SkipList::search(const KeyType& key, ValueType& value)
{
Node node = _header;
for (int i = _level; i >= ; --i)
// find the last node->key < key
while (node->forward[i]->key < key)
node = node->forward[i];
// node->key >= key
node = node->forward[];
if (node->key == key)
{
value = node->value;
return true;
}
return false;
}

最新文章

  1. Razor 模板自己渲染出结果 string
  2. yourphp数据库介绍
  3. android oom 全解析
  4. jquery截图插件的使用
  5. 常用的Java 架包(jar)的用途
  6. ubuntu下打开终端插件
  7. 来认识下less css
  8. 从客户端(&amp;)中检测到有潜在危险的 Request.Path 值解决方案
  9. java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
  10. EJB--事务管理 .
  11. 高性能Web框架Zend Framework
  12. 【linux操作命令】vim
  13. 【转】mysqldump
  14. WPF和Expression Blend开发实例:一个样式实现的数字输入框
  15. 【BZOJ2037】Sue的小球(动态规划)
  16. ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
  17. FreeMarker 入门
  18. 消息队列与Kafka
  19. linux gcc 静态 动态链接库
  20. WWSSN instrument response

热门文章

  1. python基础之程序交互与数据类型
  2. AC日记——Red and Blue Balls codeforces 399b
  3. “pip failed to create process”的问题
  4. Nodejs获取Azure Active Directory AccessToken
  5. nodejs 服务器重新启动
  6. HDU 6081 度度熊的王国战略【并查集/数据弱水题/正解最小割算法】
  7. POJ 2251 Dungeon Master【三维BFS模板】
  8. ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块
  9. [Contest20180328]coin
  10. 软件配置篇-java下载及安装