数据结构三——跳表

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

跳表的由来

说明:图片来自极客时间
由来
  二分查找的数据结构是数组,利用数组随机访问的特定查找的时间复杂度是O(logn)。如果数据结构是链表,可以达到这样的速度吗?答案是可以的。只是要改造。改造之后的结构就是跳表,是一种动态数据结构,可以支持快速的插入、删除、查找、按范围查找。功能类似于红黑树。Redis中的有序集合使用的就是跳表。

跳表的结构

图片来自极客时间
  对于单链表来说,存储的数据是有序的,想要查找某个数,时间复杂度是O(n)。如果对单链表建一个一级“索引”,就是说每两个节点提取一个节点。提取出的节点有一个down指针指向原始链表中的同一个节点。
  在这里插入图片描述
  现在要查找数据16,那么查找路径是:1,4,7,9,13,13(原始链表),16。查找7个节点。单链表查找16需要查找10个节点。
  如果对一级索引再建“索引”,形成二级索引。
  在这里插入图片描述
  现在要查找数据16,那么查找路径是:1,7,13,13,13,16。查找6个节点。
  当n小的时候,减少的节点数量不明显。如果是n=64。建5级索引。
  在这里插入图片描述
  现在查找62需要11个节点,路径是1,33,33,49,49,57,57,61,61,61,62。原来需要62个节点。提升效果很明显。当n越大,提升效果越明显。
  跳表=链表+多级索引

跳表的时空复杂度

时间复杂度
 当节点个数为n的时候,跳表会建几层索引呢?第1级索引节点个数n2\dfrac{n}{2}2n,第2级索引节点个数n4\dfrac{n}{4}4n,第k级索引节点个数n2k\dfrac{n}{2^k}2kn。最上面一层索引节点个数是2。也就是说2=n2l2=\dfrac{n}{2^l}2=2ln,l+1=log2nl+1=log_2nl+1=log2n,l=log2n−1l=log_2n-1l=log2n1。再加上原始链表层,跳表有log2nlog_2nlog2n层,记为logn。
 每一层最多查询的节点个数是3。因为在建每一层索引的时候,是每2个数据建一个节点。例如查找数据x,在第k层发现y&lt;x,x&gt;zy&lt;x,x&gt;zy<x,x>z,所以通过y的down指针向,从第k层走到第k-1层。而y和z节点之间最多有3个节点(包含y和z)。
 在这里插入图片描述
 那么跳表的时间复杂度就是O(logn)。和二分查找是同样的查找效率。
空间复杂度
 链表的查找速度和二分一样,这是需要付出空间代价的。也就是以空间换时间。那么额外需要多少空间呢?n2+n4+n8+...+2=n\dfrac{n}{2}+\dfrac{n}{4}+\dfrac{n}{8}+...+2=n2n+4n+8n+...+2=n,等比数列求和。所以空间复杂度是O(n)。

跳表插入和删除

插入
 对于插入来讲,为了维持链表的有序性,在插入一个数据的时候需要先查找到插入的位置。
 在这里插入图片描述
 例如在链表中插入6,需要查找插入位置,查找节点1,1,4,4,5,时间复杂度和查找一个数字类似,O(logn)。链表的插入操作是O(1),所以整体插入操作时间复杂度O(logn)。
删除
 删除操作不仅要删除链表层,同时需要删除索引层的节点。时间复杂度O(logn)。

动态索引表更新

索引更新
 当不断插入数据的时候,如果不更新索引层,极端情况下跳表退化为单链表。当插入数据的时候,同时更新某些索引层。至于在哪些层建索引,可以通过随机函数来选择。

思考题

1 redist为什么使用跳表而不是红黑树?
 redist的核心操作是:
 插入一个数据;
 删除一个数据;
 查找一个数据;
 按范围查找一个区间内的数据;
 迭代输出有序序列
 红黑树效率不高的操作是:按范围查找一个区间内的数据。
 其他原因:跳表更容易实现,代码比较简单。

2 如果每3个或者5个节点抽取一个做索引,那么跳表的时间复杂度和空间复杂度是多少呢?
如果每三个或者五个节点提取一个节点作为上级索引,那么对应的查询数据时间复杂度,也还是 O(logn)。其实这里的底数已经不是2,而是3或者5。
空间复杂度,也依然是一个等比数列的和:n3+n9+n8+...+3=32(n−1)\dfrac{n}{3}+\dfrac{n}{9}+\dfrac{n}{8}+...+3=\dfrac{3}{2}(n-1)3n+9n+8n+...+3=23(n1),记为O(n)。

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

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

相关文章

[BUGKU][CTF][MISC][2020] MISC writeup持续更新中

CTF总结 ctf基本操作&#xff1a;https://blog.csdn.net/mafucan/article/details/106886421 zip: https://www.anquanke.com/post/id/86211 找软件推荐网址 1.https://www.52pojie.cn/ 2.没有的话百度一下 去找百度云 工具下载&#xff1a; stegSolve 隐写分析 需要配置Java…

