常用数据结构(算法复习一)

符号表

  • 特点:存储键值对的数据接口,可以支持快速查找,分为有序和无序,有序会有获取最大最小值,以及可以通过key快速定位到所在位置,但是插入相对较慢,需要维护顺序

链表实现无序符号表

  • 特点:查询较慢,插入和修改相对快些
  • 实现逻辑:数据存储在链表中
    • 插入:重复覆盖,不重复,头结点插入
    • 获取:遍历链表,获取元素
    • 删除:遍历找到对应节点,前后引用修改

二分查找实现有序符号表

  • 特点:查询较快,插入和修改相对慢些
  • 实现逻辑:键和值存储在一对平行数组中
    • 获取key位置:通过二分查找,定位key的位置,logN+1次比较
    • 插入:获取key所在位置后,重复,覆盖,不重复,插入后,后续节点后移
    • 获取:二分查找位置,获取数据
    • 删除:定位到key所在位置,删除后,后续元素前移

二叉查找树

  • 特点:性能主要取决于树的高度,而树的高度取决于是否平衡,也就是插入的先后顺序,最好的情况是平衡状态logN,最差的是高度为N
  • 实现逻辑:数据存储在二叉树中,每个节点的值都大于等于其左子树,小于等于其右子树
    • 插入:递归遍历key所对应的值是在左子树还是右子树,如果找到key相同,则覆盖,如果不相同,则插入到对应叶子节点
    • 获取:先判断节点是在左子树还是右子树,通过递归的方式再往下遍历,能够找到则返回,不能则返回空
    • 删除:通过递归遍历定位到key所在位置,若只有一颗子树,则连接即可,若有两颗子树,则让右子树中的最小值替换原节点
      在这里插入图片描述

2-3查找树

  • 特点:相对于二叉查找树是自平衡的,所以性能能够保持在logN
  • 实现逻辑:通过节点的合并和分裂来保证树的自平衡
    在这里插入图片描述

红黑二叉树

  • 特点:相对于二叉查找树是自平衡的,所以性能能够保持在logN
  • 实现逻辑:通过对节点标记颜色,以及旋转和颜色转换的操作保证树的平衡性
    在这里插入图片描述

B+ Tree

  • 特点:1.只有叶子节点存储数据,所以非叶子节点能够包含的元素更多,更加矮胖,IO次数更少;2.叶子节点通过链表连接,范围查询更加便利;3.只有叶子节点存储元素,故所有查询都需要到叶子节点,比较稳定;4.每一次IO会根据局部性原理进行预读,读取带读取数据相邻的部分,可以通过一次IO查询到一个节点,而一个节点能够包含多个数据信息,都会读取到;5.插入删除需要旋转,操作较为复杂;
  • 实现逻辑:1.有k个子树的节点则包含有k个元素;2.只有叶子节点才保存数据,是卫星数据,并且叶子节点包含了所有的数据,会通过一个链表从大到小连接;3.父节点中的元素是每个子节点元素的最大值
    • 获取:通过中序遍历进行获取
    • 插入:需要通过旋转来保持树的平衡
    • 删除:需要通过旋转来保持树的平衡
    • 范围获取:通过链表来获取一段范围的数据
      在这里插入图片描述
      ps:局部性原理: 当一个数据被用到时,其附近的数据也通常会马上被使用,程序运行期间所需要的数据通常比较集中
      b+树图文详解

跳跃表

  • 特点:相对于红黑树,插入的性能更加,且更加简单,无需进行旋转等操作,只需要改变节点的引用即可,而且更容易做范围查找,只需要遍历即可,但是红黑树需要进行中序遍历,较为复杂
  • 实现逻辑:在链表上加入多层链表,上层的链表会跳过其中几个子节点
    • 获取:先遍历最上层的链表引用,找到floor的值后,进入下一层遍历,往复即可
    • 插入:像链表一样先遍历找到位置,在根据随机层数,进行前置和后置引用的连接
    • 删除:与插入类似进行链表引用的删除
    • 获得key位置:通过各层链表跨越个数相加即可
      在这里插入图片描述

Redis为什么用跳表而不用平衡树?

hash表

  • 特点:寻址容易,但是插入时需要通过拉链法,通过链表来存储hash值相同,但是key值不同的元素,但是hash表扩容很耗时,故最好开始时确定表的大小
  • 实现逻辑:把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。
    在这里插入图片描述
    Redis 数据结构之dict
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值