网站建设教育平台点点 wordpress

news/2025/9/30 2:58:06/文章来源:
网站建设教育平台,点点 wordpress,手机app与手机网站的区别,高端t恤定制网站想象为翼#xff0c;起飞~ 跳表简介#xff1f; skiplist本质上是一种查找结构#xff0c;用于解决算法中的查找问题#xff0c;跟平衡搜索树和哈希表的价值是 一样的#xff0c;可以作为key或者key/value的查找模型。 跳表由来 skiplist是由美国计算… 想象为翼起飞~ 跳表简介 skiplist本质上是一种查找结构用于解决算法中的查找问题跟平衡搜索树和哈希表的价值是 一样的可以作为key或者key/value的查找模型。 跳表由来         skiplist是由美国计算机科学家William Pugh于1989年发明skiplist顾名思义首先它是一个list。实际上它是在有序链表的基础上发展起来的。我们知道在对一个有序链表进行查找它的时间复杂度为O(N)。 William Pugh开始了他的优化思路: ● 假如我们每相邻两个节点升高一层增加一个指针让指针指向下下个节点如下图所示: 这样新增的一层指针通过连接可以形成新的链表它包含了整个链表节点的一半由此需要在这一层进行比较、筛除的个数也就降低了一半。 以此类推继续增加一层指针新链表的节点数下降查找的效率自然而然也就提高了。按照上述每增加一层节点数就少一半其查找的过程类似于二分查找使得查找的时间复杂度可以降低到O(LogN)。 当然上述查找的前提是一个有序的链表。无论你是对其中的链表新增节点还是删除节点都可能打乱原有维持的指针连接从而导致跳表失效。。如果要维持这种对应关系就必须把新插入的节点后面的所有节点也 包括新插入的节点重新进行调整这会让时间复杂度重新蜕化成O(n)。 ● 随机层数: 为了避免这种情况skiplist的设计不再严格要求对应比例关系而是插入一个节点的时候随机出一个层数。这样每次插入和删除都不需要考虑其他节点的层数。 skiplist如何保证效率 那么skiplist在引入随机层数后如何保证其查找效率呢首先这个随机层数会有一个限制这里把它叫做maxlevel其次会设置一个多增加一层的概率p。那么计算这个随机层数的伪代码如下图: 我们最终可以得到这样一个数学式用于计算一个节点的平均层数: 有了这个公式我们可以很容易计算出: 当 p   1/2 时: 每个节点所包含的平均指针数目为2。 当 p   1/4 时: 每个节点所包含的平均指针数目为1.33。                  至于跳表的平均时间复杂度为O(logN)这个推导的过程较为复杂愚钝的我也就不在此摆弄文墨下面的两篇中英文章可以给你提供你要的答案: 铁蕾大佬的博客http://zhangtielei.com/posts/blog-redis-skiplist.html. William_Pugh大佬的论文: http://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf. 跳表实现: leetcode上有一道实现跳表的题你可以在这上面完成跳表的测试 https://leetcode.cn/problems/design-skiplist/         当然讲了这么多还是没具体说说到底跳表是如何进行查找的所以我们要实现的第一个函数接口就是跳表元素查找: skipList初始化: // 跳表不仅仅是要存储数据 _data // 还需要有next指针当然这些next指针也不止一个 // 这取决于 当前节点的层数 typedef struct SkiplistNode {int _val; // 节点值vectorSkiplistNode* _nextV; // 节点连接的其他表项SkiplistNode(int val, int level):_val(val), _nextV(level, nullptr){} }Node;class Skiplist { public:Skiplist() {// 初始化 _headList// 默认给一层_head new SkiplistNode(-1, 1);} private:Node* _head; // 头节点double _prate 0.25; // 新增层概率int _MaxLevel; // 最大层数 }; Search: bool search(int target) {// 1.从头节点查Node* cur _head;// 记录的层数// 0~n-1的下标int level _head-_nextV.size() - 1;while (level 0){// target 大于 下一个节点的val cur向右移动if (cur-_nextV[level] target cur-_nextV[level]-_val){cur cur-_nextV[level];} // 因为支持数据冗余 所以如果出现一样的就把新节点插在它后面即可else if(cur-_nextV[level]nullptr || target cur-_nextV[level]-_val){// target 小于 下一个节点的val --level || next节点为空--level;}else{// 找到了return true;}}return false;} Add: vectorNode* FindPath(int num){// 从头节点查起Node* cur _head;int level _head-_nextV.size()-1;// 开和level一样的大小vectorNode* prevV(level1,_head);while (level 0){if (cur-_nextV[level] num cur-_nextV[level]-_val){// 只管移动cur cur-_nextV[level];} // 因为支持数据冗余 所以如果出现一样的就把新节点插在它后面即可else if (cur-_nextV[level] nullptr || num cur-_nextV[level]-_val){// 记录该层num的前一个节点prevV[level] cur;// 向下更新--level;}}return prevV;}int RandomLevel(){int level 1;while (rand() _prate * RAND_MAX level _MaxLevel){level;}return level;}void add(int num){// 前驱节点vectorNode* prevV FindPath(num);// 创建节点int n RandomLevel();Node* newnode new Node(num, n);// 可能创建节点层数 _headif (n _head-_nextV.size()){// 进行扩容_head-_nextV.resize(n,nullptr);// prevV也许跟着扩容// 这里的新增前驱节点为什么初始化为 _head?// 新增节点一定是连接在 prevV里的节点之后的prevV.resize(n, _head);}// 前后连接节点for (int i 0;i n;i){// 可以理解为newnode-next prev-next-nextnewnode-_nextV[i] prevV[i]-_nextV[i];prevV[i]-_nextV[i] newnode; // 连接回来}} 这里的randomLevel()是以一种巧妙的方式完成的: 通过p可以控制最终值产生范围的概率。 不过C有专门的随机数生成的库比这个rand功能更加强大,所以我们可以将那个RandomLevel()改成这样: int RandomLevel(){// 随机数种子static static std::default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count());// 生成随机数范围static std::uniform_real_distributiondouble distribution(0.0,1.0);size_t level 1;while (distribution(generator) _prate level _MaxLevel){level;}return level;} Erase: bool erase(int num){vectorNode* prevV FindPath(num);// 这里可能找不到if (prevV[0]-_nextV[0] nullptr || prevV[0]-_nextV[0]-_val ! num) return false;// 我们根据prevV的最底层节点 就可以找到del节点Node* del prevV[0]-_nextV[0];// 根据该节点的层数 更新prevV 和 nextV// 进行连接for (int i 0;i del-_nextV.size();i){prevV[i]-_nextV[i] del-_nextV[i];}// 删除节点// 这里记录levelint level del-_nextV.size();delete del;// 如果删除的节点是 最高层呢 并且是唯一呢// 这种优化可以不做 但你也可以做// 就是重新定义_head的高度// 向下遍历 只要遇到不为空的最高 就breakint i _head-_nextV.size() - 1; while (i 0){if (_head-_nextV[i] nullptr){--i;}else{break;}}_head-_nextV.resize(i 1);return true;} 最后我们可以通过leetcode提供的测试用例来测试测试咱们写的跳表。  跳表vs平衡搜索树和哈希表的对比 最后一个话题 skiplist相比平衡搜索树(AVL树和红黑树)对比都可以做到遍历数据有序时间复杂度也差不多。不过skiplist与平衡搜索树的最大优势在于: ● skiplist实现简单容易控制。平衡树增删查改遍历都更复杂. ● skiplist的额外空间消耗更低。平衡树节点存储每个值有三叉链平衡因子/颜色等消耗。可是skiplist可以通过p来调整每个节点的指针个数那是个可接受的数量。 skiplist相比哈希表而言在查找上就没有那么大的优势了。 ● 哈希表平均时间复杂度是O(1)比skiplist快。 相反skiplist在这些方面胜过哈希表: ● 遍历数据有序 ● skiplist空间消耗略小一点哈希表存在链接指针和表空间消耗 ● 哈希表再极端场景下哈希冲突高效率下降厉害需要红黑树补足接力   本篇到此结束感谢你的阅读。 祝你好运向阳而生~

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

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

