【数据结构】记录

2023-11-07

前序遍历

中序遍历

二叉树

搜索二叉树(二叉查找树)

二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率。二叉查找树有以下性质:

对于任意一个节点 n,

  • 其左子树(left subtree)下的每个后代节点(descendant node)的值都小于节点 n 的值;
  • 其右子树(right subtree)下的每个后代节点的值都大于节点 n 的值。

红黑树

树的遍历

四种主要的遍历思想为:

  • 前序遍历:根结点 —> 左子树 —> 右子树

  • 中序遍历:左子树—> 根结点 —> 右子树

  • 后序遍历:左子树 —> 右子树 —> 根结点

  • 层次遍历:只需按层次遍历即可

二分查找

https://mp.weixin.qq.com/s/0Ni9i78uRWjZj4hrhTH03g

二分思想

本质上是折半查找思想,每一轮查找的范围是上一轮的一半,每次查找比较中间元素的值和目标值的大小,比较结论决定取哪一半边作为下一轮的查找范围。当查找范围缩小到空时停止。

局限性:有序、数组

  • 有序性:保证每次取半的意义
  • 数组:数组寻址的复杂度是 O(1)
    如果是用链表存储的一串数,二分查找是无意义的。链表的寻址是 O(n)。

跳表

为什么需要跳表

  • 链表查询太慢 → O(n)
  • 什么算法查询快?二分!→ O(logn)
  • 怎么把二分思想在链表中实践?→ 跳表的诞生 → O(?)

二分查找

  • 有序
  • 数组元素可以随机访问 → 寻址 O(1)

改造链表

  • 有序,不在改造范围内
  • 加快寻址速度
    • 空间换时间 → 上索引
    • 构建索引层 → 每 2 个节点提取 1 个到上一级,逐层构建

时间复杂度

  • 跳表高度:n, n/2, n/4, n/8, …, n/(2^k) → log2n
  • 每层遍历 m 个节点 → O(m*logn)
  • 每层索引最多只需要遍历 3 个节点 → O(logn)
    空间复杂度
  • n/2 + n/4 + n/8 + … + 8 + 4 + 2 → n-2 → O(n)
  • 实际操作中,链表中存储的对象元素很大,索引节点只会存- - 关键信息(比如 id)和指针,索引占用的额外空间可以忽略不计

跳表 索引的更新实现(随机 + 概率)

随机建立索引
  • 原链表,随机抽 n/2 个元素建立一级索引
  • 一级索引,随机抽 n/4 个元素建立二级索引
  • 以此类推,元素越多,索引分布越均匀
概率(随机)更新索引
  • 设计一个特别的函数,按照概率返回 [1, MAX_LEVEL] 之间的整数
  • 1/2 的概率返回 1,不需要更新索引,直接在在原链表中插入元素
  • 1/4 的概率返回 2,需要为新元素建立一级索引
  • 以此类推,无论插入多少个元素,各级索引的节点数依然是 n/2, n/4, ….

Redis 源码

在这里插入图片描述

跳表相关问题

  • 是否了解跳表?

  • Redis 为什么用跳表?

  • Redis 为什么用跳表?为什么不用红黑树?

  • 实现跳表(变态!)

  • 二分思想在链表的应用,提升查找效率,O(n) → O(logn)

  • 空间换时间,构建索引层,空间复杂度 O(n)

  • 增删改查都很高效 -> O(logn)

加分点

  • 索引层的更新,看过 Redis 跳表的源码,一些侃侃而谈
  • 跳表和红黑树的对比
    • 跳表能按照指定的区间查数据
    • 红黑树实现起来很复杂,跳表实现起来不容易出错(不给自己挖坑)
    • 高效查找、动态插入删除,都能做到 O(logn)
    • 共同点
    • 区别

延伸点

  • 对比红黑树
  • 对比散列表
  • Redis 的其他特性,除了跳表,我还知道 xxxx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】记录 的相关文章

  • vue3.0 生命周期简介

    setup 替代 beforecreate gt use setup created gt use setup 前面加on beforeMount gt onBeforeMount mounted gt onMounted beforeUp

