Heim >Backend-Entwicklung >PHP-Tutorial >Wie können wir effizient die n-te Permutation einer Menge finden?

Wie können wir effizient die n-te Permutation einer Menge finden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-07 06:46:16364Durchsuche

How Can We Efficiently Find the n-th Permutation of a Set?

Effizienter Algorithmus zur Identifizierung der n-ten Permutation

Gegeben ein Array von Elementen, die eine Permutation darstellen, untersucht diese Frage die Möglichkeit eines Algorithmus, der Berechnet effizient die n-te Permutation, ohne alle vorhergehenden zu berechnen.

Faktoradisch Permutationszerlegung

Die Lösung nutzt das Konzept der faktoradischen Zerlegung. Durch aufeinanderfolgende Divisionen durch Fakultäten wird der Permutationsindex in eine Folge von Quotienten zerlegt. Diese Sequenz stellt die gewünschte Permutation dar.

Anpassen der Quotienten

Die anfänglichen Quotienten berücksichtigen jedoch die Auswirkungen vorheriger Werte. Daher ist ein Anpassungsschritt erforderlich. Für jeden Quotienten wird der Wert um die Anzahl der kleineren oder gleichen vorhergehenden Quotienten erhöht.

Implementierung

Eine C-Implementierung des Algorithmus ist unten angegeben:

void ithPermutation(const int n, int i) {
    int *fact = new int[n], *perm = new int[n];

    // Compute factorials
    fact[0] = 1;
    for (int k = 1; k < n; k++)
        fact[k] = fact[k - 1] * k;

    // Compute factorial code
    for (int k = 0; k < n; k++) {
        perm[k] = i / fact[n - 1 - k];
        i %= fact[n - 1 - k];
    }

    // Adjust values for permutation
    for (int k = n - 1; k > 0; k--)
        for (int j = k - 1; j >= 0; j--)
            if (perm[j] <= perm[k])
                perm[k]++;

    // Print permutation
    for (int k = 0; k < n; k++)
        cout << perm[k] << " ";
    cout << "\n";

    delete[] fact;
    delete[] perm;
}

Beispiel

Zum Beispiel, ithPermutation(10, 3628799) gibt die letzte Permutation von zehn Elementen zurück:

9 8 7 6 5 4 3 2 1 0

Das obige ist der detaillierte Inhalt vonWie können wir effizient die n-te Permutation einer Menge finden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn