当前位置:实例文章 » 其他实例» [文章]跳跃表SkipList(简单的C++实现)

跳跃表SkipList(简单的C++实现)

发布人:shili8 发布时间:2025-01-30 22:20 阅读次数:0

**跳跃表SkipList**

跳跃表是一种高效的数据结构,用于快速查找、插入和删除元素。它通过在原始链表上构建多层索引来实现这一点,每一层索引都代表一个随机生成的高度值。这种设计使得跳跃表能够以 O(log n) 的时间复杂度进行查找、插入和删除操作。

**SkipList类定义**

cppclass SkipList {
private:
 int maxLevel; // 最大层级数 int headNode; // 头结点 Node* head; // 头结点指针public:
 SkipList(int maxLevel) : maxLevel(maxLevel), headNode(0), head(nullptr) {}

 ~SkipList() {
 for (int i =0; i <= maxLevel; i++) {
 delete[] head[i];
 }
 }

 // 插入新元素 void insert(int key, int value);

 // 查找元素 Node* search(int key);

 // 删除元素 void remove(int key);
};


**Node类定义**

cppclass Node {
public:
 int key; // 键值 int value; // 值 Node* next[maxLevel +1]; // 下一个结点指针 Node() : key(0), value(0) {
 for (int i =0; i <= maxLevel; i++) {
 next[i] = nullptr;
 }
 }

 ~Node() {}
};


**SkipList类实现**

### 构造函数
cppSkipList::SkipList(int maxLevel) : maxLevel(maxLevel), headNode(0), head(nullptr) {
 // 初始化头结点 head = new Node[maxLevel +1];
 for (int i =0; i <= maxLevel; i++) {
 head[i] = nullptr;
 }
}


### 插入新元素
cppvoid SkipList::insert(int key, int value) {
 //生成随机高度值 int level = rand() % (maxLevel +1);
 Node* newNode = new Node();
 newNode->key = key;
 newNode->value = value;

 // 插入新元素 Node** update[maxLevel +1];
 for (int i =0; i <= maxLevel; i++) {
 update[i] = &head[i];
 }
 for (int i = level; i >=0; i--) {
 while (*update[i] && (*update[i])->key < key) {
 update[i] = &(*update[i])->next[i];
 }
 newNode->next[i] = *update[i];
 *update[i] = newNode;
 }

 // 更新头结点 if (level > headNode) {
 headNode = level;
 }
}


### 查找元素
cppNode* SkipList::search(int key) {
 Node** update[maxLevel +1];
 for (int i =0; i <= maxLevel; i++) {
 update[i] = &head[i];
 }

 // 搜索元素 for (int i = maxLevel; i >=0; i--) {
 while (*update[i] && (*update[i])->key < key) {
 update[i] = &(*update[i])->next[i];
 }
 if (*update[i] && (*update[i])->key == key) {
 return *update[i];
 }
 }

 // 元素不存在 return nullptr;
}


### 删除元素
cppvoid SkipList::remove(int key) {
 Node** update[maxLevel +1];
 for (int i =0; i <= maxLevel; i++) {
 update[i] = &head[i];
 }

 // 搜索元素 Node* node = search(key);
 if (node && node->key == key) {
 // 删除元素 for (int i =0; i <= maxLevel; i++) {
 if (update[i] != nullptr && update[i]->next[i] == node) {
 update[i]->next[i] = node->next[i];
 }
 }

 // 更新头结点 if (headNode >0 && head[headNode] == nullptr) {
 headNode--;
 }
 }
}


**示例代码**

cppint main() {
 SkipList skipList(3);

 // 插入元素 skipList.insert(5, "five");
 skipList.insert(10, "ten");
 skipList.insert(15, "fifteen");

 // 查找元素 Node* node = skipList.search(10);
 if (node) {
 std::cout << "Key: " << node->key << ", Value: " << node->value << std::endl;
 }

 // 删除元素 skipList.remove(10);

 return0;
}


**总结**

跳跃表是一种高效的数据结构,用于快速查找、插入和删除元素。通过在原始链表上构建多层索引,每一层索引都代表一个随机生成的高度值,使得跳跃表能够以 O(log n) 的时间复杂度进行查找、插入和删除操作。示例代码展示了如何使用跳跃表类来实现这些功能。

相关标签:skiplist
其他信息

其他资源

Top