编辑
2023-11-12
数据结构与算法
00
请注意,本文编写于 545 天前,最后修改于 545 天前,其中某些信息可能已经过时。
cpp
#include <iostream> #include <cstdlib> #include <ctime> #include <cstring> const int MAX_LEVEL = 6; // 最大层数 // 跳表节点模板 template<typename K, typename V> struct SkipListNode { K key; V value; SkipListNode<K, V>** forward; SkipListNode(int level, const K& k, const V& v) : key(k), value(v) { forward = new SkipListNode<K, V>*[level + 1]; memset(forward, 0, sizeof(SkipListNode<K, V>*) * (level + 1)); } ~SkipListNode() { delete[] forward; } }; // 跳表模板 template<typename K, typename V> class SkipList { public: SkipList() { head = new SkipListNode<K, V>(MAX_LEVEL, K(), V()); level = 0; srand(time(NULL)); // 初始化随机数种子 } ~SkipList() { SkipListNode<K, V>* p = head; while (p) { SkipListNode<K, V>* q = p; p = p->forward[0]; delete q; } } // 查找键值对应的节点 SkipListNode<K, V>* find(const K& key) const { SkipListNode<K, V>* p = head; for (int i = level; i >= 0; --i) { while (p->forward[i] && p->forward[i]->key < key) { p = p->forward[i]; } } p = p->forward[0]; if (p && p->key == key) { return p; } else { return nullptr; } } // 插入键值对 void insert(const K& key, const V& value) { SkipListNode<K, V>* update[MAX_LEVEL + 1]; memset(update, 0, sizeof(SkipListNode<K, V>*) * (MAX_LEVEL + 1)); SkipListNode<K, V>* p = head; for (int i = level; i >= 0; --i) { while (p->forward[i] && p->forward[i]->key < key) { p = p->forward[i]; } update[i] = p; } p = p->forward[0]; if (p && p->key == key) { p->value = value; // 键已存在,更新值 } else { int newLevel = randomLevel(); if (newLevel > level) { for (int i = level + 1; i <= newLevel; ++i) { update[i] = head; } level = newLevel; } SkipListNode<K, V>* newNode = new SkipListNode<K, V>(newLevel, key, value); for (int i = 0; i <= newLevel; ++i) { newNode->forward[i] = update[i]->forward[i]; update[i]->forward[i] = newNode; } } } // 删除键值对应的节点 void remove(const K& key) { SkipListNode<K, V>* update[MAX_LEVEL + 1]; memset(update, 0, sizeof(SkipListNode<K, V>*) * (MAX_LEVEL + 1)); SkipListNode<K, V>* p = head; for (int i = level; i >= 0; --i) { while (p->forward[i] && p->forward[i]->key < key) { p = p->forward[i]; } update[i] = p; } p = p->forward[0]; if (p && p->key == key) { for (int i = 0; i <= level; ++i) { if (update[i]->forward[i] != p) { break; } update[i]->forward[i] = p->forward[i]; } delete p; while (level > 0 && head->forward[level] == nullptr) { --level; } } } private: SkipListNode<K, V>* head; // 头节点 int level; // 当前最大层数 // 随机生成节点的层数 int randomLevel() const { int newLevel = 0; while (rand() % 2 == 0 && newLevel < MAX_LEVEL) { ++newLevel; } return newLevel; } }; // 示例使用 int main() { SkipList<int, std::string> skipList; // 插入键值对 skipList.insert(1, "One"); skipList.insert(2, "Two"); skipList.insert(3, "Three"); skipList.insert(4, "Four"); skipList.insert(5, "Five"); // 查找键值对应的节点 SkipListNode<int, std::string>* node = skipList.find(3); if (node) { std::cout << "Value of key 3: " << node->value << std::endl; } else { std::cout << "Key 3 not found." << std::endl; } // 删除键值对应的节点 skipList.remove(4); // 再次查找删除的节点 node = skipList.find(4); if (node) { std::cout << "Value of key 4: " << node->value << std::endl; } else { std::cout << "Key 4 not found." << std::endl; } return 0; }

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!