Я шукаю структуру даних, яка зберігає набір рядків над набором символів , здатним виконувати наступні операції. Позначимо , в якості структури даних , що зберігає безліч рядків .D ( S ) S
Add-Prefix-Set
on : заданий деякий набір (можливо, порожніх) рядків, розмір яких обмежений постійною, а довжина рядків обмежена постійною, return . Обидва ці константи є глобальними Обмежуючими: вони однакові для всіх входів .T D ( { t s | t ∈ T , s ∈ S } ) TGet-Prefixes
on : повернення . Зауважте, що я не дуже заперечую, яка структура використовується для цього набору, якщо я можу перерахувати його вміст за час .{ a | a s ∈ S , a ∈ Σ } O ( | Σ | )Remove-Prefixes
on : return .D ( { s | a s ∈ S , a ∈ Σ } )Merge
: задано і , повернути .D ( T ) D ( S ∪ T )
Тепер я дуже хотів би виконати всі ці операції в час, але я добре зі структурою, яка виконує всі ці операції в час, де - довжина найдовшої рядки в будова. У випадку злиття я б хотів час роботи, де - для першої, а - для другої структури.o ( n ) n o ( n 1 + n 2 ) n 1 n n 2 n
Додатковою вимогою є те, що структура є непорушною або, принаймні, що вищезазначені операції повертають "нові" структури такі, що вказівники на старі все ще функціонують як раніше.
Примітка про амортизацію: це нормально, але ви повинні стежити за наполегливістю. Оскільки я повторно використовую старі структури, я буду зазнавати проблем, якщо потрапляю в гіршому випадку з деяким набором операцій над тією ж структурою (так ігноруючи нові структури, які вона створює).
Я хотів би використовувати таку структуру в алгоритмі розбору, над яким я працюю; вищевказана структура містила б потрібний мені алгоритм.
Я вже розглядав питання про використання трійника , але головна проблема полягає в тому, що я не знаю, як ефективно об'єднати спроби. Якщо набір рядків for Add-Prefix-Set
складається з лише односимвольних рядків, то ви можете зберігати ці набори в стеку, що дасть вам час для виконання перших трьох операцій. Однак і цей підхід не працює для злиття.
Нарешті, зауважте, що мене не цікавлять фактори: це постійна для всіх, що мені цікаво.
Add-Prefix-Set
ній)
Add-Prefix-Set
або ви починаєте з довільного набору рядків?