如何为仅依赖于树结构的树结构定义哈希函数,并且与节点标签无关?
例如,2--1--3--4应具有与1--4--2--3或4--1--3-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
为INITH
,MOD
和PR
选择一些合适的值。
两个同构树将具有相同的哈希值。
答案 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