当前位置: 首页 > news >正文

自由人网站开发网页设计欣赏英文

自由人网站开发,网页设计欣赏英文,漳州网站建设公司,广告设计网址目录 前言如何理解“跳表”#xff1f;用跳表查询到底有多快#xff1f;跳表是不是很浪费内存#xff1f;高效的动态插入和删除跳表索引动态更新解答开篇内容小结 前言 本节课程思维导图#xff1a; 二分查找底层依赖的是数组随机访问的特性#xff0c;所以只能用数组来实… 目录 前言如何理解“跳表”用跳表查询到底有多快跳表是不是很浪费内存高效的动态插入和删除跳表索引动态更新解答开篇内容小结 前言 本节课程思维导图 二分查找底层依赖的是数组随机访问的特性所以只能用数组来实现。如果数据存储在链表中就真的没法用二分查找算法了吗实际上我们只需要对链表稍加改造就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表Skip list。 跳表是一种各方面性能都比较优秀的动态数据结构可以支持快速地插入、删除、查找操作写起来也不复杂甚至可以替代红黑树Red-black tree。 Redis 中的有序集合Sorted Set就是用跳表来实现的。那 Redis 为什么会选择用跳表来实现有序集合呢 为什么不用红黑树呢 如何理解“跳表” 对于一个单链表来讲即便链表中存储的数据是有序的如果我们要想在其中查找某个数据也只能从头到尾遍历链表。这样查找效率就会很低时间复杂度会很高是 O(n)。 那怎么来提高查找效率呢对链表建立一级“索引”查找起来是不是就会更快一些呢每两个结点提取一个结点到上一级我们把抽出来的那一级叫做索引或索引层。 如果我们现在要查找某个结点比如 16。我们可以先在索引层遍历当遍历到索引层中值为 13 的结点时我们发现下一个结点是 17那要查找的结点 16 肯定就在这两个结点之间。然后我们通过索引层结点的 down 指针下降到原始链表这一层继续遍历。这个时候我们只需要再遍历 2 个结点就可以找到值等于 16 的这个结点了。这样原来如果要查找 16需要遍历 10 个结点现在只需要遍历 7 个结点。 那如果我们再加一级索引呢效率会不会提升更多呢跟前面建立第一级索引的方式相似我们在第一级索引的基础之上每两个结点就抽出一个结点到第二级索引。现在我们再来查找 16只需要遍历 6 个结点了需要遍历的结点数量又减少了。 我画了一个包含 64 个结点的链表按照前面讲的这种思路建立了五级索引。 当链表的长度 n 比较大时比如 1000、10000 的时候在构建索引之后查找效率的提升就会非常明显。 这种链表加多级索引的结构就是跳表。 用跳表查询到底有多快 在一个单链表中查询某个数据的时间复杂度是 O(n)。那在一个具有多级索引的跳表中查询某个数据的时间复杂度是多少呢 我把问题分解一下先来看这样一个问题如果链表里有 n 个结点会有多少级索引呢 按照我们刚才讲的每两个结点会抽出一个结点作为上一级索引的结点那第一级索引的结点个数大约就是 n/2第二级索引的结点个数大约就是 n/4第三级索引的结点个数大约就是 n/8依次类推也就是说第 k 级索引的结点个数是第 k-1 级索引的结点个数的 1/2那第 k级索引结点的个数就是 n/(2k)。 假设索引有 h 级最高级的索引有 2 个结点。通过上面的公式我们可以得到 n/(2h)2从而求得 hlog2n-1。如果包含原始链表这一层整个跳表的高度就是 log2n。我们在跳表中查询某个数据的时候如果每一层都要遍历 m 个结点那在跳表中查询一个数据的时间复杂度就是 O(m*logn)。那这个 m 的值是多少呢按照前面这种索引结构我们每一级索引都最多只需要遍历 3 个结点。 假设我们要查找的数据是 x在第 k 级索引中我们遍历到 y 结点之后发现 x 大于 y小于后面的结点 z所以我们通过 y 的 down 指针从第 k 级索引下降到第 k-1 级索引。在第 k-1 级索引中y 和 z 之间只有 3 个结点包含 y 和 z所以我们在 K-1 级索引中最多只需要遍历 3 个结点依次类推每一级索引都最多只需要遍历 3 个结点。 通过上面的分析我们得到 m3所以在跳表中查询任意数据的时间复杂度就是 O(logn)。这个查找的时间复杂度跟二分查找是一样的。 跳表是不是很浪费内存 比起单纯的单链表跳表需要存储多级索引肯定要消耗更多的存储空间。那到底需要消耗多少额外的存储空间呢 我们来分析一下跳表的空间复杂度。跳表的空间复杂度分析并不难我在前面说了假设原始链表大小为 n那第一级索引大约有 n/2 个结点第二级索引大约有 n/4 个结点以此类推每上升一级就减少一半直到剩下 2 个结点。如果我们把每层索引的结点数写出来就是一个等比数列。 这几级索引的结点总和就是 n/2n/4n/8…842n-2。所以跳表的空间复杂度是 O(n)。也就是说如果将包含 n 个结点的单链表构造成跳表我们需要额外再用接近 n 个结点的存储空间。那我们有没有办法降低索引占用的内存空间呢如果我们每三个结点或五个结点抽一个结点到上级索引是不是就不用那么多索引结点了呢 实际上在软件开发中我们不必太在意索引占用的额外空间。在实际的软件开发中原始链表中存储的有可能是很大的对象而索引结点只需要存储关键值和几个指针并不需要存储对象所以当对象比索引结点大很多时那索引占用的额外空间就可以忽略了。 高效的动态插入和删除 跳表这个动态数据结构不仅支持查找操作还支持动态的插入、删除操作而且插入、删除操作的时间复杂度也是 O(logn)。我们知道在单链表中一旦定位好要插入的位置插入结点的时间复杂度是很低的就是 O(1)。要先找到要插入的位置这个查找操作就会比较耗时。对于跳表来说我们讲过查找某个结点的时间复杂度是 O(logn)所以这里查找某个数据应该插入的位置方法也是类似的时间复杂度也是 O(logn)。 我们再来看删除操作。如果这个结点在索引中也有出现我们除了要删除原始链表中的结点还要删除索引中的。因为单链表中的删除操作需要拿到要删除结点的前驱结点然后通过指针操作完成删除。所以在查找要删除的结点的时候一定要获取前驱结点。 跳表索引动态更新 当我们不停地往跳表中插入数据时如果我们不更新索引就有可能出现某 2 个索引结点之间数据非常多的情况。极端情况下跳表还会退化成单链表。 作为一种动态数据结构我们需要某种手段来维护索引与原始链表大小之间的平衡也就是说如果链表中结点多了索引结点就相应地增加一些避免复杂度退化以及查找、插入、删除操作性能下降。跳表是通过随机函数来维护前面提到的“平衡性”。 当我们往跳表中插入数据的时候我们可以选择同时将这个数据插入到部分索引层中。如何选择加入哪些索引层呢我们通过一个随机函数来决定将这个结点插入到哪几级索引中比如随机函数生成了值 K那我们就将这个结点添加到第一级到第 K 级这 K 级索引中。 随机函数的选择很有讲究从概率上来讲能够保证跳表的索引大小和数据大小平衡性不至于性能过度退化。 解答开篇 为什么 Redis 要用跳表来实现有序集合而不是红黑树 Redis 中的有序集合支持的核心操作主要有下面这几个 插入一个数据 删除一个数据 查找一个数据 按照区间查找数据比如查找值在[100, 356]之间的数据 迭代输出有序序列。 其中插入、删除、查找以及迭代输出有序序列这几个操作红黑树也可以完成时间复杂度跟跳表是一样的。但是按照区间来查找数据这个操作红黑树的效率没有跳表高。 当然Redis 之所以用跳表来实现有序集合还有其他原因比如跳表更容易代码实现。虽然跳表的实现也不简单但比起红黑树来说还是好懂、好写多了而简单就意味着可读性好不容易出错。还有跳表更加灵活它可以通过改变索引构建策略有效平衡执行效率和内存消耗。 内容小结 跳表使用空间换时间的设计思路通过构建多级索引来提高查询的效率实现了基于链表的“二分查找”。跳表是一种动态数据结构支持快速地插入、删除、查找操作时间复杂度都是 O(logn)。跳表的空间复杂度是 O(n)。不过跳表的实现非常灵活可以通过改变索引构建策略有效平衡执行效率和内存消耗。虽然跳表的代码实现并不简单但是作为一种动态数据结构比起红黑树来说实现要简单多了。所以很多时候我们为了代码的简单、易读比起红黑树我们更倾向用跳表。
http://www.yutouwan.com/news/37538/

