目录
- 一、树的同构
- 1. 定义
- 2. 具体理解
- (1) 结点对应
- (2) 孩子相同
- (3) 递归性质
- 3. 示例
- 二、树哈希
- 1.定义
- 2.哈希过程
- (1)叶节点哈希
- (2)非叶节点哈希
- (3)组合哈希值
- 3.性质
- (1) 唯一性 \red{\texttt{唯一性}} 唯一性
- (2)快速比较
- (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)。
综上所述,树哈希是一种强大的工具,可以用于快速比较和检测树形数据结构的完整性和一致性。