SkipList的实现
2024-10-20 08:40:54
当做笔记记录下来:)
相比于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;
}
最新文章
- Razor 模板自己渲染出结果 string
- yourphp数据库介绍
- android oom 全解析
- jquery截图插件的使用
- 常用的Java 架包(jar)的用途
- ubuntu下打开终端插件
- 来认识下less css
- 从客户端(&;)中检测到有潜在危险的 Request.Path 值解决方案
- java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
- EJB--事务管理 .
- 高性能Web框架Zend Framework
- 【linux操作命令】vim
- 【转】mysqldump
- WPF和Expression Blend开发实例:一个样式实现的数字输入框
- 【BZOJ2037】Sue的小球(动态规划)
- ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot
- FreeMarker 入门
- 消息队列与Kafka
- linux gcc 静态 动态链接库
- WWSSN instrument response
热门文章
- python基础之程序交互与数据类型
- AC日记——Red and Blue Balls codeforces 399b
- “pip failed to create process”的问题
- Nodejs获取Azure Active Directory AccessToken
- nodejs 服务器重新启动
- HDU 6081 度度熊的王国战略【并查集/数据弱水题/正解最小割算法】
- POJ 2251 Dungeon Master【三维BFS模板】
- ASP.NET Core 2.2 基础知识(十一) ASP.NET Core 模块
- [Contest20180328]coin
- 软件配置篇-java下载及安装