相关文章

flash网站需要改变做软件的网站

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 pingvin-share[2] Pingvin Share 是一个可自…

扁平化设计网站 国内跨境电商一件代发货源平台

1.zhiwang 基于物理信息神经网络的波动方程优化求解方法 吴丹澜1梁展弘2余懿3蔡博3郑邦宏4王梓超4张紫玲4 1.肇庆学院计算机科学与软件学院,大数据学院2.香港城市大学电气工程系3.云浮市新兴县公安局4.肇庆学院计算机科学与软件学院、大数据学院 2,zhiwang 就爱…

城市分类信息网站系统网页规划书怎么写

前言最近前端老是反馈API调用异常,说请求成功但是没有数据返回!我写的代码怎么可能有bug,肯定是前端调用的方式不对!经过一番套鼓,直接把请求参数和响应内容打印到控制台,果然不出我所料,请求缺…

网站建设构成技术要求水墨风格网站欣赏

2.0.概述 本章概述了系统级的Linux性能工具。这些工具是你追踪性能问题时的第一道防线。它们能展示整个系统的性能情况和哪些部分表现不好。 1.理解系统级性能的基本指标,包括CPU的使用情况。 2.明白哪些工具可以检索这些系统级性能指标。 2.1CPU性能统计信息 为…

超精简的小型C编译器

在嵌入式开发、资源受限环境或教学场景中,精简的 C 编译器非常实用。以下是一些以 "精简" 为核心设计目标的 C 编译器,按精简程度和特点分类介绍: 1. TCC (Tiny C Compiler)特点:可能是最知名的精简 C 编…

