Ja, es ist möglich, mit O (n^2) Algorithmus:
Nimm Element bei Index 0, schreibt dann 0 in der Zelle durch dieses Element indiziert . Verwenden Sie dann das gerade überschriebene Element, um den nächsten Index zu erhalten und den vorherigen Index dort zu schreiben. Fahren Sie fort, bis Sie zum Index 0 zurückkehren. Dies ist der Zyklus-Leader-Algorithmus.
Dann tun Sie das gleiche, beginnend mit Index 1, 2, ... Aber bevor Sie irgendwelche Änderungen vornehmen, führen Sie den Zyklusleiteralgorithmus ohne irgendwelche Änderungen aus, ausgehend von diesem Index. Wenn dieser Zyklus einen Index unter dem Startindex enthält, überspringen Sie ihn einfach.
Oder diese O (n^3) Algorithmus:
Nimm Element bei Index 0 ist, dann 0 durch dieses Element indiziert in die Zelle schreiben. Verwenden Sie dann das gerade überschriebene Element, um den nächsten Index zu erhalten und den vorherigen Index dort zu schreiben. Fahren Sie fort, bis Sie zu Index 0 zurückgehen.
Dann machen Sie das gleiche, beginnend mit Index 1, 2, ... Aber bevor Sie Änderungen vornehmen, führen Sie den Zyklusleiter-Algorithmus ohne irgendwelche Modifikationen ausgehend von allen vorhergehenden Indizes aus. Wenn der aktuelle Index in einem vorhergehenden Zyklus vorhanden ist, überspringen Sie ihn einfach.
I geschrieben (leicht optimiert) implementation von O (n^2) Algorithmus in C++ 11, um zu bestimmen, wie viele zusätzliche Zugriffe für jedes Element im Mittel benötigt werden, wenn zufällige Permutation invertiert wird. Hier sind die Ergebnisse:
size accesses
2^10 2.76172
2^12 4.77271
2^14 6.36212
2^16 7.10641
2^18 9.05811
2^20 10.3053
2^22 11.6851
2^24 12.6975
2^26 14.6125
2^28 16.0617
Während Größe exponentiell wächst, die Zahl der Elemente greift fast linear wächst, so erwartete Zeitkomplexität für zufällige Permutationen ist so etwas wie O (n log n).
Können wir das Zeichen-Bit Ihrer Array-Einträge verwenden, um Informationen zu kodieren, oder würde das gegen die Idee gehen, keinen zusätzlichen Speicherplatz zu verwenden? –
@ NiklasB. Das wäre 1 Bit pro Eintrag - O (n) Leerzeichen. Nicht erlaubt. – orlp
Nun, das hängt wirklich vom Modell ab. Im klassischen RAM-Modell zum Beispiel haben wir log n