【发布时间】:2014-12-04 23:31:53
【问题描述】:
我目前正在编写一个处理图形操作的程序。为简单起见,每个顶点的标签都是一个正整数(即 1、2、...)。对于我尝试实现的算法之一,我需要编写一个函数edgeId(u, v),它接受两个顶点数u 和v,并将边(u, v) 映射到一个unique em> 正整数。
由于我的算法必须处理有向图和无向图,我有以下规定。对于有向图,edgeId(u, v) 必须是单射的(即edgeId(a, b) = edgeId(c, d) 当且仅当a = c 和b = d)。对于无向图,它必须是对称的(即edgeId(u, v) = edgeId(v, u),但只有这两个可以映射到那个正整数)。
有人知道如何实现这样的功能吗?到目前为止,我的每一个想法都失败了,因为我不知道图中的顶点数量。
任何帮助将不胜感激!
【问题讨论】:
-
保留一个节点字典和你分配给它们之间的边的数字?
-
对于大量的顶点,这不是效率低下吗?
-
节点数是固定的吗?或者它是一个不断发展的图表?
-
如果你能“知道”节点/边的数量永远不会超过N,你可以使用
a*N + b计算一个唯一的整数,其中a和b这里是一个唯一的数字你从节点本身获得。 -
Cantors 的老把戏
((x + y)*(x + y + 1)/2) + y但有严重的缺点