On Aug 22, 2014, at 1:17 PM, Beat Cornaz <b.cor...@gmx.net> wrote:

> So a good example would be how to make all possible  permutations of say 10 
> different elements (0-9). This gives 3628800 different permutations.
> The resulting permutations will be in lines I guess, but what would be the 
> best way to do this. Using lines, items, chars or any other way as Input?
> 
> So the start would be f.i. a list with 10 lines with the ten elements, one in 
> each line - That is what I am using now. 
> OR items "0,1,2,3,4,5,6,7,8,9" or chars "0123456789"  or another way to 
> represent 10 elements to make it possible to run the script in minutes, not 
> hours.

Hi, Beat.

The Wikipedia entry for "permutation" says the fastest algorithm for generating 
permutations is Heap's algorithm.
The entry for "Heap's algorithm" says the following is its pseudocode:

<pseudocode>
procedure generate(N : integer, data : array of any):
if N = 1 then
  output(data)
else
  for c := 1; c <= N; c += 1 do
  generate(N - 1, data)
  swap(data[if N is odd then 1 else c], data[N])        
</pseudocode>

So, here's a way in LiveCode to derive the 3,628,800 permutations of 10 things 
taken 10 at a time. On my 2012 iMac, it takes under two minutes.  How's that, 
Beat?

-- Dick

<livecode>
on mouseUp
  test
end mouseUp

command test
  local tArray, tMilliseconds, tCountForPermutation
  put 1 into tArray[ 1 ]
  put 2 into tArray[ 2 ]
  repeat with n = 3 to 10
      put n into tArray[ n ]
      put empty into tCountForPermutation
      put the milliseconds into tMilliseconds
      permute n, tArray, tCountForPermutation
      putLine n & " things produce " & ( number of elements in 
tCountForPermutation ) & " of " \
            & factorial( n ) & " permutations in " & ( the milliseconds - 
tMilliseconds ) & " milliseconds"
  end repeat
end test

command permute n, @rArray, @rCountForPermutation
  if n > 1 then
      repeat with c = 1 to n
          permute n-1, rArray, rCountForPermutation
          if n mod 2 is 1 then
              swap rArray, 1, n
          else
              swap rArray, c, n
          end if
          insertPermutation rArray, rCountForPermutation
      end repeat
  end if
end permute

command swap @rArray, pKey1, pKey2
  local t
  put rArray[ pKey1 ] into t
  put rArray[ pKey2 ] into rArray[ pKey1 ]
  put t into rArray[ pKey2 ]
end swap

command insertPermutation @pArray, @rCountForPermutation
  local tPermutation
  repeat with i = 1 to the number of elements in pArray
      put pArray[ i ] & space after tPermutation
  end repeat
  add 1 to rCountForPermutation[ char 1 to -2 of tPermutation ]
end insertPermutation

function factorial n
  if n = 1 then
      return 1
  else
      return n * factorial( n-1 )
  end if
end factorial
</livecode>
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to