【数据结构】树哈希

embedded/2025/2/7 0:04:16/

目录

  • 一、树的同构
    • 1. 定义
    • 2. 具体理解
      • (1) 结点对应
      • (2) 孩子相同
      • (3) 递归性质
    • 3. 示例
  • 二、树哈希
    • 1.定义
    • 2.哈希过程
      • (1)叶节点哈希
      • (2)非叶节点哈希
      • (3)组合哈希值
    • 3.性质
    • 4.应用
    • 5.示例
      • (1)*first step*
      • (2)*second step*
      • (3)*third step*


一、树的同构

树的同构是一个重要的概念,以下是关于树的同构的详细定义:

1. 定义

给定两棵树 T 1 T1 T1 T 2 T2 T2,如果 T 1 T1 T1可以通过若干次左右孩子互换就变成 T 2 T2 T2,则称这两棵树是“同构”的。这意味着,两棵树中的每两个对应结点的孩子必须相同,但左右位置可以不一样。

2. 具体理解

(1) 结点对应

两棵树中的结点需要一一对应,即每一个结点都有一个与之对应的结点,且这些对应结点的需要相等。

(2) 孩子相同

对应结点的孩子(即子结点)必须相同,也就是说,对应结点左孩子和右孩子的数量和值都要相等,但它们的左右位置可以互换。

(3) 递归性质

由于树是递归定义的,因此树的同构也具有递归性质。即,如果两棵树的根结点对应,且它们的左子树和右子树(不考虑左右顺序)分别同构,则这两棵树就是同构的。

3. 示例

例如,有以下两棵树:

  • A A A:根结点为 1 1 1,左子结点为 2 2 2,右子结点为 3 3 3
  • B B B:根结点为 1 1 1,左子结点为 3 3 3,右子结点为 2 2 2

虽然树 A A A和树 B B B的左右子结点位置不同,但它们的根结点值相同,且左子结点和右子结点的值也相同(只是位置互换),因此可以认为这两棵树是同构的。

综上所述,树的同构是一个基于结点对应和孩子相同(左右位置可互换)的递归概念。

二、树哈希

树哈希(Tree Hash)是对树形数据结构进行哈希处理的一种方法。以下是对树哈希的详细解释:

1.定义

树哈希是一种算法>哈希算法,它通过对树形数据结构中的每个节点进行哈希计算,并将这些哈希值组合起来,以生成整个树的唯一哈希值。这个哈希值可以作为树的“数字指纹”,用于快速比较两棵树是否相同或检测树的修改。

2.哈希过程

(1)叶节点哈希

首先,对树中的每个叶节点进行哈希计算,生成叶节点的哈希值。这些哈希值通常作为叶节点的标签或标识符。

(2)非叶节点哈希

对于非叶节点(包括中间节点和根节点),它们的哈希值是通过对其子节点的哈希值进行进一步哈希计算得到的。具体来说,可以将子节点的哈希值作为输入,应用哈希函数来生成非叶节点的哈希值。

(3)组合哈希值

在生成非叶节点的哈希值时,通常需要按照一定的顺序或规则来组合其子节点的哈希值。这可以确保哈希值的唯一性和一致性。

3.性质

(1) 唯一性 \red{\texttt{唯一性}} 唯一性

对于不同的树形数据结构,即使它们包含相同的节点和边,但只要结构不同(例如节点的排列顺序不同),它们的哈希值也将不同。

(2)快速比较

通过比较两棵树的哈希值,可以快速判断它们是否相同。如果哈希值相同,则两棵树在结构上必然相同;如果哈希值不同,则两棵树在结构上必然不同。

(3)检测修改

哈希值对树的修改非常敏感。即使对树中的某个节点进行微小的修改(例如更改节点的值或添加/删除节点),也会导致整个树的哈希值发生变化。

4.应用

例如算法优化,在算法设计中,树哈希可以用于优化某些算法的性能。例如,在字符串匹配算法中,可以使用树哈希来快速比较两个字符串的子串是否相同。

5.示例

假设有以下树形数据结构:

我们可以按照以下步骤计算整个树的哈希值:

(1)first step

