En supposant que vous avez un graphe connexe (sinon la distance maximale est infinie) et tous vos points de noeud sont des nombres ....
Seed une table (à partir, à, distance) avec (From_Node, to_node, 1).Pour chaque tuple, vous devez vous assurer que la valeur de From_Node est toujours inférieure à la valeur de 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
Exécuter l'insert de façon répétée jusqu'à ce qu'aucune lignes sont insérées. Ensuite, sélectionnez la distance maximale pour obtenir votre diamètre.
EDIT: Pour un graphique dont les sommets sont pondérés, vous juste ensemencer le champ de distance avec les poids plutôt que d'utiliser 1.
voulez-vous dire circonférence? Depuis quand un réseau a-t-il une forme? –
qu'est-ce que vous entendez par "diamètre" – DShook
Il s'agit d'un problème lié à l'analyse de réseau/théorie des graphes. Il veut dire http://en.wikipedia.org/wiki/Graph_diameter – Noldorin