| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> comp.databases.theory -> Floyd's algorithm in SQL
I am re-doing the graphs section for the third edition of SQL FOR
SMARTIES and would like some feedback and help.
Here is a version of Floyd's algorithm to find the transitive closure of a graph. You can also look up Warshall's algorithm, which is an earlier and more specialized version of Floyd's algorithm. Given a directed graph G represented by an adjacency matrix A[i, j], WHERE A[i, j] = 1 if the edge (i, j) is in the graph, compute the matrix P of paths with their lengths. Now put it into SQL:
CREATE TABLE Paths
(source CHAR(1)NOT NULL,
destination CHAR(1) NOT NULL,
lgth INTEGER DEFAULT 0 NOT NULL);
CREATE TABLE Edges
(source CHAR(1)NOT NULL,
destination CHAR(1)NOT NULL,
PRIMARY KEY (source, destination),
lgth INTEGER DEFAULT 1 NOT NULL);
INSERT INTO Edges (source, destination) VALUES ('a', 'b');
INSERT INTO Edges (source, destination) VALUES ('b', 'c');
INSERT INTO Edges (source, destination) VALUES ('c', 'd');
INSERT INTO Edges (source, destination) VALUES ('d', 'a');
INSERT INTO Edges (source, destination) VALUES ('a', 'e');
The algorithm extends each known path by one edge at a time. Since no path can be longer than the number of nodes in the graph, we have an upper bound on iterations. But we can also stop when the INSERT statement adds no new paths.
CREATE PROCEDURE Floyd()
LANGUAGE SQL
DETERMINISTIC
BEGIN
DECLARE old_path_tally INTEGER;
SET old_path_tally = 0;
DELETE FROM Paths; -- clean out working table
INSERT INTO Paths SELECT * FROM Edges; -- load the edges
SELECT * FROM Paths;
source destination lgth
What I'd like to know is:
There is fame, glory and virtual beer in this puzzle. Received on Wed Dec 01 2004 - 18:10:20 CST
![]() |
![]() |