Що відомо про структури даних, які можуть підтримувати послідовність елементів, що підлягають наступним двом операціям?
- Натисніть (x): додайте x до кінця послідовності та поверніть ідентифікатор для його положення в послідовності
- Витяг (S): надавши не упорядкований набір ідентифікаторів, видаліть елементи з цих позицій із послідовності та поверніть список видалених елементів у порядку послідовності
Якщо вам подобається, ви можете вважати це стеком або чергою з розділеною операцією, яка розбиває його на дві стеки: витяжна операція може бути використана для здійснення поп-або операції з видаленням, а витягнуту послідовність елементів також можна поставити знову в інший стек чи чергу.
Що я вже знаю: можна підтримувати послідовність як подвійно пов'язаний список, де кожен ідентифікатор є лише вказівником на вузол зв'язаним списком, а кожен вузол також зберігає номер позиції, що дозволяє швидко порівняти позиції двох непов'язаних елементів в послідовності. Оновити номери позицій по мірі прогресування структури даних не важко, щоб усі вони були натуральними цілими числами максимального значення , де - поточна кількість елементів у списку. У цій структурі даних єдиною складною частиною операції вилучення є сортування вилучених елементів за їх номерами позицій. Вилучення елементів займаєn k O ( k √ очікуваний рандомізований час, використовуючи, наприклад, алгоритм сортування цілих чисел Han і Thorup з FOCS 2002, і натискання вимагає постійного часу.
Чого я не знаю: чи можна обробляти витяг за час і просувати в постійний час? Чи є література з цієї проблеми? Це так важко, як цілочисельне сортування?
Мотивація: це основний крок, необхідний для замовлення елементів алгоритму планування Коффмана-Грема, який також має додатки для малювання графіків. Важка частина Коффмана-Грема - це лексикографічне топологічне впорядкування. Це можна зробити, підтримуючи для кожної різної незалежності послідовність вершин із цією інгредієнтою в підграфові, індуковану іншими вершинами. Потім повторно видаліть першу вершину із послідовності нульових нерівних вершин і додайте її до топологічного порядку; витягніть сусідів із ступенів, яким вони раніше належали, і натисніть на їх послідовність для наступного меншого ступеня. Отже,v O ( k ) час для операцій з вилученням у цій структурі даних призведе до лінійної реалізації алгоритму Кофмана-Грема за часом.
Оскільки я спочатку запитав це, я знайшов статтю Сеті з 1976 року, яка дозволяє алгоритм Кофмана-Грема реалізовуватись у лінійному часі, і включила його до моєї статті Вікіпедії про алгоритм Кофмана-Грема , тому оригінальна мотивація є менш значущою. Мені все ще цікаво, на що відповідь.