http://qs321.pair.com?node_id=320105


in reply to Re: Depth First Search through Digraph Results in Memory Leak
in thread Depth First Search through Digraph Results in Memory Leak

I think that's okay. I'm using the algorithm from Goodrich & Tamassia's Data Structures and Algorithms in Java pg. 377. In pseudocode:

DirectedDFS(v):
Mark vertex v as marked.
for each outgoing edge (v, w) of v do
if vertex w has not been visited
then recursively call DFS(w).

Which makes sense to me since the objective is to locate all reachable vertices. Imagine the case where you had more than one edge connecting two vertices. You'd end up counting all the paths to a node but that isn't the goal, well at least not a transitive closure anyway.


"The dead do not recognize context" -- Kai, Lexx
  • Comment on Re: Re: Depth First Search through Digraph Results in Memory Leak

Replies are listed 'Best First'.
Re3: Depth First Search through Digraph Results in Memory Leak
by Hofmator (Curate) on Jan 09, 2004 at 13:44 UTC

    Ok, first to get the terminology straight, 'node' eq 'vertex' and 'edge' eq 'link'.

    In your code both nodes and links have an id. Let's look at your original code:

    # this marks the current vertex $explored->{$node->{_id}}++; foreach my $link (@{$node->{_outlinks}}) { # $link isa Link, so $link->{_id} is the id of the link, # not of the vertex!! $do_search->($link->{_to}) unless ($explored->{$link->{_id}}); }
    Yes, your algorithm is fine, it's just the implementation that has a little bug in it. Here's my (correct) code again, this time written explicitly:
    $explored->{$node->{_id}}++; foreach my $link (@{$node->{_outlinks}}) { my $new_node = $link->{_to}; $do_search->($new_node) unless ($explored->{$new_node->{_id}}); }

    -- Hofmator

      Whoops, my mistake. The example was simple enough not to affect the outcome but you're quite right. Fortunately my real code doesn't contain that error.


      "The dead do not recognize context" -- Kai, Lexx