Saya perlu menulis RandomQueue yang memungkinkan untuk menambahkan dan menghapus secara acak di Constant Time (O (1)).
Pikiran pertama saya adalah mendukungnya dengan semacam Array (saya memilih ArrayList), karena array memiliki akses konstan melalui indeks.
Melihat dokumentasi itu, saya menyadari bahwa penambahan ArrayLists dianggap Amortized Constant Time, karena penambahan mungkin memerlukan realokasi array yang mendasarinya, yaitu O (n).
Apakah Waktu Konstan diamortisasi dan Waktu Konstan efektif sama, atau apakah saya perlu melihat struktur yang tidak memerlukan realokasi penuh pada setiap penambahan?
Saya bertanya ini karena struktur berbasis array samping (yang sejauh yang saya tahu akan selalu memiliki penambahan Waktu Konstan yang Diamortisasi), saya tidak bisa memikirkan apa pun yang akan memenuhi persyaratan:
- Berbasis pohon apa pun akan memiliki akses O (log n) terbaik
- Daftar yang ditautkan berpotensi memiliki tambahan O (1) (jika referensi ke ekor disimpan), tetapi penghapusan acak harus terbaik O (n).
Inilah pertanyaan lengkapnya; kalau-kalau saya melihat beberapa detail penting:
Mendesain dan mengimplementasikan RandomQueue. Ini adalah implementasi dari antarmuka Antrian di mana operasi remove () menghapus elemen yang dipilih secara seragam di antara semua elemen yang ada dalam antrian. (Pikirkan RandomQueue sebagai tas di mana kita dapat menambahkan elemen atau menjangkau dan membabi buta menghapus beberapa elemen acak.) Operasi add (x) dan remove () dalam RandomQueue harus berjalan dalam waktu konstan per operasi.
1/a
peluang untuk operasi O (n)), tetapi tumbuh dengan faktor konstan a > 1
adalah O (1) diamortisasi sebagai tambahan: kami memiliki (1/a)^n
peluang O (n) operasi, tetapi probabilitas itu mendekati nol untuk besar n
.