Pablo Zea Aranibar wrote:
>
> Hi, realy i need your help with this algorithm.
> what I need is another algorithm in order to improve my own.
> 
> example:
> 
> my $firsSet = [ 'a', 'b', 'c', 'd', 'e' ];
> my $secondSet = [ 'x', 'y', 'z' ];
> my $thirdSet = [ 'a', 'x', 'b', 'y' ];
> my $fourthSet = [ 'b', 'd', 'z' ];
> my $counter = 0;
> 
> foreach my $elm1 (@{$firstSet})
> {
>   foreach my $elm2 (@{$secondSet})
>   {
>     foreach my $elm3 (@{$thirdSet})
>     {
>       foreach my $elm4 (@{$fourthSet})
>       {
>         print "$counter : $elm1, elm2 , elm3 , elm4\n";
>         $counter ++;
>       }
>     }
>   }
> }
> # It prints each possible combination taken one element for each set.
> 
> 
> another (better way):
> 
> my @Set = ();
> my $elements = {a=>1, b=>1, c=>1, d=>1, e=>1, x=>1, y=>1, z=>1};
> $Set[0] = [ 'a', 'b', 'c', 'd', 'e' ];
> $Set[1] = [ 'x', 'y', 'z' ];
> $Set[2] = [ 'a', 'x', 'b', 'y' ];
> $Set[3] = [ 'b', 'd', 'z' ];
> my $counter = 0;
> 
> @result = @{$Set[0]};
> for (1 .. (scalar @Set) - 1) {
>   my $temp = [];
>   foreach my $result (@result) {
>     foreach my $elm (@{$Set[$_]}) {
>       if ($elements=>{$elm}) { #if I dont want repetitions
>         push @{$temp}, $result.', '.$elm;
>         $elements=>{$elm}=0;
>         $counter++;
>       };
>     };
>   };
>   @result = @{$temp};
> };
> print "@result\n";
> 
> 
> But, both are still too slow.
> So, can you give me an idea to improve it?.
> someone tell me about mask, and bit operations. but i really dont know how
> to do it. so.. any suggestion?.
> there was a thread in a forum
> (here<http://forums.devshed.com/software-design-43/algorithm-design-536480.html>),
> but the solution was for python (recursive using "yield").

Looking at your second example (which doesn't compile, so it's not surprising
it's too slow!) I think you want all combinations of the sets that don't have
repeating letters. The program below will do that, and if you want all
combinations regardless of repeated characters simply remove the line

    s/$c//g foreach @sets;

Finally, if you prefer a comma-separated form of output, just change the print
line to read

    print join(', ', split ''), "\n" foreach @results;

I hope this helps. I had fun writing it!

Rob


use strict;
use warnings;

my @sets = qw(
  abcde
  xyz
  axby
  bdz
);

my @results = combine(@sets);
print "$_\n" foreach @results;

sub combine {

  return () if grep length == 0, @_;

  my @initials = split '', shift;
  return @initials unless @_;

  my @return;
  foreach my $c (@initials) {
    my @sets = @_;
    s/$c//g foreach @sets;
    push @return, map "$c$_", combine(@sets);
  }

  @return;
}



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to