跳表通过多层链表实现O(log n)平均时间复杂度的查找、插入和删除,结构简单,代码清晰,适合手写有序集合。
跳表(Skip List)是一种基于概率的有序数据结构,能以平均 O(log n) 的时间复杂度实现查找、插入和删除操作,实现简单且性能接近平衡树。相比红黑树或AVL树,跳表代码更清晰,适合手写实现一个有序集合。
跳表通过多层链表实现快速跳跃。底层是完整的有序链表,每一层是下一层的“快照”,包含部分节点。查找时从顶层开始,横向移动到合适位置后下降一层,逐步逼近目标。
每个节点有多个指针(层数随机决定),高层用于跳过大量节点,低层用于精细定位。插入时通过随机函数决定该节点的层数,维持整体平衡。
templatestruct SkipListNode { T value; std::vector next; SkipListNode(T val, int level) : value(val), next(level, nullptr) {}};
next[i] 表示该节点在第 i 层的下一个节点指针。level 在节点创建时确定。
跳表类主体实现
核心成员包括最大层数、当前层数、头节点和随机策略:
templateclass SkipList { private: static const int MAX_LEVEL = 16; // 最大层数 int level; SkipListNode * head; std::random_device rd; std::mt19937 gen; std::uniform_int_distribution dis; int randomLevel() { int lvl = 1; while (lvl < MAX_LEVEL && dis(gen) % 2 == 0) { lvl++; } return lvl; }public: SkipList() : level(1), gen(rd()), dis(0, 1) { head = new SkipListNode
(T(), MAX_LEVEL); } 查找操作
从最高层开始,向右直到下一个节点大于目标,然后下降一层继续:
bool find(const T& val) { SkipListNode* curr = head; for (int i = level - 1; i >= 0; i--) { while (curr->next[i] && curr->next[i]->value < val) { curr = curr->next[i]; } } curr = curr->next[0]; return curr && curr->value == val; } 插入操作
先查找路径并记录每层最后到达的节点,再生成随机层数,更新各层指针:
void insert(const T& val) { std::vector*> update(MAX_LEVEL, nullptr); SkipListNode * curr = head; for (int i = level - 1; i >= 0; i--) { while (curr->next[i] && curr->next[i]->value < val) { curr = curr->next[i]; } update[i] = curr; } curr = curr->next[0]; if (curr && curr->value == val) return; // 已存在 int newLevel = randomLevel(); if (newLevel > level) { for (int i = level; i < newLevel; i++) { update[i] = head; } level = newLevel; } SkipListNode* newNode = new SkipListNode (val, newLevel); for (int i = 0; i < newLevel; i++) { newNode->next[i] = update[i]->next[i]; update[i]->next[i] = newNode; } }
删除操作
查找节点并记录路径,若存在则逐层断开指针:
bool erase(const T& val) { std::vector*> update(MAX_LEVEL, nullptr); SkipListNode * curr = head; for (int i = level - 1; i >= 0; i--) { while (curr->next[i] && curr->next[i]->value < val) { curr = curr->next[i]; } update[i] = curr; } curr = curr->next[0]; if (!curr || curr->value != val) return false; for (int i = 0; i < level; i++) { if (update[i]->next[i] != curr) break; update[i]->next[i] = curr->next[i]; } delete curr; while (level > 1 && head->next[level - 1] == nullptr) { level--; } return true;}
完整性和使用示例
加上析构函数释放内存,即可使用:
~SkipList() { SkipListNode* curr = head; while (curr) { SkipListNode * next = curr->next[0]; delete curr; curr = next; } } // 示例 int main() { SkipList
sl; sl.insert(3); sl.insert(1); sl.insert(4); sl.insert(2); std::cout << sl.find(3) << std::endl; // 输出 1 sl.erase(3); std::cout << sl.find(3) << std::endl; // 输出 0 return 0; } 基本上就这些。跳表实现比红黑树简洁得多,调试也更容易。只要控制好随机层数上限和概率分布,性能非常稳定,适合作为有序集合的手写方案。
# c++ # node # ai # 析构函数 # 指针 # 数据结构 # public # skiplist # 层数 # 链表 # 红黑 # 是一种 # 多个 # 得多 # 跳过 # 也更 # 基本原理
相关文章: 海南网站制作公司有哪些,海口网是哪家的? 如何注册花生壳免费域名并搭建个人网站? 网站制作员失业,怎样查看自己网站的注册者? 如何选择高效便捷的WAP商城建站系统? 电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的? 如何快速生成ASP一键建站模板并优化安全性? 娃派WAP自助建站:免费模板+移动优化,快速打造专业网站 如何通过PHP快速构建高效问答网站功能? 深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面? 建站OpenVZ教程与优化策略:配置指南与性能提升 大连网站设计制作招聘信息,大连投诉网站有哪些? 深圳网站制作平台,深圳市做网站好的公司有哪些? 5种Android数据存储方式汇总 开源网站制作软件,开源网站什么意思? 网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱? 常州自助建站工具推荐:低成本搭建与模板选择技巧 建站主机如何选?性能与价格怎样平衡? 整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗? 定制建站平台哪家好?企业官网搭建与快速建站方案推荐 Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解 广州营销型建站服务商推荐:技术优势与SEO优化解析 如何在搬瓦工VPS快速搭建网站? 建站VPS推荐:2025年高性能服务器配置指南 青浦网站制作公司有哪些,苹果官网发货地是哪里? 公众号网站制作网页,微信公众号怎么制作? 美食网站链接制作教程视频,哪个教做美食的网站比较专业点? 建站之星如何助力企业快速打造五合一网站? 如何通过服务器快速搭建网站?完整步骤解析 建站之星官网登录失败?如何快速解决? 如何在IIS中配置站点IP、端口及主机头? 佛山企业网站制作公司有哪些,沟通100网上服务官网? 电商网站制作价格怎么算,网上拍卖流程以及规则? 台州网站建设制作公司,浙江手机无犯罪记录证明怎么开? 网站插件制作软件免费下载,网页视频怎么下到本地插件? 建站之星安全性能如何?防护体系能否抵御黑客入侵? 网站设计制作公司地址,网站建设比较好的公司都有哪些? 如何在沈阳梯子盘古建站优化SEO排名与功能模块? 如何用IIS7快速搭建并优化网站站点? 如何通过远程VPS快速搭建个人网站? 巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成 如何通过建站之星自助学习解决操作问题? python的本地网站制作,如何创建本地站点? 如何挑选高效建站主机与优质域名? 独立制作一个网站多少钱,建立网站需要花多少钱? 免费网站制作appp,免费制作app哪个平台好? 实例解析Array和String方法 如何获取上海专业网站定制建站电话? 昆明高端网站制作公司,昆明公租房申请网上登录入口? 网站app免费制作软件,能免费看各大网站视频的手机app? 企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
*请认真填写需求信息,我们会在24小时内与您取得联系。