Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Re: Re: Re: Re: amount permutations

by Limbic~Region (Chancellor)
on Mar 05, 2004 at 15:54 UTC ( [id://334257]=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Re: Re: amount permutations
in thread amount permutations

gr0k,
If you have a requirement to allow duplicates in the combination but no more than is present in the original list then the code is easy enough to change.
@_ == keys %{@_,reverse @_);
That is misleading because it also removes duplicates. The difference is you are using letters instead of numbers so there should never be any duplicate. The change you have made to dereference slows the code back down again.

Again, this is a terrible approach since you are spinning cycles needlessly. If you don't believe me:

Formula for determining number of unique combinations of k values in a set of n letters is n!/k!(n-k)!

  • 1 = 6
  • 2 = 15
  • 3 = 20
  • 4 = 15
  • 5 = 6
  • 6 = 1

That is a total of 63 possible combinations you should be testing, but your misuse of Algorithm::Loops has lead to testing 55,986. Unique combination certainly are not permutations.

L~R

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Re: amount permutations
by the_0ne (Pilgrim) on Mar 05, 2004 at 16:36 UTC
    Limbic~Region, I work with gr0k and he has to leave for the day, so I'll reply back. I think our example of what we want was fine, but maybe our code confused some people (as you state in your replies). What we are trying to get it is basicly this...

    We have...

    A=10
    B=1
    C=6

    to be checked. We want to only add up the combinations that are unique. So, what we were ultimately trying to do was generate a list that would give us a way to calculate the unique combinations. Something like this...

    A
    A B
    A B C
    A C
    B
    B C
    C

    So we'd then run through that list applying our values...

    A - 10
    A+B - 11
    A+B+C - 17
    A + C - 16 * matches 16 no need to check C+A, etc..
    B - 1
    B+C - 7
    C - 6

    So A+C matches what we want. No need to check C+A. Same with if A+B+C matched what we want. No need to check A+C+B, B+C+A, etc... That was our ultimate goal. Of course A B C could easily be 100 long or even more, but left it small for this post. Hopefully that'll clear some things up. Thanks for all help.
      the_0ne,
      I understand that, which is why I said modifying the code would not be difficult to do that. The problem is you seem to want to proceed with using a technique that is producing far more candidates than is necessary. Making a terrible approach more efficient isn't going to make it work.

      Cheers - L~R

      Update: Even with only pulling unique combinations, it does not take long to get to astronimical numbers as pointed out by kvale earlier. Try out the following code.
      #!/usr/bin/perl use strict; use warnings; my $k = $ARGV[0] || 50; my $total = 1; for my $n ( 1 .. $k - 1 ) { if ( $n > $k - $n ) { $total += factorial($k, $n + 1) / factorial( $k - $n ); } else { $total += factorial($k, $k - $n + 1) / factorial( $n ); } } print "Total unique combinations for $k is $total\n"; sub factorial { my ($n, $max, $total) = @_; $total ||= 1; $max ||= 0; return $total if ! $n || $n == $max - 1; @_ = ($n - 1, $max, $total * $n); goto &factorial; }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://334257]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (1)
As of 2024-04-24 16:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found