„Zufällige Permutation“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Inhalt gelöscht Inhalt hinzugefügt
AZ: Die Seite wurde neu angelegt: Eine '''zufällige Permutation''' oder '''Zufallspermutation''' ist in der Mathematik eine Zufal…
(kein Unterschied)

Version vom 5. Dezember 2013, 15:50 Uhr

Eine zufällige Permutation oder Zufallspermutation ist in der Mathematik eine zufällige Anordnung einer endlichen Menge von Objekten. Beispielsweise ist das Mischen der Karten eines Kartenspiels (im Idealfall) eine zufällige Permutation der Karten. In der Stochastik werden zufällige Permutationen als Elementarereignisse in einem diskreten Wahrscheinlichkeitsraum angesehen. So können Kennzahlen, wie die Anzahl der Fixpunkte, Fehlstände oder Zyklen, als diskrete Zufallsvariablen angesehen werden, deren Wahrscheinlichkeitsverteilungen dann untersucht werden. Im Computer können zufällige Permutationen effizient mit dem Fisher-Yates-Verfahren generiert werden. Zufällige Permutationen werden unter anderem bei der Analyse von Sortierverfahren, in der Kryptographie und Kodierungstheorie sowie im Rahmen randomisierter Algorithmen untersucht.

Definition

Gegeben sei die Menge der Permutationen der Zahlen von bis , also

.

Man betrachtet nun den diskreten Wahrscheinlichkeitsraum mit der Potenzmenge und dem durch

  für alle

definierten Wahrscheinlichkeitsmaß . Dieser Wahrscheinlichkeitsraum ist ein Laplace-Raum, in dem jede Permutation die gleiche Wahrscheinlichkeit besitzt, und seine Elementarereignisse heißen zufällige Permutationen. Allgemeiner können auch Permutationen beliebiger endlicher Mengen, beispielsweise Alphabete, betrachtet werden, zur Analyse der mathematischen Eigenschaften kann man sich jedoch auf die ersten natürlichen Zahlen beschränken.

Eigenschaften

Erzeugende Funktionen

Zufälligen Permutationen zugeordnete Größen, wie die Anzahl der Fixpunkte, Fehlstände oder Zyklen, können als diskrete Zufallsvariablen interpretiert werden. Die Wahrscheinlichkeitsverteilung dieser Zufallsvariablen ist allerdings im Allgemeinen nicht mehr gleichverteilt. Ein wichtiges Hilfsmittel bei der Analyse dieser Wahrscheinlichkeitsverteilungen sind erzeugende Funktionen. Ist die Wahrscheinlichkeitsfunktion, dass die Zufallsvariable den Wert annimmt, dann wird die zugehörige wahrscheinlichkeitserzeugende Funktion durch

für definiert. Dabei handelt es sich um eine exponentiell erzeugende Funktion. Der Erwartungswert der Zufallsvariable ist dann durch

gegeben und ihre Varianz entsprechend durch

.

Im Folgenden werden einige wichtige Wahrscheinlichkeitsverteilungen, ihre Erwartungswerte und ihre Varianzen angegeben.

Anzahl der Fixpunkte

Häufigkeitsverteilung der Anzahl der Fixpunkte in einer zufälligen Permutation der Länge 7