上海网站排名前十呼和浩特住房和城乡建设部网站

情感数据对LSTM股票预测模型的影响研究 作者:丁纪翔 发布时间:06/28/2021 摘要:探究了情感结构化特征数据在LSTM股票预测模型中的影响。利用Pandas对所给数据进行预处理(数据载入、清洗与准备、规整、时间序列处理、数据聚合等&am…

编程网站入口网上开店需要多少钱?

背景: 安装JDK是我们java程序在服务器运行的必要条件,下面描述几个简单的命令就可再服务器上成功安装jdk 命令总览: yum update -y yum list | grep jdk yum -y install java-1.8.0-openjdk java -version 1.查看可安装版本 yum list | grep jdk 2.如果查不到可先进行 yum upd…

平面设计网站推荐免费咨询做网站

brew卸载jenv昨天在Java9的Jigsaw HackTheTower事件中,我意识到我需要加强我的游戏并改善我现有的机制,以在我的机器上维护几个不同的JDK。 我曾经手动下载jdk,或使用brew cask来安装它们,我会在我的〜/ bash_profile中设置bash …

广东网站建设人员wordpress ftp 权限

Mysql数据类型上的一个把握 1、MySQL Decimal为什么不会丢失精度 DECIMAL的存储方式和其他数据类型都不同,它是以字符串形式存储的。假设一个字段为DECIMAL(3,0),当我们存入100时,实际上存入的1、0、0这三个字符拼接而成的字符串的二进制值&…

北京大兴做环保备案网站网站建设公司制作网站

49. 字母异位词分组 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate"…

怎么利用QQ空间给网站做排名专业的公司网页制作

go validator使用教程 很多时候在B/S开发过程中,经常会遇到对参数的校验工作,一般客户端需要提前验证一次提交的数据是否合理,以减少后端的压力,而后端是必须要对数据做验证的。 一般验证的方式大多都是if-else,这种方式会让你掉入无底的深渊,就像下面一样。 [图片来源…

中国太空网站网站有收录就会排名吗

如今任何项目开发节奏都很快,及时掌握项目动态是很重要滴,GitHub Issues 一般都是开发者和用户反馈问题的主要渠道。 然而,随着 Issue 数量的增加,及时跟进每一个问题会变得越来越困难。 为了解决这个痛点,我们开发了…

搭建网站平台有前途吗微信公众号做的网站

在Java中,堆内存中的对象由Java虚拟机(JVM)的垃圾回收器自动进行内存管理和释放。当一个对象不再被引用时,垃圾回收器会在适当的时机自动回收该对象所占用的内存空间。这意味着在main方法执行完毕后,堆内存中的对象会被…

展开描述建设一个网站的具体步骤PPT做的好的有哪些网站

Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,当Linux启动时,硬件时钟会去读取系统时钟的设置,然后…

网络广告的特点软件定制网站优化 seo一站式

有过电脑里面想删除一个文件,死活删除不了的痛苦吗?用尽了各种办法,关闭进程,删除关联文件,卸载对应的程序,然而还是无法删除,甚至都进入了安全模式删除,依然文件纹丝不动&#xff0…

论文网站建设的参考文献公司网站优化去哪里学

文章目录 1、冒泡排序/选择排序/插入排序冒泡排序(Bubble Sort)选择排序(Selection Sort)插入排序(Insertion Sort) 2、希尔排序(Shells Sort)3、快速排序(Quick Sort)4、堆排序(Heap Sort)5、归并排序(Merge Sort)6、桶排序/计数排序/基数排序桶排序(Bucket sort)计数排序(Cou…

精品课程网站建设现状做的比较好的网站

文章目录 👉 一、正则表达式的概念👉 二、常见使用正则表达式的方法① RegExp 对象方法1. 创建 RegExp 对象的语法2. RegExp对象方法① compile(value)② exec(value)③ test(value)③ reg.toString() ② 支持正则表达式的 String 对象的方法1. search()…

Day1 Linux 入门:9 个核心命令(whoami/id/pwd 等)

一、Linux基础命令 1. whoami功能:显示当前登录用户名 示例:[root@localhost ~]# whoami root 2. id功能:查看用户身份信息(UID、GID等) 常用选项:-u:仅显示UID -g:仅显示主组GID -G:显示所有组GID -n:显示名…

网站开发目录结构金融平台网站开发

AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 旋转 如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡。这种失去平衡的可以概括为4种姿态:LL(左左),LR(左右),RR(右…

哪个网站用帝国cms做的中企动力做销售的感受

人类大脑有数百亿个相互连接的神经元(如下图(a)所示),这些神经元通过树突从其他神经元接收信息,在细胞体内综合、并变换信息,通过轴突上的突触向其他神经元传递信息。我们在博文《最优化方法Python计算:无约…