On Wednesday 15 June 2005 03:03 pm, Sasha Pachev wrote:
> As was already noted, a recursive solution is perhaps the easiest way to
> solve the problem. It would take me about 30 minutes I do not have today to
> code/debug one, so I'll just give you a general idea - make a function that
> can give you all permitations but accepts a "pinned" mask - an array of
> flags indicating which elements are not to be permuted. The function pins
> each unpinned element, calls itself once with the new pinned mask for each
> possible value of that element (out of the unpinned set), then unpins it
> and goes to the next one.

A half hour?  Sasha, you're loosing your touch! ;)
Your suggested 'pinning' solution seems more complicated than necessary.

>
> I do really hope, though that you can avoid doing O(N!) algorithm. Post the
> original problem that created the need for the permutations - maybe
> somebody can think of something better.

As others mentioned, the size of the solution is O(N!), thus the algorithm can 
be no better.

Here's a quicky PHP version:
(note: it does no input validation--non or empty array will probably break it)

function &combinations($items) {
        if (count($items) == 1) {
                return $items;
        }
        $ret = array();
        $items_as_keys = array_flip($items);
        foreach ($items as $i) {
                $tmp = $items_as_keys;
                unset($tmp[$i]);
                $subs =& combinations(array_keys($tmp));
                foreach ($subs as $s) {
                        $ret[] = $i . ' ' . $s;
                }
        }
        return $ret;
}

print_r(combinations(array('a', 'b', 'c')));


-- 
Respectfully,

Nicholas Leippe
Sales Team Automation, LLC
1335 West 1650 North, Suite C
Springville, UT  84663 +1 801.853.4090
http://www.salesteamautomation.com
.===================================.
| This has been a P.L.U.G. mailing. |
|      Don't Fear the Penguin.      |
|  IRC: #utah at irc.freenode.net   |
`==================================='

Reply via email to