Sabit Zaman (O (1)) ekler ve rasgele kaldırma sağlayan bir RandomQueue yazmak gerekiyor.
İlk düşüncem, dizilerin bir dizin aracılığıyla sürekli erişime sahip olması nedeniyle bir çeşit Array (ArrayList seçtim) ile destek olmaktı.
Yine de belgelere baktığımda, ArrayLists'in eklemelerinin İtfa Edilmiş Sabit Zaman olarak kabul edildiğini fark ettim, çünkü bir ekleme O (n) olan temel dizinin yeniden tahsis edilmesini gerektirebilir.
İtfa Edilen Sabit Zaman ve Sabit Zaman etkili bir şekilde aynı mıdır, yoksa her ekleme için tam bir yeniden tahsis gerektirmeyen bir yapıya bakmam gerekir mi?
Bunu soruyorum çünkü dizi tabanlı yapılar bir kenara (bildiğim kadarıyla her zaman Amortize Sabit Zaman eklemeleri olacak), gereksinimleri karşılayacak bir şey düşünemiyorum:
- Ağaç tabanlı herhangi bir şey en iyi O (log n) erişimine sahip olacaktır
- Bağlantılı bir liste potansiyel olarak O (1) ilavesine sahip olabilir (kuyruğa bir referans tutulursa), ancak rastgele bir kaldırma en iyi O (n) olmalıdır.
İşte tam soru; bazı önemli detayların üzerine bir sır attığımda:
Bir RandomQueue tasarlayın ve uygulayın. Bu, remove () işleminin şu anda kuyrukta bulunan tüm öğeler arasında rasgele olarak seçilen bir öğeyi kaldırdığı Kuyruk arabiriminin bir uygulamasıdır. (RandomQueue'yu, öğe ekleyebileceğimiz veya rastgele bir öğeye erişip körü körüne kaldırabileceğimiz bir çanta olarak düşünün.) RandomQueue'daki add (x) ve remove () işlemleri, işlem başına sabit sürede çalışmalıdır.
1/a
için O (n) 'dir (O (n) operasyonu için bir şansımız vardır), ancak sabit bir faktörle büyümek a > 1
O (1)' in eklenmesi için itfa edilir: (1/a)^n
O (n) operasyon, ancak bu olasılık büyük için sıfıra yaklaşır n
.