哈希子图的高效算法?

时间:2013-10-21 20:26:46

标签: algorithm hash graph-algorithm

是否存在给定图的散列子图(由节点和边组成)的算法?类似地,我所讨论的特定图是分子网络,并且散列网络子图的意图是看是否给定不同的网络,有一个特定的子图与先前的散列子图匹配。

我不关心自己查找所有子图的运行时间。我关注的是给定一个特定的哈希子图和另一个子图,我是否可以发现子图是否是我在O(1)时间之前看到的那个。

3 个答案:

答案 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)

对于散列子图没有有效的算法,否则将知道图匹配是多项式的。

由于分子图具有有界连接性,因此存在一些特定算法。

谷歌搜索'规范分子签名'我在网上发现了这个tool