Суфіксальне дерево і пробує. Яка різниця?


81

Я читаю про Triesзагальновідомі дерева префіксів і Suffix Trees.
Хоча я знайшов код для a, Trieя не можу знайти приклад для a Suffix Tree. Також у мене виникає відчуття, що код, який будує a Trie, такий самий, як і код a, Suffix Treeз тією лише різницею, що в першому випадку ми зберігаємо префікси, а в останньому суфікси.
Це правда? Хтось може допомогти мені це зрозуміти в голові? Приклад коду буде дуже корисним!


1
TL; DR Суфіксальне дерево рядка - це триє патриції всіх його суфіксів. Єдине, що є особливим у цьому, це те, що мітки країв є підрядками вихідного рядка, тому вони можуть бути представлені у вигляді пари індексів і займати лише постійний простір. Ось чому його можна побудувати за лінійний час.
Ніклас Б.

Відповіді:


66

Дерево суфіксів можна розглядати як структуру даних, побудовану поверх тріату, де замість того, щоб просто додавати сам рядок у триє, ви також додаєте всі можливі суфікси цього рядка. Як приклад, якщо ви хочете проіндексувати рядок banana у суфіксальному дереві, ви побудуєте триє з такими рядками:

banana
anana
nana
ana
na
a

Після цього ви можете шукати будь-який n-грам і перевіряти, чи є він у вашому індексованому рядку. Іншими словами, пошук n-грамів - це пошук за префіксом усіх можливих суфіксів вашого рядка.

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

Ця відповідь також чудово спрацьовує варіант цієї структури даних.


Це те, про що я підозрював. Trie використовується для побудови дерева суфіксів, і тому більшість підручників містять лише код для спроб. Але це найгірший варіант реалізації?
Кратіл

Суфіксальні дерева @Cratylus є найбільш корисними на дуже великих рядках (наприклад, індексація всіх творів Шекспіра), де O (n ^ 2) простір і час побудови просто не збираються його скорочувати. На щастя, ці межі можна трохи знизити.
Ze Blob

8

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

Але використовуючи цей наївний підхід, побудова цього дерева для рядка розміром n буде O (n ^ 2) і займе багато пам'яті.

Оскільки всі записи цього дерева є суфіксами одного рядка, вони діляться великою кількістю інформації, тому існують оптимізовані алгоритми, що дозволяють створювати їх ефективніше. Наприклад, алгоритм Укконена дозволяє створити дерево суфіксів в Інтернеті за час складності O (n).


2
Отже, ви говорите, що суфіксальні дерева та спроби суфіксів однакові?
бетмен

1

Різниця дуже проста. Дерево суфіксів має менше "фіктивних" вузлів, ніж суфікс трие. Ці фіктивні вузли - це одинарні символи, які збільшують операцію пошуку в дереві


0

Вузли Trie мають посилання на коротший контекст, у 'Tree' його немає. Якщо вузли дерева отримують посилання на коротший контекст, тоді воно переходить на Trie; o)

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