Einzelnen Beitrag anzeigen

Dax
(Gast)

n/a Beiträge
 
#2

Re: besondere Permutation, keine Anagramme!

  Alt 11. Nov 2007, 15:23
Solange dein Array weniger als 65 Zahlen beinhaltet, kannst du dich eines Tricks bedienen:
Delphi-Quellcode:
type
  TIntArray = array of Integer;

var
  Mask: Int64 = 0;
  Numbers: TIntArray;

function NextPermutation: TIntArray,
var i: Integer;
begin
  SetLength(Result, 0);
  Inc(Mask);
  for i := 0 to High(Numbers) do
    if (Mask shr i) and 1 <> 0 then
    begin
      SetLength(Result, Length(Result)+1);
      Result[High(Result)] := Numbers[i];
    end;
end;
Dabei ist Mask der eigentlich trickreiche Teil, hier wird kodiert, welche Zahlen im Ergebnis enthalten sind. Da Mask nur 64 Bits hat, für jede Zahl in Numbers eins, kann Numbers nur 64 Elemente lang sein. Bei jedem Schritt wird Mask um 1 erhöht und dann die nächste Permutation erzeugt.

Wenn du das mit beliebig großen Arrays machen willst, brauchst du eine Möglichkeit, mit beliebig langen Zahlen zu hantieren. Dabei werden nur zwei Anforderungen gestellt: eine Zahl muss inkrementierbar sein und man muss beliebige Bits der Zahl inspizieren können. Die Implementierung einer solchen Klasse ist eine Übungsaufgabe
  Mit Zitat antworten Zitat