我将数据存储在关系数据库mysql和PHP中。 我有一个名为“rel”的表,它有两个字段:
from_node | to_node
=====================
1 2
1 3
2 3
依旧......
如何计算网络的网络直径。我知道它是任何两对之间最长或最短的路径,但我该如何计算呢? 是否有任何PHP脚本或函数可以帮助我做到这一点?
答案 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?你会得到你正在寻找的。 p>
答案 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
这次最大距离是图表/网络的直径。