Ein Fixpunkt in einer Permutation ist eine Zahl , für die gilt. Die Anzahl der Permutationen mit genau Fixpunkten wird durch die Rencontres-Zahlen angegeben (Folge A008290 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Fixpunkte einer Permutation hat somit die Form

.

Für den Erwartungswert und die Varianz der Anzahl der Fixpunkte gilt damit

und

Die Anzahl der Fixpunkte in einer zufälligen Permutation ist für asymptotisch poisson-verteilt mit Intensität .[1]

Anzahl der Fehlstände

Häufigkeitsverteilung der Anzahl der Fehlstände in einer zufälligen Permutation der Länge 7

Ein Fehlstand in einer Permutation ist ein Paar , für das und gilt. Die Anzahl der Permutationen mit genau Fehlständen wird durch die McMahon-Zahlen angegeben (Folge A008302 in OEIS). Die Wahrscheinlichkeitsfunktion der Anzahl der Fixpunkte einer Permutation hat somit die Form[2]

.

Für den Erwartungswert und die Varianz der Anzahl der Fehlstände erhält man

und

Die Anzahl der Fehlstände in einer zufälligen Permutation ist bei entsprechender Normierung für asymptotisch normalverteilt.[3]

Anzahl der Zyklen

Häufigkeitsverteilung der Anzahl der Zyklen in einer zufälligen Permutation der Länge 7

Ein Zyklus in einer Permutation ist eine Folge verschiedener Zahlen , für die für und gilt. Jede Permutation kann so in ein oder mehrere Zyklen zerlegt werden. Die Anzahl der Permutationen mit genau Zyklen wird durch die Stirling-Zahlen der ersten Art angegeben (Folge A130534 in OEIS). Die wahrscheinlichkeitserzeugende Funktion der Anzahl der Zyklen einer Permutation hat somit die Form

.

Für den Erwartungswert und die Varianz der Anzahl der Fehlstände erhält man

,

wobei die -te harmonische Zahl ist, und

,

wobei die -te harmonische Zahl zweiter Ordnung ist. Die Anzahl der Zyklen in einer zufälligen Permutation ist bei entsprechender Normierung für asymptotisch normalverteilt mit Erwartungswert und Varianz .[4]

Erzeugung

Eine wichtige Aufgabe bei der Untersuchung von Algorithmen, beispielsweise Sortierverfahren, im Rahmen von Monte-Carlo-Simulationen ist die Erzeugung zufälliger Permutationen auf dem Computer. Die Grundidee ist hierbei die Verwendung uniform verteilter Pseudozufallszahlen mit Hilfe geeigneter Zufallszahlengeneratoren. Diese Pseudozufallszahlen werden dann auf geeignete Weise kombiniert, sodass eine zufällige Permutation entsteht.

Direktes Verfahren

Bei dem direkten Verfahren betrachtet man zunächst das Tupel bestehend aus den Zahlen von bis . Nun zieht man eine uniform verteilte Zufallszahl zwischen und (einschließlich), notiert das entsprechende Tupelelement als die erste Zahl der Ergebnispermutation und streicht dieses Element anschließend aus dem Tupel. Im nächsten Schritt zieht man eine uniform verteilte Zufallszahl zwischen und , notiert das entsprechende Tupelelement als zweite Zahl der Ergebnispermutation und streicht dieses Element ebenfalls. Dieses Vorgehen wird fortgesetzt, bis schließlich keine Zahl mehr in dem Tupel vorhanden ist und damit die Ergebnispermutation vollständig ist. In Pseudocode kann dieses Verfahren wie folgt implementiert werden:

function randperm(n)
    P = zeroes(n)                       // Ergebnispermutation mit Nullen initialisieren
    N = [1:n]                           // Tupel mit den Zahlen von 1 bis n
    for i = 1 to n                      // Schleife über die Einträge von P
        z = random(n-i+1)               // Gleichverteilte Zufallszahl zwischen 1 und n-i+1
        P(i) = N(z)                     // Wähle als nächsten Eintrag die z-te verbleibende Zahl
        N = setdiff(N,N(z))             // Entferne diese Zahl aus den verbleibenden Zahlen
    end
    return P

Bereich Zufallszahl Auswahl Ergebnis
1-6 5 1 2 3 4 5 6 5
1-5 3 1 2 3 4 6 5 3
1-4 4 1 2 4 6 5 3 6
1-3 1 1 2 4 5 3 6 1
1-2 2 2 4 5 3 6 1 4
1-1 1 2 5 3 6 1 4 2

Bei diesem Ansatz werden die Plätze der Reihe nach durchgegangen, wobei jedem Platz eine zufällig aus den jeweils noch verfügbaren Zahlen ausgewählte Zahl zugewiesen wird. Alternativ kann auch der duale Ansatz verfolgt werden, bei dem die Zahlen der Reihe nach durchgegangen werden, wobei jeder Zahl ein zufällig ausgewählter noch freier Platz zugewiesen wird. In beiden Fällen leidet die Effizienz des Verfahrens darunter, dass es aufwändig ist, ein bestimmtes Element aus einem Tupel zu entfernen, beziehungsweise einen bestimmten freien Platz zu finden. In einer Standardimplementierung benötigen diese Teilaufgaben im Mittel Operationen, sodass das Gesamtverfahren eine Laufzeitkomplexität der Ordnung

aufweist. In der nebenstehenden Tabelle findet sich ein Beispiel für die Funktionsweise dieses Verfahrens bei der Erzeugung einer zufälligen Permutation der Länge sechs. Die in jedem Schritt ausgewählte und damit eliminierte Zahl ist dabei durchgestrichen dargestellt.

Fisher-Yates-Verfahren

Eine Verbesserung stellt das Fisher-Yates-Verfahren (nach Ronald Fisher und Frank Yates) dar. Dieses Verfahren arbeitet zudem am Platz, das heißt gegeben ein vorinitialisiertes Feld mit den Zahlen von bis werden diese Zahlen schrittweise derart umsortiert, dass am Ende eine zufällige Permutation entsteht. Um die aufwändige Suche nach einer noch nicht verwendeten Zahl zu vermeiden wird in jedem Schritt eine ausgewählte Zahl ans Ende der aktuellen Teilliste gestellt, indem sie mit der letzten noch nicht ausgewählten Zahl vertauscht wird. In Pseudocode stellt sich dieses Verfahren wie folgt dar:

function randperm(n)
    P = [1:n]                           // Initialisierung mit der identischen Permutation
    for i = n downto 1                  // Schleife über die Einträge von P
        z = random(i)                   // Gleichverteilte Zufallszahl zwischen 1 und i
        swap(P(i),P(z))                 // Vertausche die Zahlen an den Stellen i und z
    end
    return P

Bereich Zufallszahl Permutation
1-6 5 1 2 3 4 5 6
1-5 3 1 2 3 4 6 5
1-4 4 1 2 6 4 3 5
1-3 1 1 2 6 4 3 5
1-2 2 6 2 1 4 3 5
1-1 1 6 2 1 4 3 5

Die Initialisierung kann dabei, wie im Codebeispiel, mit der identischen Permutation erfolgen, es kann hier aber auch eine beliebige Permutation verwendet werden, die dann entsprechend umsortiert wird. Dies macht das Verfahren speziell für Simulationsanwendungen attraktiv, bei denen die Permutationsroutine iterativ aufgerufen werden kann. Da die Vertauschung zweier Elemente eines Tupels mit einem konstanten Aufwand erfolgt, besitzt das Fisher-Yates-Verfahren eine Laufzeitkomplexität der Ordnung

,

was eine erhebliche Verbesserung gegenüber dem direkten Verfahren darstellt. In der nebenstehenden Tabelle wird das Verfahren ebenfalls anhand eines Beispiels illustriert, bei dem wieder eine zufällige Permutation der Länge sechs erzeugt wird. Die jeweils miteinander vertauschten Zahlen sind dabei unterstrichen dargestellt. Es wurden die gleichen Zufallszahlen verwendet, wie in dem Beispiel zum direkten Verfahren, allerdings ist die Ergebnispermutation hier eine andere.

Siehe auch

Literatur

Einzelnachweise

  1. Alan Camina, Barry Lewis: An Introduction to Enumeration. Springer, 2011, ISBN 0-85729-600-0, S. 140.
  2. Donald E. Knuth: The Art of Computer Programming, Volume 3: Sorting and Searching. S. 15–16.
  3. Vladimir Nikolaevič Sačkov: Probabilistic Methods in Combinatorial Analysis. Cambridge University Press, 1997, S. 30.
  4. Hosam M. Mahmoud: Sorting: A Distribution Theory. John Wiley & Sons, 2000, ISBN 0-471-32710-7, S. 48.

Weblinks