【问题标题】:Writing a function to map edges to positive integers编写一个将边映射到正整数的函数
【发布时间】:2014-12-04 23:31:53
【问题描述】:

我目前正在编写一个处理图形操作的程序。为简单起见,每个顶点的标签都是一个正整数(即 1、2、...)。对于我尝试实现的算法之一,我需要编写一个函数edgeId(u, v),它接受两个顶点数uv,并将边(u, v) 映射到一个unique em> 正整数。

由于我的算法必须处理有向图和无向图,我有以下规定。对于有向图,edgeId(u, v) 必须是单射的(即edgeId(a, b) = edgeId(c, d) 当且仅当a = cb = d)。对于无向图,它必须是对称的(即edgeId(u, v) = edgeId(v, u),但只有这两个可以映射到那个正整数)。

有人知道如何实现这样的功能吗?到目前为止,我的每一个想法都失败了,因为我不知道图中的顶点数量。

任何帮助将不胜感激!

【问题讨论】:

  • 保留一个节点字典和你分配给它们之间的边的数字?
  • 对于大量的顶点,这不是效率低下吗?
  • 节点数是固定的吗?或者它是一个不断发展的图表?
  • 如果你能“知道”节点/边的数量永远不会超过N,你可以使用a*N + b计算一个唯一的整数,其中ab这里是一个唯一的数字你从节点本身获得。
  • Cantors 的老把戏((x + y)*(x + y + 1)/2) + y 但有严重的缺点

标签: algorithm function


【解决方案1】:
def undirectedEdgeId(u, v):
    M = max(u, v)
    m = min(u, v)
    return M * (M - 1) / 2 + m

def directedEdgeId(u, v):
    d = undirectedEdgeId(u, v)
    if u < v:
        return 2 * d
    else:
        return 2 * d - 1

undirectedEdgeId 所做的事情可以用表格来可视化:

3 | 4  5  6
2 | 2  3  5
1 | 1  2  4
u  -- -- --
  v 1  2  3 

或者就mM而言

3 |       6
2 |    3  5
1 | 1  2  4
m  -- -- --
  M 1  2  3 

这些函数的好处是两者都可以很容易地反转。

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多