随机推荐

  • MySQL之2003错误的解决方法

    今天装了MySQL 结果发现到了晚上打开Command Line Client是已输入密码就错误 然后出现一个error2003瞬间窗口关闭 后来找了一下发现是没有开启MySQL server的原因 解决方法 在命令行输入net start
  • OpenStack的部署(六)------Neutron项目

    目录 一 CT控制节点 1 创建数据库neutron 并进行授权 2 创建用户 服务并赋权 3 注册API 4 安装提供者网络 桥接 并修改相关配置文件 5 重启相关服务 二 C1 C2计算节点操作 1 部署neutron服务 2 配置Li
  • ssh安全登录

    ssh远程登录安全协议 1 ssh keygen 一直按回车即可 2 cd home hadoop ssh 验证公钥和私钥是否生成 注意 服务器想免密登录自己也需要配置免密登录 如果执行ssh copy id hostname报命令不存在那
  • 重写QTabWidget,在标签后面添加图标按钮

    原本的QTabWidget没有支持在标签后面添加自定义的按钮的方法 想在后面添加自定义的功能按钮需要重写QTabWidget类 自己实现按钮图标的重绘和鼠标点击判断等操作 1 使用到的主要事件函数 1 void paintEvent QPa
  • scrollview嵌套recyclerview滑动冲突

    给recyclerview设置下面这个属性就行了 recycler setNestedScrollingEnabled false
  • Guns入门

    一 下载源码包 下载地址 https gitee com stylefeng guns 先将项目的guns admin sql下的SQL文件导入到数据库中 主要数据表
  • Java中常见的运行时异常

    ArithmeticException 算数运算异常 由于除数为0引起的异常 ClassCast Exception 类型转换异常 当把一个对象归为某个类 但实际上此对象并不是由这个类创建的 也不是其子类创建的 则会引起异常 ArraySt
  • Ethernet_II帧和802.3_Ethernet帧格式比较

    一 Ethernet帧格式的发展 1980 DEC Intel Xerox制订了Ethernet I的标准 1982 DEC Intel Xerox又制订了Ehternet II的标准 1982 IEEE开始研究Ethernet的国际标准8
  • 【Linux】linux进程间通信netlink socket(用户与内核通信) 二

    目录 1 netlink socket介绍 2 netlink socket特点 3 为什么引入generic netlink 4 netlink通信架构 5 相关结构体 5 1 genl family 5 2 genl ops 5 3 n
  • 如何快速合并两个有序数组?

    前言 大家好 我是来自于 华为 的 程序员小熊 今天给大家带来一道与 数组 相关的题目 这道题同时也是字节 微软和亚马逊等互联网大厂的面试题 即力扣上的第 88 题 合并两个有序数组 本文主要介绍 逆向双指针 的策略来解答此题 供大家参考
  • Windows 纤程详解

    Windows 纤程详解 在Windows2000 XP中 纤程 fiber 相当于用户级别的线程或轻进程 纤程由Win32库函数支持 对核心是不可见的 纤程可以通过SwitchToFiber显示至另一合作纤程 以实现合作纤程之间的协同 纤
  • STM32程序下载的三种方式

    今天介绍下载STM32程序的三种方式 1 J Flash下载 需要用到J link J Flash 2 MDK配置下载 需要用到J link ST link keil 3 ISP下载 需要用到FlyMcu 串口线 上面提到的硬件和软件图片如
  • 20230802-下载并安装android-studio

    下载 android studio 安装包 https developer android google cn studio 安装android studio 双击安装包 D Android Studio
  • 6.统计累积访问次数

    文章目录 核心思路 核心思路 使用窗口函数sum xx over patition by yy order by zz 当sum窗口函数没有order by时 得到的是分组后的指定列值的总和 有order by时 则是指定列值的前缀累加和
  • c++析构函数后加上virtual的原因

    c 析构函数后加上virtual的原因 虚函数 指向基类的指针在操作它的多态类对象时 会根据不同的类对象 调用其相应的函数 实现动态绑定 C 析构函数加上virtual是为了防止内存泄漏 假设基类中采用的是非虚析构函数 当删除基类指针指向的
  • QT 在主机默认PDF查看应用中打开PDF文档(如通过菜单栏打开使用手册)

    QT 在主机默认PDF查看应用中打开PDF文档 如通过菜单栏打开使用手册 前言 在软件制作完成后 我们都需要告诉用户如何使用软件 使用手册 是一个非常必要的输出文件 能够让用户自行了解软件的使用方法 我观察到很多上位机会在菜单栏中加入打开使
  • numpy输出到屏幕时有逗号和没逗号的原因

    问题起源 输出一个数组 没有逗号 让我感到质疑是不是Numpy array格式 本质一个是print 一个没有用print
  • txt数据转换成json数据保存

    txt数据 小王 19 小李 20 小陈 21 js代码 初始化 const fs require fs const path require path 读取txt文档的数据 fs readFile path join dirname a
  • QDir::currentPath() 和 QApplication::applicationDirPath() 区别和用法

    1 QDir currentPath 的使用 我的理解 若在vs2010平台下 该函数返回的是 工作目录 属性 调试 工作目录 可自定义 Qt5 8 原文 Returns the absolute path of the applicati
  • 【数据结构】记录

    栈 堆 树 前序遍历 中序遍历 二叉树 搜索二叉树 二叉查找树 二叉查找树 BST Binary Search Tree 是一种特殊的二叉树 它改善了二叉树节点查找的效率 二叉查找树有以下性质 对于任意一个节点 n 其左子树 left su