Limbic~Region has asked for the wisdom of the Perl Monks concerning the following question:
All,
In this node, I pointed out that it is often a waste to sort a list if you were after the top value and that a watermark algorithm should be used instead. I am not sure this rule of thumb holds true when N != 1. The size of list X and N seem to be contributing factors.
In this node, I pointed out that it is often a waste to sort a list if you were after the top value and that a watermark algorithm should be used instead. I am not sure this rule of thumb holds true when N != 1. The size of list X and N seem to be contributing factors.
Here is the code I used in that node:
After writing it, I wondered:sub top_x { my ($list, $x) = @_; $x--; my @top; $#top = $x; for my $item ( @$list ) { next if defined $top[ -1 ] && $item <= $top[ -1 ]; for my $id ( 0 .. $#top ) { $top[ $id ] = $item and last if ! defined $top[ $id ]; if ( $item > $top[ $id ] ) { @top[ $id .. $#top ] = ($item, @top[ $id .. $#top - 1] +); #splice(@top, $id, 0, $item), pop @top; last; } } } return @top; }
- At what value of N does one of the 2 methods (splice vs array slice) beat the other?
- Does the length of the list X and the value of N have to be considered together when deciding?
- Under what circumstances is sorting better than watermarks?
- Is there a better way to keep track of the watermarks other than the one I have shown?
- Is there a better method, other than sorting and watermarks, for determining the top N of a list?
Cheers - L~R
Back to
Seekers of Perl Wisdom