spring学习(1):初始项目

1打开idea----new project 2点击建立项目的类型maven 点击next 3点击next 4选择路径&#xff0c;点击完成 5建立成功之后修改pom.xml配置文件 添加&#xff0c;解决依赖关系 <dependencies><dependency><groupId>org.springframework</groupId><ar…

[密码学][困难问题][常见规约]密码学问题常见困难问题

参考网址(科学上网) 密码学问题常见困难问题,需要点击参考网址进行查找 其困难问题的介绍非常友好&#xff0c;请根据目录快速找到相关资料 以下是检索 目录 Discrete logarithm problem DLP: discrete logarithm problem CDH: computational Diffie-Hellman problem SDH:…

数据结构四——散列表(下)

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 7 散列表链表的应用 很多情况下散列表会和链表一起使用。散列表可以通过key查找value。链表可以按照value进行排序。这样就能通过value查找key&#xff0c;也可以通…

spring学习(2):初始化spring程序

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

Asp.Net Core 第05局:读取配置

前言 本文介绍Asp.Net Core 读取配置文件。环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 前期准备 1.添加app.json文件并在里面添加内容&#xff1b; 2.将app.json文件配置到应用中&#xff1b; 3.添加app.json对应的AppConfig类&#xff1b; 4.下面三种方式读取配置文…

[BUGKU][CTF][PWN][2020] PWN writeup

准备UBUNTU pwndbg pwntools PWN1 关键字&#xff1a;nc 知识点&#xff1a;nc使用方法 https://www.cnblogs.com/nmap/p/6148306.html nc命令是一个功能打包的网络实用程序&#xff0c;它通过命令行在网络上读取和写入数据;nc是为NMAP项目编写的&#xff0c;是目前已分裂的ne…

spring学习(3):获取bean对象

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

数据结构四——散列表(上)

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1散列表的由来 从数组随机访问特性说起。  数组的随机访问特性是&#xff1a;数组a,a[5]可以直接访问到数组的第6个元素。这就类似于在下标和数组对应的值之间建立…

[BUGKU][CTF][Reverse][2020] Reverse writeup 1-7 暂时肝不动了

Reverse 入门逆向 步骤: ida main函数 按R Reverse signin 关键字&#xff1a; 知识点&#xff1a;Android逆向分析。&#xff08;常用工具&#xff1a;安卓模拟器、JEB、Cyberchef、Androidkiller&#xff09; 步骤: 1.用jeb打开&#xff0c;找到MainActivity&#xff0c;右…

spring学习(4):spring管理对象之间的关联关系

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

[Lua]LuaAPI整理

ref &#xff1a;https://blog.csdn.net/ouyangshima/article/details/43339571 LUA和C/C的沟通桥梁——栈 Lua生来就是为了和C交互的&#xff0c;因此使用C扩展Lua或者将Lua嵌入到C当中都是非常流行的做法。要想理解C和Lua的交互方式&#xff0c;首先要回顾一下C语言是如何处理…

[hackinglab][CTF][基础关][2020] hackinglab 基础关 writeup

在线工具&#xff1a;https://www.qqxiuzi.cn/daohang.htm 基础关 1 key在哪里&#xff1f; 知识点&#xff1a;F12查看源代码 步骤:F12 基础关 2 再加密一次你就得到key啦~ 知识点&#xff1a;ROT13 步骤: 基础关 3 猜猜这是经过了多少次加密&#xff1f; 关键字&#xf…

spring学习(5):spring简介

1什么是spring 核心概念 spring框架组成

算法四——哈希

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 哈希算法的定义 文章来自极客时间。 参考网页 定义&#xff1a;将任意长度的二进制值串映射为固定长度的二进制值串。映射之后的二进制值串称为哈希值。 符合几点要…

spring学习(6):使用xml方式实现spring基本应用

接着上一节的课程继续学习 在resources文件下建立applicationconText applicationconText.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3…

[burp][CTF]burp intruder爆破出现 Payload set 1: Invalid number settings的解决办法

这是一个软件bug 如果点击start attrack 后出现 Payload set 1: Invalid number settings 的提示&#xff0c;先点hex 后点 decimal 再开始start attrack&#xff0c;需要手动让它刷新。

数据结构五——二叉树

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 树 1.1 概念 概念&#xff1a;树、根、父节点、子节点、叶子节点。 几个度&#xff1a;高度、深度、层。与实际生活中的这几个概念类比。 高度&#xff1a;从下往…

spring学习(7):加入log4g日志系统

点击show dependencies popup 修改pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

[hackinglab][CTF][脚本关][2020] hackinglab 脚本关 writeup

脚本关 1 key又又找不到了 关键字&#xff1a; 知识点&#xff1a; 步骤:点击提供的链接后&#xff0c;实际发生了两次跳转&#xff0c;key 在第一次跳转的网页中&#xff0c;key is : yougotit_script_now 脚本关 2 快速口算 关键字&#xff1a; 知识点&#xff1a;python基…