跳表

概述

线性表中的链表是我们都很熟悉的结构了, 链表的增删优于数组, 但是不支持随机访问, 链表在查找时, 只能从头节点向后遍历, 那么针对链表, 能不能解决其访问效率的问题呢? 跳表来了, 顾名思义, 跳表就是可以跳跃的表, 我简单画了张图: 

在原来链表的基础上, 建立一个新的索引链表, 原链表没两个建立一个

原来查找节点5的访问顺序是: 1->2->3->4->5->6, 共遍历了6个节点

现在在索引的基础上查找5的访问顺序是: 1->3->5->5->6(先访问索引), 共遍历了5个节点

这种链表加索引的结构就是跳表

查找

从刚才的介绍中可以看出, 加了一层索引后, 访问效率变高了, 那么再加一层呢? 

我们再次访问节点6, 访问顺序是: 1->5->5->5->6, 需要访问的节点又变少了, 原来访问节点6需要遍历6次, 现在只需要遍历5次

什么, 效率提升不明显? 好, 我加大数据量你再看: 

图画的有些简陋, 将就看吧. 原来链表访问节点128需要遍历128次, 现在只需要遍历14次就可以, 很明显的看出, 跳表确实可以提高查询效率

时间复杂度

在一个链表种, 查询时间复杂度是O(n)

那么, 添加了索引之后, 跳表的查询时间复杂度能优化多少呢? 从上面的例子可以看出, 简直就是二分查找的翻版, 时间复杂度O(logn)

空间复杂度

很清楚的看出来, 跳表的解决方案就是用空间来换时间

若原来的链表占用空间为n, 那么一级索引占用空间为n/2, 二级索引占用空间为n/4

总占用空间=n+n/2+n/4+...+2=2n-2

所以, 其空间复杂度为O(n)

插入和删除

当链表有了高效的查找时, 高效的删除和插入也就是顺理成章的事了. 

先别高兴太早, 当我们对链表的数据进行插入和删除操作时, 一个因为建立索引而带来的新问题出现了, 当更新链表时, 也要更新索引. 当我们在两个节点之间频繁更新数据时, 就会导致这一段数据过多, 索引就减少了他的意义, 甚至极端情况会退化为单链表. 

那么如何保证跳表的平衡, 避免跳表因为插入而出现复杂度退化呢? 

一种解决方案是, 当链表插入新的数据时, 同时将新插入的数据添加到跳表的索引中, 这样就解决了索引的问题, 但是将节点更新到所有索引中显然不可取, 同时也会降低查询的效率, 针对这种情况, 通过一个随机函数, 比如: 链表共又3级索引, 随机数是2, 那么就将新插入的节点添加到第一、二级索引中, 如下图: 

 

 


以上, 就是跳表的简单介绍!!

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

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

相关文章

论文写作——用excel和ppt做好看的论文图

论文写作——用excel和ppt做好看的论文图Excel 作图PPT保存前言:用matlab或者python作图,门槛较高,熟悉比较难。用excel和ppt就比较容易上手了。最近的论文全用ppt和excel作图,看着也不赖,在此记录一下一般的方法。 co…

Arduino Uno + Lora shield rf95_server 提示错误“Init failed!”

错误描述 在使用原始的Arduino提供的示例rf95_server和rf95_client的时候,烧了rf96_server的板子会出现“init failed!”的错误,如下。 问题解决 经过排查,初始化失败由Led相干代码引起,因此将它们注释掉就好了&…

眼见为实

我们从小就一直再说 耳听为虚眼见为实, 但是眼见的就一定是真实的么? 我们都知道眼睛的构造, 首先是一个凸透镜, 而凸透镜接收到的图像是倒立的, 那么为什么我们看到的图像是正立的呢?当然是大脑负责将倒立的图像反转过来. 其次, 我们是左右两只眼睛, 而两只眼睛接收到的图…

用树莓派+lora shield搭建一个LoRaWAN网关

文章目录1. 创建单信道LoRaWAN网关1.1 准备工作配置树莓派上网开启树莓派SPI接口安装必需库文件1.2 正式开始把LoRa shield连接到树莓派上下载单信道LoRa网关代码到树莓派2. TTN网站相关操作2.1 注册并登录TTN2.2 注册Gateway2.3 注册Application2.4 注册device3. Client端操作…

基于linux的MsQUIC编译及样例运行

参考链接: https://github.com/microsoft/msquic/blob/main/docs/BUILD.md 软件相关版本 Ubuntu 20.04 编译/构建 1. 下载源代码 $ git clone --recursive https://github.com/microsoft/msquic.git 2. Powershell安装: 安装链接(根据…

转载:tcpdump抓包和Wireshark解包

转自:https://www.cnblogs.com/domestique/p/8028405.html 简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头…

散列表(哈希表)

概述 什么是散列表? 如果说起它的另一个名字, 你一定很熟悉, 它的英文叫"Hash Table", 哈希表, 很熟悉吧. 散列的思想, 其实就是利用数组的随机访问特性, 将key-value形式的数据, 其中的key转换成数组下标, 即可实现将其存放到数组中, 进而实现随机访问. 而其中将…

