За запитом, ось структура, яку я знайшов після того, як сформулював питання:
Основна ідея полягає у використанні різьбового дерева Scapegoat разом із вказівником до мінімуму (і на користь, максимуму також). Більш простою альтернативою нитковій роботі є підтримка попередніх та наступних вказівників у кожному вузлі (що еквівалентно, простіше, але має більше накладних витрат). Я прийшов назвати це купами Scapegoat , просто щоб дати йому якусь назву.
Саме ця основна структура дає вам такі операції:
- Пошук: надавши ключ, повертає вказівник на відповідний вузол у час.O(logn)
- Вставка: наданий ключ, вставляє ключ у структуру, повертаючи покажчик на цей вузол у час.O(logn)
- Попередник / наступник: заданий покажчик повертає наступника чи попередника в час.O(1)
- Get-Min / Max: повертає вказівник до мінімуму чи максимуму.
При аналізі дерев Scapegoat балансуючий накладний вилучення аналізується як , але аналіз фактично дає баланс накладних витрат (який ігнорується в роботі оскільки вони також рахують час, необхідний для пошуку вузла, який потрібно видалити). Отже, якщо у нас є вказівник на вузол, ми можемо видалити його за постійний час (це можна зробити в дереві двійкового пошуку з потоком в час) і поєднати з накладні балансування, це дає час видалити:O ( 1 ) O ( log n ) O ( 1 ) O ( 1 ) O ( 1 )O(logn)O(1)O(logn)O(1)O(1)O(1)
- Видалити: задавши вказівник, видаляє вузол у час.O(1)
Поєднавши це:
- Extract-Min / Max: видаляє мінімальний / максимальний вузол за час.O(1)
Ви можете зробити трохи більше за допомогою покажчиків: наприклад, не важко підтримувати покажчик на медіану чи іншу статистику порядку, тому ви можете підтримувати постійну кількість таких покажчиків, якщо вони вам потрібні.
Ще деякі речі:
- Побудова: задано клавіш у відсортованому порядку, побудуйте купу Scapegoat в час.O ( n )nO(n)
- Баланс: врівноважте дерево, таким чином воно формує ідеально збалансоване дерево бінарного пошуку (зменшує накладні результати пошуку) за час (ви можете зробити це постійним коефіцієнтом швидше, ніж папір пропонує, до речі, використовуючи покажчики попередника / наступника).O(n)
І нарешті, я впевнений, що ви можете підтримати ці операції, але мені потрібно трохи подумати над цим, перш ніж знати це точно:
- Insert-New-Min / Max: наданий ключ, менший / більший, ніж будь-який ключ, який уже є в структурі, вставляє ключ у структуру, повертаючи вказівник на цей вузол у час.O(1)