bnghtz

array_permutation_hun.pl

Apr 5th, 2014
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.22 KB | None | 0 0
  1. #! /usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. sub swap_arr($$$)
  6. {
  7.   my ($arr, $i, $k) = @_;
  8.   if ($i != $k)
  9.   {
  10.     my $temp = $arr->[$i];
  11.     $arr->[$i] = $arr->[$k];
  12.     $arr->[$k] = $temp;
  13.   }
  14. }
  15.  
  16. my $counter = 0;
  17. sub req_permut($$);
  18. sub req_permut($$)
  19. {
  20.   my ($arr, $i) = @_;
  21.   my $n = $#{$arr} + 1;
  22.   if ($i >= $n)
  23.   {
  24.     print '  ' . join(', ', @{$arr}) . "\n";
  25.     # print "  " . join('', @{$arr}) . "\n";
  26.     $counter ++;
  27.   }
  28.   else
  29.   {
  30.     for (my $k = $i; $k < $n; $k++)
  31.     {
  32.       swap_arr($arr, $i, $k);
  33.       req_permut($arr, $i + 1);
  34.       swap_arr($arr, $i, $k);
  35.     }
  36.   }
  37. }
  38.  
  39.  
  40. my @arr = qw( a b c d );
  41. req_permut(\@arr, 0);
  42. warn '' . ($#arr + 1) . "! = $counter\n";
  43.  
  44.  
  45.  
  46. =pod
  47.   PERMUTACIO
  48.  
  49. -----------
  50.   Rekurzív módszer (Robert Sedgewick)
  51.   Kiindulunk a 0, 1, 2, ..., N - 1 permutációból, és minden lehetséges elemet becserélünk az első helyre, majd a mögötte lévő szakaszt rekurzív "permutáljuk".
  52.  
  53.   A rekurzív eljárás egy i indexű elemtől kezdődően, a tömb végéig tartó szakaszt rendezgeti. Az elsö indexre kell elindítani az eljárást.
  54.  
  55.   RekurzívPermutáció(i)
  56.       Ha i nagyobb a maximális indexnél akkor az aktuális permutáció feldolgozása
  57.       különben
  58.           Ciklus k := i-től az utolsó indexig
  59.               swap_arr(i, k)
  60.               RekurzívPermutáció(i + 1)
  61.               swap_arr(i, k)
  62.           Ciklus vége
  63.   Eljárás vége
  64.  
  65. =cut
  66.  
  67. =pod
  68.   Iteratív módszer - lexikografikus sorrend (Donald Knuth)
  69.   - Elvégezzük teendőnket az aktuális permutációval. (Például kiírjuk.)
  70.   - Ha a sorozat csökkenően rendezett, akkor vége a permutációk felsorolásának.
  71.   - Különben
  72.       * Jobbról megkeressük az első elemet, ami kisebb a nála jobbra állónál. (Ezen a pozíción fogunk növelni.)
  73.         Indexe: j
  74.       * Jobbról megkeressük az első elemet, ami nagyobb, mint az előbb kiválasztott a[ j ] elem
  75.         Indexe: m
  76.       * Felcseréljük az a[ j ] és a[ m ] elemeket.
  77.         Most a (j+1)-től a sorozat végéig tartó szakasz fordítottan rendezett
  78.       * Megfordítjuk a (j+1)-től a sorozat végéig tartó szakaszt.
  79.   - Ezután az első ponttól folytatódik az eljárás
  80.  
  81. =cut
Advertisement
Add Comment
Please, Sign In to add comment