Роздільний стек


22

Що відомо про структури даних, які можуть підтримувати послідовність елементів, що підлягають наступним двом операціям?

  • Натисніть (x): додайте x до кінця послідовності та поверніть ідентифікатор для його положення в послідовності
  • Витяг (S): надавши не упорядкований набір ідентифікаторів, видаліть елементи з цих позицій із послідовності та поверніть список видалених елементів у порядку послідовності

Якщо вам подобається, ви можете вважати це стеком або чергою з розділеною операцією, яка розбиває його на дві стеки: витяжна операція може бути використана для здійснення поп-або операції з видаленням, а витягнуту послідовність елементів також можна поставити знову в інший стек чи чергу.

Що я вже знаю: можна підтримувати послідовність як подвійно пов'язаний список, де кожен ідентифікатор є лише вказівником на вузол зв'язаним списком, а кожен вузол також зберігає номер позиції, що дозволяє швидко порівняти позиції двох непов'язаних елементів в послідовності. Оновити номери позицій по мірі прогресування структури даних не важко, щоб усі вони були натуральними цілими числами максимального значення , де - поточна кількість елементів у списку. У цій структурі даних єдиною складною частиною операції вилучення є сортування вилучених елементів за їх номерами позицій. Вилучення елементів займаєn k O ( k O(n)nkO(kloglogk) очікуваний рандомізований час, використовуючи, наприклад, алгоритм сортування цілих чисел Han і Thorup з FOCS 2002, і натискання вимагає постійного часу.

Чого я не знаю: чи можна обробляти витяг за час і просувати в постійний час? Чи є література з цієї проблеми? Це так важко, як цілочисельне сортування?O(k)

Мотивація: це основний крок, необхідний для замовлення елементів алгоритму планування Коффмана-Грема, який також має додатки для малювання графіків. Важка частина Коффмана-Грема - це лексикографічне топологічне впорядкування. Це можна зробити, підтримуючи для кожної різної незалежності послідовність вершин із цією інгредієнтою в підграфові, індуковану іншими вершинами. Потім повторно видаліть першу вершину із послідовності нульових нерівних вершин і додайте її до топологічного порядку; витягніть сусідів із ступенів, яким вони раніше належали, і натисніть на їх послідовність для наступного меншого ступеня. Отже,v O ( k )vvO(k) час для операцій з вилученням у цій структурі даних призведе до лінійної реалізації алгоритму Кофмана-Грема за часом.

Оскільки я спочатку запитав це, я знайшов статтю Сеті з 1976 року, яка дозволяє алгоритм Кофмана-Грема реалізовуватись у лінійному часі, і включила його до моєї статті Вікіпедії про алгоритм Кофмана-Грема , тому оригінальна мотивація є менш значущою. Мені все ще цікаво, на що відповідь.


Якщо вставки відбуваються лише в кінці послідовності, ви можете керувати як подвійним пов'язаним списком, так і хеш-таблицею позицій елементів. Вставка: амортизований O (1) (просто тримайте вказівник на останній елемент). Витяг k елементів: амортизований O (k) (для кожного елемента S отримайте вказівник та видаліть його з хеш-таблиці, дістаньте та видаліть елемент із списку та додайте його до результату вилучення).
Marzio De Biasi

3
Це не вилучення елементів зі списку, що займає час, це їх перестановка з несортованого порядку аргументу на Витяг у правильний порядок послідовностей.
Девід Еппштейн

Відповіді:


1

Я думаю, що це принаймні настільки ж важко, як сортування набору цілих чисел з "випадковими порадами" полінома розміру в n . Під випадковою порадою я маю на увазі, що для будь-якого n існує фіксований розподіл D n (залежно лише від n ) по рядках розміру poly ( n ), а наш алгоритм (модельований машиною оперативної пам'яті) надає випадковий доступ до однієї вибірки з D н . D n - (рандомізована) структура даних після натискання [ n ]S[n]nnDnnnDnDn[n]O(1)

S[n]SSO(1)

Отже, повідомлення полягає в тому, що, якщо якась "вільна" бічна інформація, яка залежить лише від верхньої межі цілих чисел, може полегшити сортування цілих чисел , вилучення є таким же важким, як і сортування цілих чисел.

Чи означає це співвідношення двох проблем без дивної моделі? Це поняття випадкових порад щось відоме? Це схоже на протокол MA, але повідомлення Мерліна не може залежати від вкладених даних, і ми дбаємо про час роботи Артура.


[n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
Дейв

Ω(n)DnkO(k)Dn

Ось чому я не вважаю цю відповідь цілком переконливою. Якщо у вас є лише один набір S цілих чисел, який ви хочете сортувати, все лінійне час (просто зробіть підрахунок сортування в O (n + k)). Але якщо ви намагаєтеся використовувати цю структуру даних для імітації послідовності безлічі малих сортів (так що підрахунок сортування недостатньо хороший), то лише перший із цих малих сортів є абсолютно нестримним: після цього ви видалили деякі елементів [n], тому кожна сортована послідовність повинна бути невід’ємною від попередньої. Тож здається, що важко зробити скорочення від сортування робіт.
Девід Еппштейн

O(k)O(n+k)

Ω(n)DnO(k)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.