Rumah > pembangunan bahagian belakang > tutorial php > Bagaimanakah Kita Boleh Mendapatkan Permutasi ke-n Set dengan Cekap?

Bagaimanakah Kita Boleh Mendapatkan Permutasi ke-n Set dengan Cekap?

Linda Hamilton
Lepaskan: 2024-12-07 06:46:16
asal
382 orang telah melayarinya

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

Algoritma Cekap untuk Mengenalpasti Pilihalih ke-n

Memandangkan susunan elemen yang mewakili pilihatur, soalan ini meneroka kemungkinan algoritma yang cekap mengira pilihatur ke-n tanpa mengira semua sebelumnya satu.

Penguraian Pilihatur Faktoradik

Penyelesaian memanfaatkan konsep penguraian faktoradik. Dengan melakukan pembahagian berturut-turut oleh faktorial, ia menguraikan indeks pilih atur kepada urutan hasil bahagi. Urutan ini mewakili pilih atur yang diingini.

Pelarasan Petik

Walau bagaimanapun, hasil bagi awal mengabaikan kesan nilai sebelumnya. Oleh itu, langkah pelarasan adalah perlu. Bagi setiap hasil bagi, ia menambah nilai mengikut kiraan nilai bahagi yang lebih kecil atau sama.

Pelaksanaan

Pelaksanaan C bagi algoritma disediakan di bawah:

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;
}
Salin selepas log masuk

Contoh

Untuk contoh, ithPermutation(10, 3628799) mengembalikan pilihatur terakhir bagi sepuluh elemen:

9 8 7 6 5 4 3 2 1 0
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Mendapatkan Permutasi ke-n Set dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan