X Tutup
#include "skiplist.h" #include #include #include skiplist::skiplist():max_level_(1) { head_ = new node_t(INT_MIN, 1); srand(time(0)); } skiplist::~skiplist() { auto p = head_; while (p) { auto d = p; p = p->next[0]; delete d; } } void skiplist::insert(int val) { int level = random_generate_level(); auto p = new node_t(val, level); node_t** pre = new node_t*[level]; for (int i = 0; i < level; ++i) { pre[i] = head_; } // node_t* cur = head_; for (auto i = level - 1; i >= 0; --i)//最高层开始 { //每层遍历 找到小于val的最后一个节点 while (cur->next[i] != nullptr && cur->next[i]->val < val) cur = cur->next[i]; // pre[i] = cur; } // for (size_t i = 0; i < level; i++) { p->next[i] = pre[i]->next[i]; pre[i]->next[i] = p; } max_level_ = level > max_level_ ? level : max_level_; delete[] pre; } void skiplist::earse(int val) { node_t** pre = new node_t*[SKIP_LIST_MAX_LEVEL]; for (auto i = 0; i < SKIP_LIST_MAX_LEVEL; ++i) { pre[i] = nullptr; } auto cur = head_; for (auto i = max_level_ - 1; i >= 0; i--)//最高层开始 { //每层遍历 找到小于val的最后一个节点 while (cur->next[i] != nullptr && cur->next[i]->val < val) cur = cur->next[i]; // pre[i] = cur; } // if (cur->next[0] != nullptr && cur->next[0]->val == val) { auto t = cur->next[0]; for (auto i = SKIP_LIST_MAX_LEVEL - 1; i >= 0; i--) { if (pre[i] == nullptr) continue; // if (pre[i]->next[i] != nullptr && pre[i]->next[i]->val == val) pre[i]->next[i] = pre[i]->next[i]->next[i]; } delete t; } // while (max_level_ > 1 && head_->next[max_level_ - 1] == nullptr) --max_level_; delete[] pre; } int skiplist::rank(int val) { node_t* p = head_; int r = 0; while (p->next[0] != nullptr && p->next[0]->val < val) { p = p->next[0]; r++; } return r; } int skiplist::rank(int val, node_t*& lower, node_t* &upper) { lower = lower_bound(val); upper = upper_bound(val); return rank(val); } node_t* skiplist::get(int idx) { node_t* p = head_; int r = 0; while (p->next[0] != nullptr && --idx) { p = p->next[0]; } // if (idx == 0) return p; return nullptr; } node_t* skiplist::find(int key) { auto p = head_; for (size_t i = 0; i < max_level_; i++) // lower_bound { while (p->next[i] && p->next[i]->val < key) p = p->next[i]; } if (p->next[0] != nullptr && p->next[0]->val == key) { return p->next[0]; } return nullptr; } void skiplist::print() { for (auto i = max_level_ - 1; i >=0; --i) { auto p = head_->next[i]; printf("Level %d: %d", i, head_->val); while (p) { printf("-> %d", p->val); p = p->next[i]; } printf("\n"); } printf("\n"); } size_t skiplist::level() { return max_level_; } int skiplist::random_generate_level() { int level = 1; const unsigned int seed = std::chrono::system_clock::now().time_since_epoch().count(); //获取系统时间戳,单位微秒(microsecond)。 std::default_random_engine generator(seed); //系统时间戳作为种子 std::uniform_real_distribution distribution(0, 1); float random_num = distribution(generator); //均匀分布,生成区间[0,1]的浮点数 while (random_num < rate_ && level < SKIP_LIST_MAX_LEVEL) { //模拟每一次都是50%的概率小于probability random_num = distribution(generator); ++level; } return level; } node_t* skiplist::lower_bound(int val) { node_t* p = head_; for (auto i = max_level_ - 1; i >= 0; i--)//最高层开始 { //每层遍历 找到小于val的最后一个节点 while (p->next[i] != nullptr && p->next[i]->val < val) p = p->next[i]; } return p; } node_t* skiplist::upper_bound(int val) { node_t* p = head_; for (auto i = max_level_ - 1; i >= 0; i--)//最高层开始 { //每层遍历 找到小于val的最后一个节点 while (p->next[i] != nullptr && p->next[i]->val <= val) p = p->next[i]; } // return p->next[0]; //第一个大于 val }
X Tutup