Baru-baru ini saya menulis beberapa kode yang saya pikir sangat tidak efisien, tetapi karena hanya menyertakan beberapa nilai, saya menerimanya. Namun, saya masih tertarik pada algoritma yang lebih baik untuk hal berikut:
- Daftar objek X, masing-masing diberi "bobot"
- Ringkas bobotnya
- Hasilkan angka acak dari 0 hingga jumlah
- Iterasi melalui objek, kurangi beratnya dari jumlah hingga jumlahnya tidak positif
- Hapus objek dari daftar, dan kemudian tambahkan ke akhir daftar baru
Item 2,4, dan 5 semuanya membutuhkan n
waktu, dan karena itu merupakan O(n^2)
algoritma.
Bisakah ini diperbaiki?
Sebagai contoh pengocokan tertimbang, elemen memiliki peluang lebih besar untuk berada di depan dengan bobot lebih tinggi.
Contoh (Saya akan membuat angka acak untuk membuatnya nyata):
6 benda dengan bobot 6,5,4,3,2,1; Jumlahnya adalah 21
Saya memilih 19 19-6-5-4-3-2 = -1
:, dengan demikian 2 berada di posisi pertama, bobot sekarang 6,5,4,3,1; Jumlahnya adalah 19
Saya memilih 16 16-6-5-4-3 = -2
:, dengan demikian 3 berada di posisi kedua, bobot sekarang 6,5,4,1; Jumlahnya adalah 16
Saya memilih 3 3-6 = -3
:, dengan demikian 6 berada di posisi ketiga, bobot sekarang 5,4,1; Jumlahnya adalah 10
Saya memilih 8:, 8-5-4 = -1
dengan demikian 4 berada di posisi keempat, bobot sekarang 5,1; Jumlahnya adalah 6
Saya memilih 5:, 5-5=0
dengan demikian 5 berada di posisi kelima, bobot sekarang 1; Jumlahnya adalah 1
Saya memilih 1:, 1-1=0
dengan demikian 1 berada di posisi terakhir, saya tidak punya beban lagi, saya selesai