Geçenlerde çok verimsiz olduğunu düşündüğüm bazı kodlar yazdım, ancak yalnızca birkaç değer içerdiğinden kabul ettim. Ancak, aşağıdakiler için daha iyi bir algoritmaya hala ilgi duyuyorum:
- Her birine bir "ağırlık" atanan X nesnelerinin bir listesi
- Ağırlıkları topla
- Toplamdan 0 dan rasgele bir sayı oluşturun
- Nesneler arasında yineleme, ağırlıklarını toplamdan pozitif olmayana kadar toplamdan çıkarma
- Nesneyi listeden kaldırın ve ardından yeni listenin sonuna ekleyin.
2,4 ve 5 numaralı maddeler n
zaman alır ve bu nedenle bir O(n^2)
algoritmadır.
Bu geliştirilebilir mi?
Ağırlıklandırılmış bir karıştırmaya örnek olarak, bir elemanın ön tarafında daha yüksek ağırlıkta olma şansı daha yüksektir.
Örnek (gerçek kılmak için rastgele sayılar üreteceğim):
Ağırlığa sahip 6 nesne 6,5,4,3,2,1; Toplam 21
19'u seçtim: 19-6-5-4-3-2 = -1
2 böylece birinci konuma girdim, ağırlıklar şimdi 6,5,4,3,1; Toplam 19
16'yı seçtim: 16-6-5-4-3 = -2
3 böylece ikinci konuma geçiyor, ağırlıklar şimdi 6,5,4,1; Toplam 16
3'ü seçtim: 3-6 = -3
Böylece 6 üçüncü pozisyona giriyor, ağırlıklar şimdi 5,4,1; Toplam 10
8 seçtim: 8-5-4 = -1
Böylece 4 dördüncü sıraya giriyor, ağırlıklar şimdi 5,1; Toplam 6
5 seçtim: 5 5-5=0
böylece beşinci sırada yer alıyor, ağırlıklar 1; Toplam 1
1 seçtim: 1 1-1=0
böylece son konuma geçiyorum, daha fazla ağırlığım yok, bitiriyorum