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

gr0k,
You will have to explain what you mean or else explain what you think the following is doing:
@_ == keys %{@_,reverse @_}
Besides - this is a terribly inefficient way to go about what you are trying to do as explained by everyone. I was just showing ways to improve the efficiency of what you already had.

L~R

Replies are listed 'Best First'.
Re^4: amount permutations (unique)
by tye (Sage) on Mar 05, 2004 at 03:37 UTC
      tye,
      Thanks, but I knew what it was. It is gr0k that I didn't think understood it. He indicated I had a bug where I removed duplicates:

      your code has a bug where it would eliminate two checks with the same amount

      I was only asking that he explain how my code (which was a bit more efficient) was different than that snippet.

      Cheers - L~R

Re: Re: Re: Re: amount permutations
by gr0k (Novice) on Mar 05, 2004 at 15:26 UTC

    Ah, what I meant was, with your code, if there were two checks with the same amount. ie. A = 10 and G = 10, it wouldn't match a search for amount 20 since your array would look like this: my $RS = [10, 5, 13, 3, 15, 1, 4, 10]; And your line here return 0 if $uniq{$val} > 1; would ignore it thinking it was a duplicate in the sequence.

    It was a very slight change to pass the array of unique checks instead of the array of amounts and then:

    $sum += $rs_ref->{$check}->{'amount'};

      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
        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.