Rumah >pembangunan bahagian belakang >C++ >Adakah menggunakan `rawak` dan` Orderby` cara yang cekap untuk mengosongkan senarai?

Adakah menggunakan `rawak` dan` Orderby` cara yang cekap untuk mengosongkan senarai?

Linda Hamilton
Linda Hamiltonasal
2025-01-31 18:56:10123semak imbas

Is Using `Random` and `OrderBy` an Efficient Way to Shuffle a List?

Gunakan

dan senarai shuffle: Adakah ia algoritma yang cekap? Random OrderBy Artikel ini membincangkan sama ada penggunaan dan

adalah cara yang berkesan untuk menyenaraikan senarai.

Random kaedah OrderBy

Kod yang diberikan untuk menghasilkan nombor rawak untuk setiap elemen, dan meneruskan senarai berdasarkan nombor ini:

penilaian

<code>var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());</code>
Walaupun kaedah ini kelihatan sangat intuitif, ia mempunyai beberapa kekurangan:

Kerumitan pengkomputeran:

kerumitan masa adalah O (n log n), yang tidak cekap untuk senarai besar. Algoritma shuffle yang lebih baik mempunyai kerumitan O (n).

Masalah yang berpotensi:
    Berdasarkan unsur penomboran rawak boleh menyebabkan sisihan sisihan, kekerapan unsur -unsur tertentu mungkin lebih tinggi daripada unsur -unsur lain.
  • alternatif
  • Algoritma shuffle yang lebih baik adalah shuffle Fisher-Yates, yang menukar elemen ke kedudukan rawak dalam senarai. Ini memberikan taburan yang lebih seragam, dan kerumitan adalah O (n).
  • pelaksanaan

Kaedah pengembangan ini memudahkan penggunaan shuffle Fisher-Yates dan mengelakkan keperluan menghasilkan tatasusunan baru.

Kesimpulan

dan boleh digunakan untuk shuffling, tetapi mereka mempunyai masalah kecekapan dan sisihan. Fisher-Yates Shuffle menyediakan penyelesaian yang lebih cekap dan tidak menyedihkan, yang merupakan pilihan pertama dalam kebanyakan aplikasi yang perlu digerakkan.

Atas ialah kandungan terperinci Adakah menggunakan `rawak` dan` Orderby` cara yang cekap untuk mengosongkan senarai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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