首頁 >後端開發 >php教程 >我們如何有效地找到集合的第n個排列?

我們如何有效地找到集合的第n個排列?

Linda Hamilton
Linda Hamilton原創
2024-12-07 06:46:16366瀏覽

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

辨識n 次排列的高效演算法

給定一個表示排列的元素數組,本題探討了一種演算法的可能性有效計算第 n個排列,無需計算所有前面的排列

因式排列分解

此解決方案利用了因式分解的概念。透過執行階乘的連續除法,它將排列索引分解為商數序列。此序列表示所需的排列。

調整商

但是,初始商忽略先前值的影響。因此,調整步驟是必要的。對於每個商,它都會透過較小或等於前面商的計數來增加值。

實現

提供了算法的C 實現下面:

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;
}

示例

例如,ithPermutation(10, 3628799)傳回十個元素的最後一個排列:

9 8 7 6 5 4 3 2 1 0

以上是我們如何有效地找到集合的第n個排列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn