数据结构:AVL树、哈夫曼树、哈希表

树的定义

树是一种重要的数据结构,广泛应用于计算机科学中。根据不同的需求和应用场景,树可以分为多种类型:

  • 普通树:每个节点包含数据域、第一个孩子和下一个兄弟。
  • 二叉树:每个节点包含数据域、左子树和右子树。
    • 满二叉树:一个满二叉树的节点数为 (2^n - 1)。
    • 完全二叉树:所有层都完全填满,除了最后一层,节点从左到右依次排列(如堆、优先级队列)。
    • 二叉搜索树:左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值。

平衡二叉搜索树

平衡二叉搜索树是一种特殊的二叉搜索树,其特点是任意两个叶子节点的深度差不大于1。常见的平衡二叉搜索树有:

  • AVL 树
  • 红黑树(通常用于实现二叉搜索树)
  • 树堆

AVL树

AVL树是一种严格平衡的二叉搜索树,通过旋转操作来保持平衡。常见的不平衡情况及其解决方法如下:

  • 左左(LL):右旋(顺时针旋转)
  • 左右(LR):先左旋再右旋
  • 右右(RR):左旋(逆时针旋转)
  • 右左(RL):先右旋再左旋
    左旋右旋示例

红黑树

红黑树是一种平衡二叉搜索树,具有以下五个属性:

  1. 对所有节点着色,红或黑。
  2. 根节点为黑色。
  3. 叶子节点为黑色的空节点。
  4. 红色节点的左右孩子节点为黑色(不能出现连续的红色)。
  5. 任意一条路径中黑色节点数量相同。

哈夫曼树

哈夫曼树是一种用于文本数据编码和压缩的算法。其编码方式如下:

  • 定长编码

  • ANSI:1 byte(8 bit)

  • GB2312:2 byte(16 bit)

  • 变长编码

  • UTF-8:

  • 字母数字:1 byte

  • 中文汉字:3 byte

例子

示例1

例子

示例2

B 树和 B+ 树

MySQL表查询基于 B+ 树实现。

B 树

B 树是一种平衡多路查找树,一个节点可以存储多个键值(索引值),若是n个键,则子树为 n + 1 个分支。

  • 优点:可以大幅降低树的深度,在进行各种操作时在磁盘访问节点的次数降低。
  • 缺点:在每个节点的比较次数增加了。

在磁盘上进行各种操作,推荐使用B(B+)树而非二叉搜索树。

构建过程比较

  • 二叉搜索树:自上而下
  • B 树:自下而上

B+ 树

B+ 树是B树的增强版,与B树不同的是同层节点间有指针连接。

  • MySQL InnoDB 引擎:使用B+树。
  • MyISAM、Memory:使用B树。
BB+
数据所有节点叶子节点
叶子节点双向链表
访问随机按照范围访问

哈希表

哈希表是一种基于数组定义的散列表。哈希表不允许放满,装载因子一般为70%左右,存入数据达到容量的装载因子数后,需要扩容。

哈希函数

  • md5
  • sha1
  • sha256

数据的键 -> 整数

整数 % 数组大小 = 0 ~ len - 1

哈希冲突

哈希函数值相同会导致哈希冲突。

冲突解决方法
  • 线性探测:n + 1
  • 平方探测:2^n, 1, 2, 4, 8…
  • 二次哈希
  • 分离链表(*):链表大于8,转成二叉搜索树

哈希表实现

参考此文章:哈希表的定义和核心功能实现

Redis数据库

Redis数据库的本质就是一个哈希表,使用键值对,时间复杂度为常数级O(1)。

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值