题目:1206. 设计跳表

题解:https://leetcode-cn.com/problems/design-skiplist/solution/can-kao-redisshi-xian-by-bakezq/

http://zhangtielei.com/posts/blog-redis-skiplist.html

static const int SKIPLIST_P_VAL = RAND_MAX / 2, MAX_LEVEL = 16;
class Skiplist {
public:struct Node {int val;vector<Node *> level;Node(int val, int size = MAX_LEVEL) : val(val), level(size) {}};Node head;int maxlevel = 1;Skiplist() : head(INT_MIN, MAX_LEVEL) {}// ~Skiplist() { delte all nodes. }// essentially the same as _searchbool search(int target) {Node * prev = _search(target)[0];return prev->level[0] && prev->level[0]->val == target;}vector<Node *> _search(int key) {Node * cur = &head;vector<Node *> prevs(MAX_LEVEL);// through every level, from top to bottomfor (int i = maxlevel - 1; i >= 0; i--) {// through elements in the current level with smaller valuewhile (cur->level[i] && cur->level[i]->val < key)cur = cur->level[i];prevs[i] = cur;}return prevs;}void add(int num) {auto prevs = _search(num);int level = random_level();// update maxlevel and prevsif (level > maxlevel) {for (int i = maxlevel; i < level; i++)prevs[i] = &head;maxlevel = level;}Node * cur = new Node(num, level);// from prev->next   to   prev->cur->nextfor (int i = level - 1; i >= 0; i--) {cur->level[i] = prevs[i]->level[i];prevs[i]->level[i] = cur;}// if there is backward pointer, need to set both cur and cur.next 's back pointer// Note that the back poinet of the first valid node is nullptr instead of head}bool erase(int num) {auto prevs = _search(num);if (!prevs[0]->level[0] || prevs[0]->level[0]->val != num)return false;Node * del = prevs[0]->level[0];// from prev->cur->next to prev->nextfor (int i = 0; i < maxlevel; i++)if (prevs[i]->level[i] == del)prevs[i]->level[i] = del->level[i];delete del;// update maxlevel.while (maxlevel > 1 && !head.level[maxlevel - 1])maxlevel--;// if there is backward poinet, need to set cur.next.back to cur.backreturn true;}static int random_level() {int level = 1;while (rand() < SKIPLIST_P_VAL && level < MAX_LEVEL) level++;return level;}
};

1206. 设计跳表相关推荐

  1. 详细讲解设计跳表的三个步骤(查找、插入、删除)

    目录 写在前面 跳表概要 查找步骤 插入步骤 删除步骤 完整代码 写在前面 关于跳表的一些知识可以参考这篇文章,最好是先看完这篇文章再看详细的思路->代码的复现步骤: Redis内部数据结构详解 ...

  2. Skiplist(跳表)实现

    前言:跳表本质是一种查找结构,相较于AVL树.红黑树.哈希表,实现起来要更加简单,而且效率也不差. 一.Skiplist概念 跳表本质也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树(AVL树 ...

  3. 数据结构之跳表(含代码实现)

    目录 1.跳表的相关概念 2.跳表节点的定义及其实现 2.1跳表的插入 2.2跳表的删除 3.letecode测试及其链接 1.跳表的相关概念 跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连 ...

  4. 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...

    转自:http://data.qq.com/article?id=817 三.Hermes设计概要 架构描述 系统核心进程均采用分散化设计,根据业务发展需求,可随意扩缩容机器; 周期性数据直接通过td ...

  5. 多线程环境下海量定时任务的定时器设计丨时间轮实现丨红黑树,跳表分析

    多线程环境下海量定时任务定时器设计 1. 定时器分析 2. 红黑树,最小堆,跳表实现比较分析 3. 时间轮实现 [Linux后端开发系列]多线程环境下海量定时任务的定时器设计丨时间轮实现丨红黑树,跳表 ...

  6. 跳表(SkipList)设计与实现(java)

    微信搜一搜「bigsai」关注这个有趣的程序员,一起做个朋友 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star ...

  7. SkipList 跳表

    转载:https://blog.csdn.net/fw0124/article/details/42780679 为什么选择跳表 说起跳表,我们还是要从二分查找开始. 二分查找的关键要求有两个, 1 ...

  8. 数据结构和算法之——跳表

    之前我们知道,二分查找依赖数组的随机访问,所以只能用数组来实现.如果数据存储在链表中,就真的没法用二分查找了吗?而实际上,我们只需要对链表稍加改造,就可以实现类似"二分"的查找算法 ...

  9. 跳表SkipList

    1.聊一聊跳表作者的其人其事 2. 言归正传,跳表简介 3. 跳表数据存储模型 4. 跳表的代码实现分析 5. 论文,代码下载及参考资料 <1>. 聊一聊作者的其人其事  跳表是由Will ...

最新文章

  1. 远程为服务器安装Windows 2008 Server
  2. python在日常工作处理中的应用-Python全栈开发在实际工作中的应用
  3. springCloud Finchley 实战入门(基于springBoot 2.0.3)【六 Hystrix 仪表盘】
  4. CentOS 7安装GitLab、汉化、配置邮件发送
  5. oracle join 嵌套,誰能真正理解hash join/nested loop/merge join
  6. (转)淘淘商城系列——内容分类管理
  7. python+Eclipse+pydev环境搭建
  8. 使用NoSQL Manager for MongoDB客户端连接mongodb
  9. 佳能g2800清废墨_跪求佳能g2800 打印机 清零
  10. 帝骑k触屏模拟器_假面骑士decade神主牌模拟器手机版下载|
  11. 可视化:这十个数据可视化工具软件平台你必须知道
  12. Ubuntu18.04安装TPlink WDN5200 usb无线网卡驱动
  13. Python -- 关于函数的学习(五) — 传递任意数量的实参
  14. 易中天:望子成人,而非望子成龙
  15. 依图科技:多个人工智能应用领域达到全球领先水平 | 百万人学AI评选
  16. java 超卖_Java生鲜电商平台-秒杀系统如何防止超买与超卖?(小程序/APP)
  17. SegY地震体数据可视化分析工具
  18. PHP版田字格带笔顺临摹描红练习字帖在线生成小工具,可直接打印三色的田字格米字格回宫格空格灰格字帖,生成速度快可直接打印或导出成PDF文件等下载地址在最后
  19. IEEE Access录用了一篇文章,目前在web of science中还检索不到,请问童鞋们该肿么办?
  20. PS2251-68 量产成 CDROM + USBDsik 以及还原(删除CD-ROM)分区

热门文章

  1. usermod命令 用户密码管理 mkpasswd命令
  2. 《jQuery移动开发》—— 2.1 语义HTML5
  3. kali Linux Web 渗透测试视频教程— 第六课 网络扫描-nmap与zmap
  4. cas3 自定义页面
  5. 重学C---------第五节:常量
  6. (推荐)(提供下载)ORACLE常见问题一千问(不怕学不成、就怕心不诚!)
  7. 度量网络延迟和吞吐量
  8. C++ IO 格式控制
  9. 6.QT-简易计算器实现(详解)
  10. linux_network