计算叶节点 D D D E E E C C C的哈希值,分别记为 H ( D ) H(D) H(D) H ( E ) H(E) H(E) H ( C ) H(C) H(C)

(2)second step

计算非叶节点 B B B的哈希值,可以使用 H ( B ) = H a s h ( H ( D ) + H ( E ) ) H(B)=Hash(H(D) + H(E)) H(B)=Hash(H(D)+H(E))(这里的“ + + +”表示哈希值的组合方式,可以是拼接、异或等操作)。

(3)third step

计算根节点 A A A的哈希值,可以使用 H ( A ) = H a s h ( H ( B ) + H ( C ) ) H(A)=Hash(H(B) + H(C)) H(A)=Hash(H(B)+H(C))

最终,整个树的哈希值就是 H ( A ) H(A) H(A)

综上所述,树哈希是一种强大的工具,可以用于快速比较和检测树形数据结构的完整性和一致性。


http://www.ppmy.cn/embedded/160151.html

相关文章

实施工程师:面试基础宝典

一.运维工程师和实施工程师的区别:工作内容不同、职能不同、工作形式不同 1.工作内容不同: 运维工程师要对公司硬件和软件进行维护。 硬件包括:机房、机柜、网线光纤、PDU、服 务器、网络设备、安全设备等。 实施工程师包括常用操作系统、应…

【含开题报告+文档+PPT+源码】基于Spring Boot的剧院购票平台的设计与实现

开题报告 本文聚焦于基于Springboot框架的剧院购票平台的设计与开发。该平台旨在为用户提供便捷、高效的在线购票服务,满足剧院演出票务管理的需求。通过Springboot框架的灵活性和扩展性,系统实现了用户管理、演出信息管理、座位管理、订单处理、支付集…

MongoDB学习笔记-解析jsonCommand内容

如果需要屏蔽其他项目对MongoDB的直接访问操作&#xff0c;统一由一个入口访问操作MongoDB&#xff0c;可以考虑直接传入jsonCommand语句解析执行。 相关依赖包 <!-- SpringBootDataMongodb依赖包 --> <dependency><groupId>org.springframework.boot</…

在Debian 12上安装VNC服务器

不知道什么标题 可以看到这个文章是通过豆包从国外网站copy的&#xff0c;先这样写着好了&#xff0c;具体的我有时间再补充&#xff0c;基本内容都在这里了。 在Debian 12上安装VNC服务器 简介 VNC&#xff08;Virtual Network Computing&#xff0c;虚拟网络计算&#xf…

Unity开发游戏使用XLua的基础

Unity使用Xlua的常用编码方式&#xff0c;做一下记录 1、C#调用lua 1、Lua解析器 private LuaEnv env new LuaEnv();//保持它的唯一性void Start(){env.DoString("print(你好lua)");//env.DoString("require(Main)"); 默认在resources文件夹下面//帮助…

Ubuntu部署Deepseek-R1模型(8b)

安装ubuntu系统 本机电脑系统ubuntu-20.04 #升级软件 sudo apt-get update#安装curl sudo apt-get install curl通过以上两条指令&#xff0c;完成了curl命令的安装。 安装ollama 打开Ollama官网 选择Linux&#xff0c; 给出如上图方框所示的一条指令 curl -fsSL https:…

OpenCV:图像轮廓

目录 简述 1. 什么是图像轮廓&#xff1f; 2. 查找图像轮廓 2.1 接口定义 2.2 参数说明 2.3 代码示例 2.4 运行结果 3. 绘制图像轮廓 3.1 接口定义 3.2 参数说明 3.3 代码示例 3.4 运行结果 4. 计算轮廓周长 5. 计算轮廓面积 6. 示例&#xff1a;计算图像轮廓的面…

中国城商行信贷业务数仓建设白皮书(第一期:总体规划)

一、项目背景与行业现状 1.1 国内城商行信贷业务痛点 2024年统计数据显示:全国134家城商行平均历史数据处理延迟达37小时/次 传统Oracle架构日均处理能力上限仅为320万笔交易 客户特征维度不足(现行系统平均维护86个客户标签) 监管报表生成耗时超同业股份制银行2.3倍 1.2 H…