Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Algoritma Knuth Boleh Menjana Permutasi Set dengan Cekap?
Menjana Pilihatur Set Dengan Cekap
Dalam masalah menjana pilih atur set, mencari algoritma yang paling cekap adalah penting. Kod yang disediakan mencapai kecekapan tinggi, tetapi untuk pengiraan yang menuntut, pengoptimuman diperlukan.
Penyelesaian Cadangan: Algoritma Knuth
Algoritma Knuth menawarkan pendekatan yang sangat cekap untuk menjana pilih atur. Ia beroperasi dalam empat langkah utama:
Pelaksanaan
Kod C# yang disediakan melaksanakan algoritma Knuth diberikan di bawah:
private static bool NextPermutation(int[] numList) { // 1. Find the largest index j such that a[j] < a[j + 1]. If no such index exists, the permutation is the last permutation. var largestIndex = -1; for (var i = numList.Length - 2; i >= 0; i--) { if (numList[i] < numList[i + 1]) { largestIndex = i; break; } } // If no such index exists, return false indicating the last permutation. if (largestIndex < 0) return false; // 2. Find the largest index l such that a[j] < a[l]. Since j + 1 is such an index, l is well defined and satisfies j < l. var largestIndex2 = -1; for (var i = numList.Length - 1; i >= 0; i--) { if (numList[largestIndex] < numList[i]) { largestIndex2 = i; break; } } // 3. Swap a[j] with a[l]. var tmp = numList[largestIndex]; numList[largestIndex] = numList[largestIndex2]; numList[largestIndex2] = tmp; // 4. 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; }Pertimbangan Pengoptimuman Kelajuan
Untuk pengoptimuman kelajuan selanjutnya, pertimbangkan berikut:
Atas ialah kandungan terperinci Bagaimanakah Algoritma Knuth Boleh Menjana Permutasi Set dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!