当前位置:网站首页>【Leetcode】1206. Design Skiplist
【Leetcode】1206. Design Skiplist
2022-08-01 23:47:00 【记录算法题解】
题目地址:
https://leetcode.com/problems/design-skiplist/
实现一个跳表。
跳表如下图所示:
其是一个分层有序链表结构(有序指的是按元素大小排序,类似于平衡树),设最下层为第 0 0 0层,向上的层数以此类推。每一层的节点数大致是其上面一层的两倍,而查找元素的时候可以通过高层的快速跳跃实现优化。有个虚拟头结点为搜索的出发节点。核心操作为“前驱查找”,这个操作会找到每一层的小于给定元素 x x x的最后一个节点(如果不存在,则视为找到了头结点)。
每个操作具体如下:
1、查找 x x x是否存在。先对 x x x进行前驱查找,然后看第 0 0 0层找到的那个节点的下一个节点,只需要看其是否值为 x x x即可;
2、添加 x x x。先对 x x x进行前驱查找,然后看第 0 0 0层找到的那个节点,如果那个节点存在,则其为小于 x x x的最后一个节点;如果不存在,那个节点即为头结点。无论怎样,都可以在那个节点之后添加新的值为 x x x的节点。此时,以 50 % 50\% 50%的概率将这个节点插到上一层,插完之后再以 50 % 50\% 50%的概率将这个节点插到更上一层,一直插到最上层或中间停止了为止。
3、删除 x x x。先对 x x x进行前驱查找,然后看第 0 0 0层找到的那个节点,看其下一个节点,如果不存在,或者值不为 x x x,则说明 x x x不存在,直接返回。否则说明找到了,删除之,并向上爬,删除上面层中的 x x x。
代码如下:
class Skiplist {
public:
#define level 8
struct Node {
int val;
vector<Node*> next;
Node(int val) : val(val) {
next.resize(level, nullptr);
}
} *head;
Skiplist() {
head = new Node(-1);
}
~Skiplist() {
delete head;
}
void find(int x, vector<Node*> &pre) {
// 从头结点出发,找到每一层小于x的最后一个节点,如果没找到则赋为头结点
auto p = head;
for (int i = level - 1; i >= 0; i--) {
while (p->next[i] && p->next[i]->val < x) p = p->next[i];
pre[i] = p;
}
}
bool search(int x) {
vector<Node*> pre(level);
find(x, pre);
auto p = pre[0]->next[0];
return p && p->val == x;
}
void add(int x) {
vector<Node*> pre(level);
find(x, pre);
auto p = new Node(x);
// 从下向上每一层添加节点x
for (int i = 0; i < level; i++) {
p->next[i] = pre[i]->next[i];
pre[i]->next[i] = p;
// 以50%的概率退出
if (rand() & 1) break;
}
}
bool erase(int x) {
vector<Node*> pre(level);
find(x, pre);
auto p = pre[0]->next[0];
if (!p || p->val != x) return false;
for (int i = 0; i < level && pre[i]->next[i] == p; i++)
pre[i]->next[i] = p->next[i];
delete p;
return true;
}
};
每个操作平均时间复杂度 O ( log n ) O(\log n) O(logn), n n n为表里已有的元素个数(即最下面一层的节点个数),空间平均 O ( n ) O(n) O(n)。
边栏推荐
- sys_kill系统调用
- Deep Learning Fundamentals - Numpy-based Recurrent Neural Network (RNN) implementation and backpropagation training
- Flink学习第四天——完成第一个Flink 流批一体案例
- 12306抢票,极限并发带来的思考?
- 2022 6th Strong Net Cup Part WP
- 月薪12K,蝶变向新,勇往直前—她通过转行测试实现月薪翻倍~
- 20220725 Information update
- 斜堆、、、
- Avoid hidden text when loading fonts
- The monthly salary of the test post is 5-9k, how to increase the salary to 25k?
猜你喜欢
sys_kill system call
Thymeleaf简介
企业防护墙管理,有什么防火墙管理工具?
Solve the port to take up
UML diagram of soft skills
Share an interface test project (very worth practicing)
The monthly salary of the test post is 5-9k, how to increase the salary to 25k?
async和await用法介绍
CDH6 Hue to open a "ASCII" codec can 't encode characters
邻接表与邻接矩阵
随机推荐
切面打印调取的方法
Building a cloud-native DevOps environment
字节跳动面试官:请你实现一个大文件上传和断点续传
在MySQL中使用MD5加密【入门体验】
Docker实践经验:Docker 上部署 mysql8 主从复制
【图像融合】基于加权和金字塔实现图像融合附matlab代码
Use Jenkins for continuous integration, this knowledge point must be mastered
在MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password YES) 拒绝访问问题解决
[Camp Experience Post] 2022 Cybersecurity Summer Camp
如何进行数据库备份
[C language advanced] file operation (2)
【MySQL篇】初识数据库
oozie startup error on cdh's hue, Cannot allocate containers as requested resource is greater than maximum allowed
numpy.around
When using DocumentFragments add a large number of elements
Chapter 12 End-User Task As Shell Scripts
仿牛客网项目第三章:开发社区核心功能(详细步骤和思路)
经典文献阅读之--DLO
2022还想上岸学习软件测试必看,测试老鸟的肺腑之言...
1个月写900多条用例,二线城市年薪33W+的测试经理能有多卷?