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

不懂跳跃表的请直接百度
直接上实现

#include <iostream>
#include <string.h>
#include <ctime>using namespace std;template<typename T>
struct SkipNode {inline static constexpr int Rate=3;inline static constexpr int MaxHeight=8;inline static constexpr intmax_t Inf= INT_MAX;inline static SkipNode<T>* update[MaxHeight];intmax_t key;T val;SkipNode<T> *pre[MaxHeight], *nex[MaxHeight];SkipNode<T>(intmax_t k=Inf,const T& v = {}): key(k), val(v){init_pos(nullptr);}auto init_pos(SkipNode<T>* ptr=nullptr){for (int h=0; h<MaxHeight; ++h) {pre[h]=nex[h]=ptr;}return this;}SkipNode<T>* escape(){for(int h=0; h<MaxHeight; ++h) {auto *p=pre[h], *x=nex[h];pre[h]=nex[h]=nullptr;if(p)p->nex[h]=x;if(x)x->pre[h]=p;}return this;}intmax_t upper_bound(intmax_t key__, SkipNode<T> *(&update__)[MaxHeight]=update){memset(update__,0,sizeof(update__));auto *p = this;for(int h=MaxHeight-1; h>=0; --h) {while(p->nex[h] && p->nex[h]!=this && p->nex[h]->key > key__) p=p->nex[h];update__[h]=p;}return p->nex[0] ? p->nex[0]->key : Inf;}void into(SkipNode<T> *(&update__)[MaxHeight]=update){this->init_pos(nullptr);for(int h=0; h<MaxHeight; ++h) {if (update__[h]) {auto *x = update__[h]->nex[h];update__[h]->nex[h]=this;this->nex[h]=x;if(x)x->pre[h]=this;if(this)this->pre[h]=update__[h];}if(rand()%Rate) break;}}void print(){for(auto *p = this->nex[0]; p && p!=this; p=p->nex[0]) {cout << "("<<p->key << ":" << p->val<<"), ";}endl(cout);}};template<typename ValType>
void skiplist_insert(SkipNode<ValType> &hand,intmax_t key,ValType val)
{decltype(hand.update) assist{};if(key == hand.upper_bound(key,assist)) {assist[0]->nex[0]->val = val;} else {(new SkipNode<ValType>(key,val))->into(assist);}
}template<typename ValType>
bool skiplist_erase(SkipNode<ValType> &hand,intmax_t key) {decltype(hand.update) assist{};if (key == hand.upper_bound(key,assist)) {delete assist[0]->nex[0]->escape();return true;}return false;
}void test_insert0()
{SkipNode<int> hand;hand.init_pos(&hand);srand(time(0));skiplist_insert<int>(hand,32,78);skiplist_insert<int>(hand,36,78);skiplist_insert<int>(hand,32,71);skiplist_insert<int>(hand,33,78);skiplist_insert<int>(hand,311,766);hand.print();
}void test_erase0() {SkipNode<int> hand;hand.init_pos(&hand);srand(time(0));skiplist_insert<int>(hand,32,78);skiplist_insert<int>(hand,36,78);skiplist_insert<int>(hand,32,71);skiplist_insert<int>(hand,33,78);skiplist_insert<int>(hand,311,766);hand.print();skiplist_erase(hand,100);hand.print();skiplist_erase(hand,311);hand.print();
}int main()
{test_insert0();test_erase0();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023版7月软件测试面试题(800道)【附带答案】持续更新...

又到了立flag的时候&#xff0c;你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一…

批量添加:vue+easyexcel 上传excel文件解析为Java对象并保存到数据库

对于像数据库中批量添加数据&#xff0c;我们一般会选择通过Excel文件先按照固定的格式将数据保存&#xff0c;然后再通过系统上传进而保存到数据库中。 阿里的excel解析工具EasyExcel和Apach的POI都能进行Excel文件的解析&#xff0c;但是EasyExcel操作起来要相对更简单一些&…

cancal报错 config dir not found

替换classpath中间封号两边的值

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU

1186. 删除一次得到子数组最大和 解题思路&#xff1a;如果没做过还不是很好想&#xff0c;当时自己第一反应是双指针&#xff0c;结果是个动态规划的题。 核心就是dp的定义&#xff0c;dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了 dp[i][0]表示以…

K8S pod 均匀调度分配 —— 筑梦之路

pod调度简介 在 k8s 中 通过 kube-scheduler 组件来实现 pod 的调度&#xff0c;所谓调度&#xff0c;即把需要创建的 pod 放到 合适的 node 上&#xff0c;大概流程为&#xff0c;通过对应的 调度算法 和 调度策略&#xff0c;为待调度的 pod 列表中的 pod 选择一个最合适的 N…

JVM理论(五)执行引擎--解释器/JIT编译器

概述 首先执行引擎是java虚拟机核心的组成部分之一;而JVM的主要任务是装载字节码到内存,但不能够直接运行在操作系统之上.因为字节码指令并非等价于本地机器指令,它仅仅包含能够被JVM所识别的指令、符号表、以及其他信息;而此时执行引擎就华丽登场,它的任务就是将字节码指令解…

rust学习-泛型和trait

泛型 Option&#xff0c;Vec&#xff0c;HashMap<K, V>&#xff0c;Result<T, E>等&#xff0c;取函数以减少代码重复的机制 背景 两个函数&#xff0c;不同点只是名称和签名类型 fn largest_i32(list: &[i32]) -> i32 {let mut largest list[0];for &…

【python】动态规划:牛客网HJ24 合唱队

描述 N 位同学站成一排&#xff0c;音乐老师要请最少的同学出列&#xff0c;使得剩下的 K 位同学排成合唱队形。 设KK位同学从左到右依次编号为 1&#xff0c;2…&#xff0c;K &#xff0c;他们的身高分别为T1,T2,…,TKT1​,T2​,…,TK​ &#xff0c;若存在i(1≤i≤K)i(1≤i…

【数字IC前端笔试真题精刷(2021)】大疆——数字芯片开发工程师A/B卷

声明:本专栏所收集的数字IC笔试题目均来源于互联网,仅供学习交流使用。如有侵犯您的知识产权,请及时与博主联系,博主将会立即删除相关内容。 笔试时间:2021年A/B卷 题目类型:(只列了选择题) 大疆芯片开发岗A卷 文章目录 一、单选题 / 多选题1.(单选)关于流水线设计的…

C++并发编程(6):单例模式、once_flag与call_once、call_once实现单例

单例模式 参考博客 【C】单例模式&#xff08;饿汉模式、懒汉模式&#xff09; C单例模式总结与剖析 饿汉单例模式 C实现 C单例模式(饿汉式) 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结 &#xff0c;一共…

行为型模式 - 策略模式

概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&…

Web 3.0时代,重塑教育与学习方式的可能性

随着科技的快速发展和互联网的普及&#xff0c;教育领域也面临着巨大的机遇和挑战。Web 3.0时代的到来为教育与学习方式带来了全新的可能性。在这个数字化时代&#xff0c;我们可以探索和利用Web 3.0技术&#xff0c;重塑教育的方式&#xff0c;提供更个性化、互动性和灵活性的…

在Illustrator中创建 3D 冰淇淋模型对象

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 一旦你学会了如何在Illustrator中制作一个对象3D&#xff0c;你可以前往Envato Elements&#xff0c;在那里你可以找到大量的3D设计来激发你的灵感。这个基于订阅的市场拥有超过 2&#xff0c;000 个 Illus…

php实现站群软件权限管理功能示例

1.管理员页面RBAC.php <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>权限管理</title> <script src"bootstrap/js/jquery-1.11.2.min.js"></script> </head>…

项目名称:智能家居边缘网关项目

一&#xff0c;项目介绍 软件环境: C语言 硬件环境: STM32G030C8TX单片机开发板 开发工具: Linux平台GCC交叉编译环境以及ukeil (1)边缘网关概念 边缘网关是部署在网络边缘侧的网关&#xff0c;通过网络联接、协议转换等功能联接物理和数字世界&#xff0c;提供轻量化的联接管…

通过new FormData提交简单数据

通过new FormData提交简单数据 效果示例图代码 效果示例图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing: border-…

SpringBoot整合PostgreSQL教程

主要描述如何优雅的整合postgresql。本文略去如何安装pgsql的过程&#xff0c;详情可参考其他文章。 文章目录 postgresql简介整合postgresql整合mybatis整合mybatis-plus postgresql简介 与mysql一样也是开源的关系型数据库&#xff0c;同时还支持NoSql的文档型存储。在某些方…

费尔法克斯水务通过使用 Liquid UI 移动化和定制 SAP PM 来提高收入和数据完整性

背景 费尔法克斯水务是北弗吉尼亚州地区领先的水县。它是华盛顿特区大都会区的三大供水商之一。它每天为近171万居民提供2.<>亿加仑的水。它渴望坚持其愿景&#xff0c;即保持以客户为中心&#xff0c;同时帮助维持该地区的高质量生活和经济状况。 挑战 由于桌面系统&…

【Ceph的部署】

目录 一、基于 ceph-deploy 部署 Ceph 集群1、Ceph 生产环境推荐&#xff1a;2、Ceph 环境规划3、环境准备1、关闭 selinux 与防火墙2、根据规划设置主机名3、配置 hosts 解析4、安装常用软件和依赖包5、在 admin 管理节点配置 ssh 免密登录所有节点6、为每一个服务器配置时间同…

写给后端开发的『vue3』请求后端接口

本文分享一下在vue3前端项目中请求后端接口获取数据。比较简单&#xff0c;内容如下&#xff1a; 1、使用axios请求后端接口 首先npm install axios&#xff0c;添加axios依赖&#xff0c;就靠它来请求后端接口了&#xff0c;基本等同于使用jquery发ajax。 # src/main.js i…