0%

平衡二叉树(AVL 树):严格平衡的二叉查找树

平衡二叉树(AVL 树)是一种自平衡的二叉查找树,其核心特性是左右子树的高度差(平衡因子)的绝对值不超过 1。通过严格的平衡约束和旋转操作,AVL 树保证了树的高度始终为O(logn),从而确保查找、插入、删除等操作的时间复杂度稳定在O(logn),避免了普通二叉查找树在极端情况下的性能退化。

AVL 树的核心定义与特性

平衡因子(Balance Factor)

  • 定义:对于 AVL 树中的每个节点,平衡因子 = 左子树高度 - 右子树高度
  • 约束:所有节点的平衡因子必须满足 -1 ≤ 平衡因子 ≤ 1

核心特性

  • 满足二叉查找树的所有性质(左子树节点值 < 根节点值 < 右子树节点值)。
  • 左右子树均为 AVL 树(递归定义)。
  • 树的高度严格控制在O(logn)(对于 n 个节点的 AVL 树,高度约为1.44log(n+2)-1.328)。

AVL 树的平衡维护:旋转操作

当插入或删除节点导致平衡因子的绝对值超过 1 时,AVL 树通过旋转操作恢复平衡。旋转的目标是调整节点位置,使平衡因子重新满足[-1, 1]的约束,同时保持二叉查找树的有序性。

1. 左旋(Left Rotation)

适用于右子树过高的场景(平衡因子为 - 2),通过将节点与其右子节点旋转,降低右子树高度。

阅读全文 »

Base64 编码:原理、应用与 Java 实现

Base64 是一种基于 64 个可打印字符(A-Z、a-z、0-9、+、/)来表示二进制数据的编码方式,它的核心作用是将二进制数据转换为文本格式,以便在仅支持文本传输的场景中安全传递(如 URL、邮件、XML 等)。

Base64 编码的核心原理

编码规则

  • 字符集:使用 64 个固定字符,对应值为 0-63:
    • A-Z(26 个):对应 0-25
    • a-z(26 个):对应 26-51
    • 0-9(10 个):对应 52-61
    • +:对应 62,/:对应 63
  • 填充符:当二进制数据长度不是 3 的倍数时,用=填充(最多 2 个),确保编码后长度为 4 的倍数。

编码过程(以 3 字节数据为例)

  1. 将 3 字节二进制数据(共 24 位)拆分为 4 个 6 位分组(24 ÷ 6 = 4)。
  2. 每个 6 位分组对应 Base64 字符集中的一个字符(0-63)。
  3. 若数据长度不足 3 字节,剩余位数用 0 填充,并用=补足 4 个字符。

示例:编码字符串"AB"(2 字节)

  • 二进制:01000001 01000010(16 位)
  • 拆分为 3 个 6 位分组 + 剩余 4 位补 0:010000 010100 001000 000000
  • 对应值:16、20、8、0 → 字符:QUJDAA==(最后两位用=填充)。

Base64 的应用场景

Base64 编码并非加密算法(编码过程可逆),主要用于二进制数据的文本化转换,典型场景包括:

阅读全文 »

hexo博客显示阅读时间和字数

hexo版本5.0.2 npm版本6.14.7 next版本7.8.0

效果如下

显示字数和时长

在博客目录下安装npm install hexo-symbols-count-time --save

_config.yml中加入配置

1
2
3
4
5
6
7
symbols_count_time:
#文章内是否显示
symbols: true
time: true
# 网页底部是否显示
total_symbols: true
total_time: true

hexo搜索引擎收录

hexo版本5.0.2 npm版本6.14.7 next版本7.8.0

写博客的目的肯定不是就只有自己能看到,想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap

在hexo下的_config.yml中配置站点地图

1
2
3
4
5
6
7
url: https://zhhll.icu
sitemap:
url: https://zhhll.icu # 自己的域名
path: sitemap.xml #站点地图文件名称
baidusitemap:
url: https://zhhll.icu # 自己的域名
path: baidusitemap.xml #站点地图文件名称

然后在博客目录下安装

1
2
3
4
# 生成普通版本
npm install hexo-generator-sitemap --save
# 生成百度版本
npm install hexo-generator-baidu-sitemap --save

此时就会在public目录下生成对应的站点地图

阅读全文 »

Java 加密组件:安全框架的四大核心模块

Java 平台提供了一套完整的加密安全解决方案,通过四个核心组件构建了全面的安全框架,涵盖加密、解密、签名、认证等功能。这些组件相互配合,为 Java 应用提供了可靠的安全保障。

Java 加密组件的四大核心部分

JCA(Java Cryptography Architecture,Java 加密体系结构)

  • 定位:Java 安全框架的基础,提供加密服务的架构和规范。
  • 核心功能:
    • 定义加密服务的接口标准(如消息摘要、数字签名、密钥生成器)。
    • 提供证书管理、密钥库(KeyStore)操作等基础安全服务。
    • 支持算法的可扩展性(通过 Provider 机制接入第三方加密实现)。
  • 主要包java.security及其子包(如java.security.cert处理证书,java.security.spec定义密钥规范)。
  • 典型类:
    • MessageDigest:消息摘要算法(如 MD5、SHA)的实现入口。
    • Signature:数字签名相关操作(签名与验证)。
    • KeyPairGenerator:非对称密钥对生成器。

JCE(Java Cryptography Extension,Java 加密扩展包)

  • 定位:JCA 的扩展,提供更丰富的加密算法实现。
  • 核心功能:
    • 实现对称加密算法(如 AES、DES、3DES)。
    • 实现非对称加密算法(如 RSA、DSA)。
    • 提供密钥协商、密钥加密等高级功能。
  • 主要包javax.crypto及其子包(如javax.crypto.spec定义加密参数规范)。
  • 典型类:
    • Cipher:加密 / 解密的核心类,支持各种加密模式。
    • KeyGenerator:对称密钥生成器。
    • Mac:消息认证码(如 HmacMD5、HmacSHA256)的实现。
阅读全文 »