相关文章:

  • 张家港杨舍网站制作永兴网站开发
  • 部队网站建设建议农村淘宝官网首页
  • app下载网站模板网站转化率是什么意思
  • 网站建设与维护模板株洲58同城网站建设电话
  • 微信网站链接网站建设wordpress批量 添加别名
  • 番禺网站建设公司排名wordpress采集豆瓣插件
  • 专业商城网站设计制作广东企业网站备案
  • 在自己的网站上怎么做淘宝客建盏哪家好
  • 免费购物网站系统江门建设建筑网站
  • 下载网站后怎么做的英文版的wordpress能否改中文版
  • 博客优化网站seo怎么写郴州新网招聘手机版
  • discuz门户网站模板wordpress自定义页面跳转
  • 表白网站制作系统源码网页制作常用软件
  • 青岛住房和城乡建设 网站wordpress 禁用响应
  • 有什么好的手机推荐网站浙江荣盛建设集团网站
  • 主流电商网站开发框架网站开发过程中的方法
  • 做网站公司大连免费心理咨询师24小时在线咨询
  • 荆州网站建设价格35互联做的网站如何
  • 加强网站建设考察交流网站推广排名公司
  • 杭州建站模板系统国内网站 备案
  • 百度怎样可以搜到自己的网站什么网站做视频赚钱
  • 网站编程薪资三明网站建设公司
  • 赣州市铁路建设办公室网站wordpress自定义作者连接
  • 免费快速建站工具怎么为网站做外链
  • 上海专业做网站推广的公司苏州工业园区服务外包职业学院
  • 绵阳网站维护托管网站的发布方案有哪些
  • 昆山网站建设多少钱在家建设一个网站需要什么
  • 免费做网站刮刮卡wordpress伪静态卡死
  • 龙华网站建设推广外包物流公司怎么做网站
  • 网站备案是备什么服务器租用网站模版