in reply to Re^2: Tree depth
in thread Tree depth

If you have one graph per line, you should empty %graph before reading a line, or even better, declare it on the inside of the while-loop to limit its scope, and pass it on to the depth subroutine.

By the way, my code isn't optimized for large trees (because your example wasn't very large), it might make sense to cache depths if a graph is much larger.

Replies are listed 'Best First'.
Re^4: Tree depth
by katarinahm (Initiate) on Mar 13, 2012 at 14:57 UTC

    Sorry to bother you again, but your recent advice doesn't seem to help me. I've changed the code into this:

    while (<>) { chomp; (@row) = split(/ /,$_); foreach $item (@row) { ($node,$value) = split(/->/,$item,2); $graph{$node} = $value; } sub depth { return max map { $_ and 1 + depth($graph{$_}) } @_; shift @_ } print depth(keys %graph); print "\n"; @row = (); $graph = "" }

    , but I still get the values wrong, even if I just try it on a few lines of my infile. Here is an example of my infile (9 lines), picked at random but in a sequence: ------------------------------------

    1->14 2->3 3->1 4->5 5->3 6->3 7->9 8->9 9->10 10->6 11->10 12->10 13- +>10 14->0 15->14 16->15 17->18 18->15 19->18 20->19 21->14 1->2 2->0 3->5 4->5 5->6 6->2 7->2 8->7 9->2 1->2 2->0 3->4 4->2 5->7 6->7 7->4 8->7 9->8 10->2 1->2 2->0 3->2 4->3 5->7 6->5 7->11 8->7 9->7 10->9 11->4 12->11 13->1 +2 14->15 15->11 16->2 1->2 2->0 3->2 1->2 2->0 3->2 4->5 5->3 6->5 7->6 8->6 9->8 10->9 11->12 12->10 13->2 1->2 2->0 3->5 4->5 5->2 6->2 7->6 8->2 1->3 2->3 3->4 4->0 5->4 6->5 7->6 8->6 9->8 10->11 11->8 12->11 13->1 +2 14->4 1->2 2->8 3->2 4->2 5->6 6->4 7->6 8->0 9->8 10->8
    --------------------------------------

    Here is the output that I get:

    --------------------------------------
    9 7 6 9 9 13 10 10 7
    --------------------------------------

    Then, if I try the script on a separate input file, containing just those 9 lines, I get the following output:

    --------------------------------------
    7 5 5 8 8 13 10 9 6
    --------------------------------------

    It's confusing... Do you have any ideas?

      It's confusing... Do you have any ideas?

      Yes. Don't remove the use strict; use warnings; from the start of the script. It's there for a reason: it tells you what you are doing wrong. (Namely you're not clearing %graph, but rather $graph, which is a totally different variable, which you've never declared. use strict; catches that errors).

        This is how my code looks like when I'm using strict and warnings:
        #!/bin/perl; use strict; use warnings; use List::Util qw/max/; my %graph; while (<>) { chomp; (@row) = split(/ /,$_); foreach $item (@row) { ($node,$value) = split(/->/,$item,2); $graph{$node} = $value; } sub depth { return max map { $_ and 1 + depth($graph{$_}) } @_; shift @_ } print depth(keys %graph); print "\n"; @row = (); %graph = "" }

        Here are the error messages that I get:

        Global symbol "@row" requires explicit package name at count_PT.prl li +ne 11. Global symbol "$item" requires explicit package name at count_PT.prl l +ine 12.

        still confusing...