Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Algoritma Knuth Boleh Menjana Pilihatur Dengan Cekap?

Bagaimanakah Algoritma Knuth Boleh Menjana Pilihatur Dengan Cekap?

Barbara Streisand
Lepaskan: 2025-01-04 06:15:38
asal
564 orang telah melayarinya

How Can Knuth's Algorithm Generate Permutations Efficiently?

Penjanaan Pilihatur Pantas Menggunakan Algoritma Knuth

Mengoptimumkan penjanaan pilih atur ialah masalah asas dalam sains komputer. Ini amat penting apabila berurusan dengan set data yang besar, di mana masa yang diperlukan untuk menghitung semua pilih atur boleh menjadi penting. Coretan kod berikut membentangkan algoritma yang cekap untuk menjana pilih atur, yang dikenali sebagai Algoritma Knuth:

private static bool NextPermutation(int[] numList)
{
    // Find the largest index j such that a[j] < a[j + 1].
    int largestIndex = -1;
    for (int i = numList.Length - 2; i >= 0; i--)
    {
        if (numList[i] < numList[i + 1]) {
            largestIndex = i;
            break;
        }
    }

    // If no such index exists, the permutation is the last permutation.
    if (largestIndex < 0) return false;

    // Find the largest index l such that a[j] < a[l].
    int largestIndex2 = -1;
    for (int i = numList.Length - 1 ; i >= 0; i--) {
        if (numList[largestIndex] < numList[i]) {
            largestIndex2 = i;
            break;
        }
    }

    // Swap a[j] with a[l].
    int tmp = numList[largestIndex];
    numList[largestIndex] = numList[largestIndex2];
    numList[largestIndex2] = tmp;

    // Reverse the sequence from a[j + 1] up to and including the final element a[n].
    for (int i = largestIndex + 1, j = numList.Length - 1; i < j; i++, j--) {
        tmp = numList[i];
        numList[i] = numList[j];
        numList[j] = tmp;
    }

    return true;
}
Salin selepas log masuk

Algoritma ini beroperasi dalam masa O(n^2), dengan n mewakili bilangan elemen dalam senarai input. Ia menggunakan beberapa pengoptimuman untuk meminimumkan pengiraan, termasuk:

  • Pengenalpastian berulang indeks terbesar j di mana a[j] < a[j 1].
  • Pengenalpastian berulang bagi indeks l terbesar di mana a[j] < a[l].
  • Pertukaran elemen yang cekap menggunakan pembolehubah sementara.
  • Pembalikan jujukan yang cekap daripada a[j 1] ke penghujung menggunakan pertukaran bercermin.

Pengoptimuman ini memastikan penjanaan pilih atur seterusnya yang cekap dalam satu set, menjadikan algoritma ini sangat sesuai untuk aplikasi yang memerlukan pilih atur pantas generasi.

Atas ialah kandungan terperinci Bagaimanakah Algoritma Knuth Boleh Menjana Pilihatur 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