Мені потрібно написати чергу RandomQueue, яка дозволяє додавати та випадкове видалення за постійний час (O (1)).
Моя перша думка полягала в тому, щоб підтримувати його якимось масивом (я вибрав ArrayList), оскільки масиви мають постійний доступ через індекс.
Переглянувши документацію, я зрозумів, що доповнення ArrayLists вважаються амортизованим постійним часом, оскільки для додавання може знадобитися перерозподіл базового масиву, який є O (n).
Чи амортизовані постійний час і постійний час ефективно однакові, чи мені потрібно дивитись на якусь структуру, що не потребує повного перерозподілу кожного додавання?
Я запитую це, оскільки структури на основі масиву вбік (які, наскільки я знаю, завжди матимуть амортизовані доповнення постійного часу), я не можу придумати нічого, що б відповідало вимогам:
- Будь-яке дерево на основі матиме в кращому випадку O (log n) доступ
- Зв'язаний список потенційно може мати додатки O (1) (якщо зберігається посилання на хвіст), але випадкове видалення має бути в кращому випадку O (n).
Ось повне запитання; на випадок, якщо я засклив деякі важливі деталі:
Розробити та реалізувати RandomQueue. Це реалізація інтерфейсу черги, в якій операція видалення () видаляє елемент, який вибирається навмання рівномірно серед усіх елементів, що знаходяться в черзі. (Подумайте про RandomQueue як про мішок, в який ми можемо додати елементи або досягти і сліпо вилучити якийсь випадковий елемент.) Операції add (x) та delete () у RandomQueue повинні виконуватись у постійному часі за одну операцію.
1/a
шанс на операцію O (n)), але зростаючий постійним коефіцієнтом a > 1
амортизується для додавання O (1): у нас є (1/a)^n
шанс на O (n) операція, але ця ймовірність наближається до нуля для великих n
.