如何计算网络直径

时间:2009-05-10 01:40:56

标签: php mysql algorithm networking

我将数据存储在关系数据库mysql和PHP中。 我有一个名为“rel”的表,它有两个字段:

from_node  |  to_node
=====================
1               2
1               3
2               3

依旧......

如何计算网络的网络直径。我知道它是任何两对之间最长或最短的路径,但我该如何计算呢? 是否有任何PHP脚本或函数可以帮助我做到这一点?

6 个答案:

答案 0 :(得分:1)

假设你有一个连通图(否则最大距离是无限的),所有节点都是数字......

使用(from_node,to_node,1)对表格(from,to,distance)进行种子设定。对于每个元组,必须确保from_node的值始终小于to_node的值

CREATE TABLE hops (
    from_node int not null,
    to_node int not null,
    distance int not null default 0,
    primary key (from_node, to_node, distance)
)

-- first load:
INSERT INTO hops (from_node, to_node)
SELECT from_node, to_node FROM rel;

-- iterative step
INSERT INTO hops (from_node, to_node, distance)
SELECT a.from_node, b.to_node, min(a.distance+b.distance)
FROM hops a, hops b
WHERE a.to_node = b.from_node
  AND a.from_node <> b.from_node  -- not self
  AND a.to_node <> b.to_node      -- still not self
  AND a.from_node <> b.from_node  -- no loops
  AND NOT EXISTS (                -- avoid duplicates
          SELECT * FROM hops c
          WHERE c.from_node = a.from_node
            AND c.to_node = b.to_node
            AND c.distance = a.distance+b.distance)
GROUP BY a.from_node, b.to_node

重复执行插入,直到没有插入行。然后选择最大距离以获得直径。

编辑:对于带有加权顶点的图形,您只需使用权重而不是使用1来播种距离字段。

答案 1 :(得分:0)

在您的示例中,您显示每个节点都链接到每个其他节点。如果在整个设置过程中出现这种情况,则直径为1。

如果您的设置是线性形式的这样一行:

n=1, n = 2, n = 3, ... n

然后你的直径是(n + 1)/ 3。

如果你的设置更不规则,有一系列N个数字节点和K个链接,那么你的直径至少 logN/LogK

编辑:为了澄清,我正在计算节点对之间的平均最短距离。

n1 - n2 - n3
(n+1)/3 = 4/3

n1-n2 = 1 hop
n2 - n3 = 1 hop
n1- n2 - n3 = 2 hops
(1+1+2)/3 = 4/3

答案 2 :(得分:0)

请参阅与距离和直径相关的图表(网络)术语Wikipedia article。它提到了一些关于如何找到直径的注释。关于图的连通分量的文章This section也提出了一种发现这些连通分量的算法,可以很容易地调整这些分量以告诉你图的直径。 (如果有多个组件,那么直径是无限的我相信。)算法是基于面包/深度优先搜索的简单算法,因此实现起来不应该太麻烦,效率不应该是一个很大的问题。

如果你不能写这篇文章(虽然我认为不会花费太多精力),我建议你寻找一个好的网络/图形分析库。有几个,但我不确定你想用PHP看哪些。 (你可能不得不使用某种互操作。)

无论如何,希望有所帮助。

答案 3 :(得分:0)

我真的认为你的意思是想要找到网络的cluster coefficient。此外,你想用PHP做。我不知道有多少好的网络分析库被移植到PHP扩展。

但是,如果你遵循这篇文章,那么你自己也不应该(太)难以想象。您不需要生成漂亮的图表,只需要找到系数。

如果那不是您的意思,请更新/澄清您的问题。

答案 4 :(得分:0)

网络是连接图。那么为什么不尝试从数据中构建一些图形表示并对此执行BFS或DFS?你会得到你正在寻找的。

答案 5 :(得分:0)

这很简单:

  • <强>准备
    • 添加名为distance
    • 的列
    • 为所有节点提供-1
    • 的距离
  • 首次迭代
    • 选择任何节点(例如第一个)
    • 给它距离1
    • 现在迭代,直到有距离为-1的节点
      • UPDATE table SET distance=:i+1 WHERE from_node IN (SELECT to_node FROM table WHERE distance=:i)
  • 第二次迭代
    • 选择一个具有最大距离(任何)的节点 - 记住它
    • 将所有距离设置回-1
    • 将已重新编号的节点设置为1
    • 第二次调用迭代

这次最大距离是图表/网络的直径。