【问题标题】:Hash for tree structure树结构的哈希
【发布时间】:2017-06-14 08:58:49
【问题描述】:

如何定义一个只依赖于树的结构且与节点标签无关的树结构的哈希函数?

例如,2--1--3--4 应该与 1--4--2--3 或 4--1--3--2 具有相同的哈希函数。

【问题讨论】:

  • 我在这里看不到任何树木。您是在谈论二叉树还是每个节点具有任意多个子节点的树?
  • 定义一个“规范化”函数,将结构相似的所有树都归为一个表示。然后你可以散列这个表示。
  • Henry:我的意思是任意树。很抱歉以二叉树为例。 @Lyth:你能举一个这样的归一化函数的例子吗?

标签: algorithm hash


【解决方案1】:

找到树的中心。然后从中心运行递归算法:

recurse(u, p):

    hash = INITH
    vector childrenhash = {}

    for each (u,v) in G:
        if v!=p:
            childrenhash.insert(recurse(v,u))

    childrenhash.sort()

    for elem in childrenhash:
        hash = (hash * (elem xor PR)) % MOD

    return hash

INITHMODPR 选择一些合适的值。

两个同构树将具有相同的哈希值。

【讨论】:

  • 中心的定义是什么?
  • @PetarPetrovic 哦,抱歉,中心是树最长路径(直径)中间的点(可能是两个)。
  • @four_lines 哈希不取决于选择的中心(如果有两个中心)?
  • @PranjalJain 只需保持计算的一致性,即,如果您正在计算各种树的哈希值,如果树有两个中心,请从两个中心开始计算哈希值并选择所有的最小值时间(或最大值,由您决定)。
【解决方案2】:

如果你扔掉节点标签,剩下的就是每个节点的子节点数。因此,您可以只计算每个节点的子节点数并将它们全部写入一个字符串(数组,向量,...)。

例子:

   a             2       
  / \           / \      
 b   c    =>   0   2     =>  2,0,2,0,0
    / \           / \
   d   e         0   0

现在,假设你说,以下树应该被认为是相等的:

   a              a      
 / | \          / | \    
b  c  d        b  c  d   
  / \  \      / \    |   
 d   e  f    d   e   f  

您可以在同一想法中添加更多转换步骤:对子项进行排序:

    a                 3                   3       
  / | \             / | \               / | \     
 b  c  d     =>    0  2  1      =>     0  1   2     =>  3,0,1,2,0,0,0
   / \  \            / \  \               |  / \   
  d   e  f          0   0  0              0 0   0 


      a                 3                 3        
    / | \             / | \             / | \      
   b  c  d   =>      2  0  1    =>     0  1   2     =>  3,0,1,2,0,0,0
  / \    |          / \    |              |  / \   
 d   e   f         0   0   0              0 0   0  

我可能正在关注@gilleain 链接中的想法:https://math.stackexchange.com/questions/1604260/algorithm-for-equality-of-trees-of-restricted-depth

【讨论】:

  • 按子节点数量排序是一个不错的计划,但您需要一个决胜局(基于 childrem 的子节点)-> 递归
  • 这适用于有根树。您将如何检查以下树是否相同?请参阅 thisthis。这些分别给出 [2,0,0] 和 [1,1,0]。但它们在结构上是相同的。
  • @PranjalJain 你在谈论树同构 - stackoverflow.com/a/742698/949044 吗?好像我错过了这一点。
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 2015-10-06
  • 2015-07-08
  • 2023-03-31
  • 2023-03-28
  • 2016-10-03
  • 2017-08-27
  • 2019-10-03
相关资源
最近更新 更多