跳跃表的实现
来源:互联网 发布:c语言sum是什么意思 编辑:程序博客网 时间:2024/04/29 03:49
最近看redis,又看到了跳跃表,不记得什么时候在哪里做题遇到过,忍不住自己写了一个跳跃表。下面是一些核心代码。
//// Created by ma on 2015/6/29.//#ifndef SKIPLIST_H_#define SKIPLIST_H_#include <stddef.h>#define MAX_LEVEL 16class Random{public: static int randlevel(); static bool rand();private: static long seeds;};class skiplistnode{public: skiplistnode(int key=-1, int value=-1); skiplistnode* &forward(const size_t& i); int key() { return _key;} int value() { return _value;} bool insert_after(skiplistnode* p,int i); bool skip_after(int i);private: int _key; int _value; int level; skiplistnode *_forward[MAX_LEVEL];};class skiplist {public: skiplist(); ~skiplist(); bool Insert(const int& key,const int& value); bool Delete(const int& key);private: int level; skiplistnode *head;};#endif //SKIPLIST_H_
//// Created by ma on 2015/6/29.//#include <stdlib.h>#include <time.h>#include <assert.h>#include "skiplist.h"skiplistnode *&skiplistnode::forward(const size_t &i) { return _forward[i];}skiplistnode::skiplistnode(int key, int value) : _key(key), _value(value), level(0) { for (int i = 0; i < MAX_LEVEL; ++i) { _forward[i] = NULL; }}bool skiplistnode::insert_after(skiplistnode *p, int i) { p->forward(i) = this->forward(i); this->forward(i) = p; return true;}bool skiplistnode::skip_after(int i) { skiplistnode *p = this->forward(i); assert (p != NULL); this->forward(i) = p->forward(i); return true;}skiplist::skiplist() : level(MAX_LEVEL) { head = new skiplistnode(); for (int i = 0; i < MAX_LEVEL; ++i) { head->forward(i) = NULL; }}skiplist::~skiplist() {}bool skiplist::Insert(const int &key, const int &value) { skiplistnode *nodes[MAX_LEVEL]; skiplistnode *q; skiplistnode *p = head; for (size_t i = level; i >= 0; i--) { while ((q = p->forward(i)) && (q->key() < key)) p = q; nodes[i] = p; } if (q && (q->key() == key)) return false; int k = Random::randlevel(); skiplistnode *newnode = new skiplistnode(key, value); for (int j = 0; j < k; ++j) { nodes[j]->insert_after(newnode, j); } return true;}bool skiplist::Delete(const int &key) { skiplistnode *q; skiplistnode *p = head; for (size_t i = level; i >= 0; i--) { while ((q = p->forward(i)) && (q->key() < key)) p = q; if (q && (q->key() == key)) { p->skip_after(i); } } if (q && (q->key() == key)) delete (q); return true;}long Random::seeds = 0;bool Random::rand() { srand(time(NULL) + seeds++); return random() % 2;}int Random::randlevel() { int level = 0; while (rand()) level++; level = level < MAX_LEVEL ? level : MAX_LEVEL; return level;}
0 0
- 跳跃表的实现
- 跳跃表的实现
- 跳跃表的实现
- 跳跃表的实现
- 跳跃表的实现<转>
- 跳跃表实现的原理
- Redis 跳跃表的实现
- Redis 的跳跃表实现
- 跳跃表实现的原理
- redis:跳跃表的实现
- 跳跃表实现的原理
- 简单跳跃表的实现
- 跳跃表(skip list) 的实现
- 跳跃表的分析与实现
- 跳跃表的实现和测试
- 跳跃表的原理及实现
- 跳跃表的分析与实现
- 跳跃表的原理及Java实现
- LeetCode_Minimum Depth of Binary Tree
- emc面试
- Oracle关于控制文件的错误ORA-00202的处理
- MiKTeX与Texmaker 配置使用
- android的listview中setselection()不起作用的解决方案
- 跳跃表的实现
- Lucene:基于Java的全文检索引擎的简介
- 用Python发送邮件
- js中的History +
- J2EE基础总结(4)——JSP
- openwrt 修改flash中mac地址信息的基本方法
- wireshark 小技巧
- GetObject 函数的使用
- 如何使用java synchronized进行线程同步