Чи можна використовувати дерева Suffix для пошуку всіх загальних рядків?


10

Я намагаюся використовувати дерева суфіксів для порівняння послідовностей рядків. Я знайшов реалізацію / теорію для найдовшої поширеної проблеми підрядків із використанням суфіксних дерев. Однак те, що я шукаю, - це обговорення пов’язаної проблеми - "всі загальні підрядки". Зокрема, у мене є проблема, в якій мені потрібно спершу знайти найдовшу загальну підрядку, потім знайти наступну найдовшу загальну підрядку, яка не включає вже знайдені індекси lcs, і так далі до мінімальної довжини. Чи вирішується ця проблема, побудувавши узагальнене дерево суфіксів (GST) лише один раз для двох послідовностей. Я знаю, що це можна вирішити, повторно будуючи GST після кожної ітерації пошуку та видалення LCS. Але мені цікаво, чи пропускаю я акуратний трюк, де в GST будується лише один раз.


Це цікаве питання. Проблема полягає в тому, що якщо у нас і ми виявили, що β є WS LCS T , ми не можемо легко "видалити" β з дерева суфіксів (або суфіксного масиву, як би там не було). Ми хотіли б мати щось на зразок S = α $ γ після першого кроку, правда? S=αβγβTβS=α$γ
Дмитро Кордубан

Відповіді:


3

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

Дан текстовий , суфіксний масив для S - це масив цілих чисел діапазону від 0 до n із зазначенням лексикографічного впорядкування n + 1 суфіксів рядка S $S=s1,...,snS0nn+1S

Ми хочемо поєднати суфіксний масив з , найдовшими загальними префіксами. Ми можемо побудувати масив L C P s у лінійному часі, як згадується у статті Kasai et al . Масиви суфіксів та їх масиви lcp поєднуються разом таким чином, що заданий індекс у масиві lcp скаже l c p [ k ], де k - номер індексу, тоді s a [ k ] буде початком одного екземпляра загального підряд і s a [ k - 1 ]LCPsLCPslcp[k]ksa[k]sa[k1]буде початковим індексом другої інстанції. Звичайно, довжина - це значення в масиві lcp.


3

У мене є ідея, яка може спрацювати. Почну з узагальненим деревом суфіксів для послідовностей і T . Кожен внутрішній вузол із суфіксами S і T у своєму піддереві відповідає деякій загальній підрядковій послідовності. Назвемо такі вузли нетривіальними. Загальна підрядок є максимальною, якщо у відповідному вузлі немає нетривіальних дітей. Якщо вузол v нетривіальний, ми зберігаємо найбільшу глибину рядка нетривіального вузла в його піддереві як l c s ( v ) . Якщо r - корінь, то l c s ( r )STSTvlcs(v)rlcs(r)довжина найдовшої загальної підрядка і T .ST

vkkk<lcs(v)klcs(v), ми робимо, як нас не цікавлять підтрубки з тривіальними коренями.

ST

Є деякі технічні характеристики, але загальна ідея повинна спрацювати.


0

Почніть з каскадним текстом S $ T , де $ не відбувається ніде в * або Т . Побудуйте з цього тексту суфіксне дерево / масив. Зараз легко пройти цю суфіксну структуру даних, щоб зібрати всі правильні максимальні повтори. Вивчаючи лівий контекст, відфільтруйте неліві максимальні повтори. Ця ліва фільтрація може бути реалізована за допомогою таблиці Burrow-Wheeler, як у Abouelhoda та ін., Хоча я не вважаю, що це необхідно. Повторення, що виникають тільки в S або тільки в Tякщо це також має бути усунене. Повтори, які не були ліквідовані, потім ставляться в чергу пріоритетів, пріоритет визначається довжиною. Після обходу, коли записані повтори будуть видалені з пріоритету, може бути проведена остаточна фільтрація (для стримування підрядків). Однак, маючи на увазі використання максимальних фраз, я підозрюю, що дуже мало цього фільтрування буде необхідним.

Цей алгоритм - це власний винахід. Я б не вважав це дуже розумним, але це повинно працювати.


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