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 | `==================================='