【数据结构】树哈希

目录

  • 一、树的同构
    • 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.mzph.cn/web/68159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用DeepSeek的技巧笔记

来源:新年逼自己一把,学会使用DeepSeek R1_哔哩哔哩_bilibili 前言 对于DeepSeek而言,我们不再需要那么多的提示词技巧,但还是要有两个注意点:你需要理解大语言模型的工作原理与局限,这能帮助你更好的知道AI可完成任务…

【工具篇】ChatGPT:开启人工智能新纪元

一、ChatGPT 是什么 最近,ChatGPT 可是火得一塌糊涂,不管是在科技圈、媒体界,还是咱们普通人的日常聊天里,都能听到它的大名。好多人都在讨论,这 ChatGPT 到底是个啥 “神器”,能让大家这么着迷?今天咱就好好唠唠。 ChatGPT,全称是 Chat Generative Pre-trained Trans…

【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)

1. 安装必要的依赖 以 CentOS 7 系统为例,安装必要的依赖包: sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…

$route 和 $router 的区别是什么?

在 Vue Router 中,$route 和 $router 是两个不同的对象,它们各自承担着不同的角色。下面是它们的主要区别: 一、$route 定义$route 是当前路由的信息对象,包含了与当前路由相关的状态和参数。它是一个只读对象。 2. 主要属性 params:动态路由参数,例如 /user/:id 中的 …

node.js 08 express的使用和热重载nodemon的安装

一.express的安装和使用 安装 npm i express 使用 //引入express const express require(express)//启动服务器 const app express()//设置get请求地址,获取请求地址信息,和发送返回的数据 app.get(/bailan,(req, res) > {//req.query可以获取到客…

Python因为网络原因安装依赖库报错

现象 在终端运行以下指令 pip install pyautogui pillow keyboard 出现报错,终端信息如下: PS D:\code\Python> pip install pyautogui pillow keyboard Collecting pyautoguiUsing cached PyAutoGUI-0.9.54.tar.gz (61 kB)Installing build depe…

面试问题记录1

问题一:性能测试步骤 性能测试步骤主要包括以下几个阶段: ‌1. 需求分析阶段‌ 明确测试目标,了解性能测试需求,包括业务列表、性能指标、测试环境、数据量等详细需求‌12。熟悉项目相关的资源,如架构设计、软硬件环…

开源 GPU 集群管理器 GPUStack 轻松拉起deepseek各版本模型

GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。 项目地址:gpustack/gpustack: Manage GPU clusters for running AI modelshttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://githu…

ESP32开发学习记录---》GPIO

she 2025年2月5日,新年后决定开始充电提升自己,故作此记,以前没有使用过IDF开发ESP32因此新年学习一下ESP32。 ESPIDF开发环境配置网上已经有很多的资料了,我就不再赘述,我这里只是对我的学习经历的一些记录。 首先学习一个…

3-kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker,其中有一个broker会被选举为控制器(Kafka Controler),它负责管理整个集群中所有分区和副本的状态。…

物联网的三层架构:感知层、网络层与应用层

物联网(Internet of Things, IoT)作为现代科技的重要组成部分,正在深刻改变我们的生活和工作方式。它将物理世界与数字世界无缝连接,通过智能设备、传感器和网络技术,实现数据的采集、传输和应用。物联网的架构通常分为…

react的antd表单校验,禁止输入空格并触发校验提示

首先需要用到form组件&#xff0c;在form.item内添加rules属性&#xff0c;写正则表达式 <Form.Itemlabel"员工姓名"name"name"rules{[{ required: true, message: 员工姓名 },{ pattern: /^(?!\s*$).$/, message: 不能全是空格 },]}> <Input p…

JavaScript addEventListener事件列表

addEventListener 方法用于向指定元素添加事件监听器&#xff0c;当该对象触发指定的事件时&#xff0c;指定的回调函数就会被执行。以下是一些常见的事件类型 鼠标事件 click: 当用户点击某个对象时触发。 dblclick: 当用户双击某个对象时触发。 contextmenu&#xff1a;当…

IDEA 中集成 Maven,配置环境、创建以及导入项目

目录 在 IntelliJ IDEA 中集成 Maven 并配置环境 1. 打开 IDEA 设置 2. 定位 Maven 配置选项 3. 配置 Maven 路径 4. 应用配置 创建 Maven 项目 1. 新建项目 2. 选择项目类型 3. 配置项目信息 4. 确认 Maven 设置 5. 完成项目创建 导入 Maven 项目 1. 打开导入窗口…

神经网络常见激活函数 1-sigmoid函数

sigmoid 1 函数求导 sigmoid函数 σ ( x ) 1 1 e ( − x ) \sigma(x) \frac{1}{1e^{(-x)}} σ(x)1e(−x)1​ sigmoid函数求导 d d x σ ( x ) d d x ( 1 1 e − x ) e − x ( 1 e − x ) 2 ( 1 e − x ) − 1 ( 1 e − x ) 2 1 1 e − x − 1 ( 1 e − x ) 2 …

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工

目录 决策树&#xff1a;代码设计代码&#xff1a; 决策树&#xff1a; 代码设计 代码&#xff1a; class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…

rabbitMQ消息转换器

消息转换器 Spring的消息发送代码接收的消息体是一个Object&#xff1a; 而在数据传输时&#xff0c;它会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象。 只不过&#xff0c;默认情况下Spring采用的序列化方式是J…

Java 如何覆盖第三方 jar 包中的类

目录 一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理 背景&#xff1a; 在我们日常的开发中&#xff0c;经常需要使用第三方的 jar 包&#xff0c;有时候我们会发现第三方的 jar 包中的某一个类有问题&#xff0c;或者我们需要定制化修改其中的逻辑&#xff0c…

CS 与 BS 架构的差异

在数字化的今天&#xff0c;选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式&#xff0c;了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现&#xff0c;当时用户直接从主机获取数据。随着客户端和服务端…

HTML之table表格学习

HTML table使用 thead、tbody、tfoot均可省略&#xff1b; 浏览器解析的时候会自动套上tbody tr 行 td 列 th 标题列属性 colspan 列占用数 rowspan 行占用数 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…