如何让nRF52840 dongle化身为BLE sniffier (过程详细记录)

参考链接: How to install BLE Sniffer on nRF52840 Dongle and run it – Jimmys thing 软件环境: Windows 10Python v3.6 or later: 安装地址:Python Releases for Windows | Python.orgWireshark v2.4.6 or later: 安装地址:Wireshark DownloadnRF Connect: 安装地址: n…

【安全】基础概念梳理-基本加密方式、数字签名、证书

一、两种基本加密方式 1.1 对称加密 对称加密是指双方持有相同的密钥进行通信,加密速度快。常见的对称加密算法有DES、3DES、AES等。存在问题:通信双方如何获得相同的密钥? 1.2 非对称加密 非对称加密,又称为公开密钥加密&#…

【坑】云相关

1. NAT NAT(Network Address Translation,网络地址转换:当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但又想和因特网上的主机通信(并不需要加密&…

Pycharm 2019 添加 docker 解释器

打开docker的tls 点击设置: 搜索docker, 添加: 点击解释器选项 添加 选择docker 这里说缺少映射, 先不管 接下来, 创建一个新项目, 在选择解释器的时候, 如果选择刚刚添加的, 会报错, 先选一个能用的, 进到项目再换 在右下角的解释器小部件, 选择我们刚刚添加的 然后就可以正常…

【待补】Wireshark+BLE dongle: BLE数据包捕获以及分析

文章目录前言1. 捕获BLE数据包2. 分析BLE数据包2.1 过滤掉不感兴趣的BLE数据包2.2 利用Wireshark内嵌工具生成图表前言 硬件:Nordic 52840 dongle 软件: Wireshark 1. 捕获BLE数据包 待补充。 2. 分析BLE数据包 2.1 过滤掉不感兴趣的BLE数据包 以自…

js动态添加div

问题 有没有遇到过这样的需求, 在页面上会有不定个input, 点击添加按钮就添加 每次写这玩意好麻烦啊, 把他封装起来, 需要的时候调用就好了 思路 因为每个input标签的name如果相同的话, 在后端接收的时候会出错, 所以我的解决办法就是在name后加上一个数字, 后端用一个循环进…

【5G入门】MCS调制编码方案简介

​ 目录参考资料:1. MCS简介MCS是什么如何选择MCS有哪些MCS可供选择如何配置MCS示例参考资料: 链接: 5G NR Modulation and Coding Scheme – Modulation and Code Rate. 1. MCS简介 MCS是什么 MCS(Modulation and Coding Scheme&#xf…

caffe初体验

caffe是一个深度学习的框架, 具体我也不太清楚, 可以自行百度吧, 我也是刚刚知道有这么一个框架, 才疏学浅啊. 在安装完caffe, 我的第一个想法就是, 别管他是个啥东西, 总得先让我运行一些看一看吧. 刚好, 官方就准备了一些数据, 供我们运行一下看一看使用. 因为我是通过dock…

【安全】进阶的Mosquitto:搭建一个安全的MQTT服务

目录一、基础版Mosquitto安装及运行Mosquitto安装Mosquitto运行二、基础安全版Mosquitto安装及运行(需要输入密码)Mosquitto安装Mosquitto配置Mosquitto测试效果三、安全版Mosquitto安装及运行Mosquitto安装TLS安装Mosquitto配置Mosquitto测试效果注意一…

PHP 循环引用的问题

问题 为了引出问题, 先来看下面一段代码: <?php $arr [a, b,c, d, ];foreach ($arr as &$each){echo $each; } echo PHP_EOL; foreach ($arr as $each){echo $each; }这段代码很简单, 输出数组的元素两次, 感觉会输出两次 abcd? 不好意思, 输出结果如下:  是不是感…

揭开HTTPS的神秘面纱

在说HTTP前&#xff0c;一定要先介绍一下HTTP&#xff0c;这家伙应该不用过多说明了&#xff0c;大家每天都在用&#xff0c;每一次HTTP请求&#xff0c;都是一次TCP连接。遗憾的是&#xff0c;请求的内容在TCP报文中是明文传输的&#xff0c;任何人截取到请求都可以读取其中的…

递归函数两种方式的区别

概述 递归函数都不陌生&#xff0c;比如计算n的阶乘&#xff1a; function f($n){if($n < 1) return 1;return $n * f($n-1); } 当然&#xff0c;有人可能会这么写&#xff1a; function f($n, $result){if($n < 1) return $result;return f($n-1, $n*$result); } 上…

Trie树

概述 在Google中随意搜索&#xff0c;如下所示&#xff1a; 他会自动显示相关的搜索&#xff0c;不知道有没有想过这个功能是如何实现的呢&#xff1f;面对海量的数据&#xff0c;它怎么能在我输入的同时&#xff0c;如此快速的检索到相关内容呢&#xff1f;当我查找资料后&am…