是否存在给定图的散列子图(由节点和边组成)的算法?类似地,我所讨论的特定图是分子网络,并且散列网络子图的意图是看是否给定不同的网络,有一个特定的子图与先前的散列子图匹配。
我不关心自己查找所有子图的运行时间。我关注的是给定一个特定的哈希子图和另一个子图,我是否可以发现子图是否是我在O(1)时间之前看到的那个。
答案 0 :(得分:1)
如果你的图是非循环的(具有可变分裂级别的树), 你可以在图形的每个顶点(节点)保留一些值, 这是“这个子树的哈希”。
子树的计算哈希是简单的bt递归算法,如:
// Initial value ~0 meaning "need to compute"
uint32_t subtree_hash(node *p) {
for(int attempts = 0; p->hash == ~0; attempts++) {
p->hash = compute_hash(p->value) + attempts;
foreach node *child in (p->children) {
p->hash = ((p->hash >> 7) | (p->hash << (32 - 7))) + subtree_hash(child);
}
return p->hash; // never ~0
}
答案 1 :(得分:0)
假设顶点具有整数ID,我将使用您通常用于散列整数对数组的任何散列算法,以某种定义的顺序(例如字典)散列子图中的边缘列表。此列表中的边将表示为具有固有顺序的顶点对,因此,如果要表示的图实际上具有无向边,则还需要按某种顺序(即从最小到最大)对每个边内的顶点对进行排序)。
答案 2 :(得分:0)