IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法之美(七)跳表:链表的二分查找 -> 正文阅读

[数据结构与算法]数据结构与算法之美(七)跳表:链表的二分查找

介绍

跳表是一种链表加多级索引动态数据结构,具体来说是每两个结点提取一个结点到上一级作为索引,如下图所示:
在这里插入图片描述

所以跳表相对于普通单链表,查找一个结点所需要遍历的结点个数减少了,也即查找效率提高了。跳表是一种支持二分查找的链表,可以快速地插入、删除、查找,甚至可以替代红黑树。Redis里的有序集合就是用跳表来实现的。

复杂度分析

时间复杂度

在跳表中查找、插入、删除的时间复杂度都是 O ( l o g n ) O(logn) O(logn)

1.查找的时间复杂度推导

  • 查多少层:对于结点个数为n的链表,会有多少级索引?第一级有 n 2 \frac{n}{2} 2n?个结点,第二级有 n 2 2 \frac{n}{2^2} 22n?个结点,第k级有 n 2 k \frac{n}{2^k} 2kn?个结点,最后一级是2个结点,所以通过 n 2 k = 2 \frac{n}{2^k}=2 2kn?=2,得到最后一级 k = l o g 2 n ? 1 k=log_2n-1 k=log2?n?1。如果把原始链表也算作一级,那么最后一级就是 l o g 2 n log_2n log2?n,所以一共查 l o g 2 n log_2n log2?n层就能查到
  • 每层内查几次:最多3次。因为上一层决定了所查找的数在结点j和j+1之间,才会下到下一层去找,而上一层的结点j和j+1之间对应到下一层,只有三个结点
  • 总结:跳表的查找时间复杂度为 O ( 3 l o g 2 n ) = O ( l o g n ) O(3log_2n)=O(log n) O(3log2?n)=O(logn)

2.插入的时间复杂度推导

单链表的插入:查找 O ( n ) O(n) O(n) + 插入 O ( 1 ) O(1) O(1)
跳表的插入:查找 O ( l o g n ) O(logn) O(logn) + 插入 O ( 1 ) O(1) O(1)

3.删除的时间复杂度推导

查找 O ( l o g n ) O(logn) O(logn)+删除 O ( 1 ) O(1) O(1),删除时要注意:记住前驱结点、如果索引中有也要删除索引中的

空间复杂度

跳表的空间复杂度为 O ( n ) O(n) O(n),具体推导如下:

  • 在分析时间复杂度时已经提到,对于结点个数为n的链表,会有 l o g 2 n ? 1 log_2n-1 log2?n?1层索引,各层索引的结点数分别是 n 2 \frac{n}{2} 2n? n 2 2 \frac{n}{2^2} 22n?,…, n 2 k \frac{n}{2^k} 2kn?,…,2这样的等比数列
  • 根据等比数列求和公式:
    在这里插入图片描述
    得到跳表的空间复杂度为 O ( n ) O(n) O(n)
    在这里插入图片描述

跳表的动态更新

跳表是一种动态数据结构,就是指它的索引是要动态更新的,特别是当插入了很多个结点、或者删除了一些结点时,可能会出现两个索引结点之间的下一层结点很多的情况,造成复杂度退化。

跳表通过随机函数来维护,当往跳表中插入数据的时候,可以选择同时将这个数据插入到部分索引层中,具体插入到从哪一级开始的索引是由一个随机函数生成的。
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:39:43  更:2022-03-03 16:42:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:51:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码