树结构的散列

时间:2017-06-14 08:58:50

标签: algorithm hash

如何为仅依赖于树结构的树结构定义哈希函数,并且与节点标签无关?

例如,2--1--3--4应具有与1--4--2--3或4--1--3-2相同的散列函数。

2 个答案:

答案 0 :(得分:2)

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

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选择一些合适的值。

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

答案 1 :(得分: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