MathGroup Archive 2003

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: generate random permutation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg40355] Re: generate random permutation
  • From: "AngleWyrm" <no_spam_anglewyrm at hotmail.com>
  • Date: Wed, 2 Apr 2003 04:37:58 -0500 (EST)
  • References: <b66c98$fqs$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

The number of possible permutations to a set of number S = { a1, a2, ...
an } is n!, which is ( 1 x 2 x ... x n ). This multiplication is O(n) in
terms of performance, because the function must perform an extra multiply
for every increase in the size of the set. One could express it in C++ like
so:

#include <cstdlib>
#include <iostream>
#include <set>

int main (void)
{
    // A set of four integers
    set<int> myNums;
    myNums.insert(42);
    myNums.insert(69);
    myNums.insert(1);
    myNums.insert(100);
    cout << "\nSize: " << myNums.size() << endl;

    /***** My Generic Permutation Algorithm ***/
    long numPermutations = myNums.size();

    int counter = myNums.size();
    while( --counter ) {
        numPermutations *= counter;
    }
    /************************************/

    cout << "\nTotal number of permutations is: " << numPermutations <<
endl;
    system("Pause");
    return 0;
}

But you could do better, if you know in advance a ceiling on the size of the
set! Consider this: The number of permutations for ALL sizes of sets is a
series of numbers, which could simply be hard-coded into an array of the
appropriate size. If you know that the maximum size of your set is, say
1000, then pregenerate the first thousand permutations and hard-code them in
an array. Then at run time, all you would have to do is:

numPermutations = permutationLookupTable[ myNums.size() ];

An O(1) operation!



  • Prev by Date: Re: more with lists
  • Next by Date: RE: more with lists
  • Previous by thread: RE: generate random permutation
  • Next by thread: working with raw images