Ну, как @jogojapan говорит, чтобы получить [2..m] дерево S из [1..m] дерево S нам нужно:
- Найти позиционно-0 лист L.
- Если L имеет более чем один родной брат, удалить указатель из L 'родителя s к L
- Если L имеет ровно один родственный, изменить указатель из L' s прародителей к L Родитель, а вместо этого указывает на L. Sibling.
@jogojapan далее предполагает, что вы храните указатель на самый глубокий лист в дереве. Есть две проблемы с этим: L не обязательно является самым глубоким листом в дереве, как Wikipedia's example shows, а во-вторых, если вы хотите иметь возможность выводить тот же тип структуры данных, что и вы, после удаления L вы нужно найти новый-0 лист, который в любом случае займет время O (m).
(Что вы можете сделать, так это построить массив указателей на каждый лист в O (m) времени и подсчета - отсортировать их по положению в другое время O (m). Тогда вы сможете построить все деревья {S [t..n]: 1 < = т < = т} в постоянном амортизационной времени каждый)
Предполагая, что вы не заинтересованы в амортизационной времени, хотя, давайте доказывать, что вы просите, невозможно.
- Мы знаем, что любой алгоритм для изменения дерева суффиксов S [1..m] должен начинаться с корня: он не может начинаться нигде, потому что мы ничего не знаем о базовой структуре конкретных данных, и мы надеемся, Не знаю, что в узлах дерева есть родительский указателей, поэтому единственной позицией, доступной для всего дерева, является корень.
- Мы также знаем, что он должен найти лист позиции-0, прежде чем он сможет надеяться изменить структуру данных в дереве суффиксов для S [2..m]. Для этого он должен, очевидно, пересекать каждый узел между корнем и листом position-0.
- Вещи, рассмотрит суффикс дерево а^м (характер повторил м раз): длина пути составляет м-1. Таким образом, любой алгоритм должен посещать не менее м-1 узлов и, следовательно, принимать O (m) время в худшем случае.
Я думаю, нет. В основном нам нужно удалить строку [1..m] в дереве суффиксов S [1..m].Что заставляет вас думать, что существует алгоритм постоянной временной сложности? – Faraway
Если я не ошибаюсь, трудно определить, какой листовой узел соответствует 'S [1..m]'. Как только у вас есть лист, я думаю (но не попытался фактически записать доказательство), что удаление этого листа и (если необходимо) внутренний узел, который указывает на него, должен быть O (1). Поиск листа - O (m), но вы можете использовать O (1) дополнительное пространство для сохранения указателя на самый глубокий лист в дереве, что уменьшит время нахождения листа до O (1). После удаления листа вам придется обновить этот указатель, но это можно сделать в O (1), если вы имеете суффиксные ссылки в дереве. – jogojapan
Алгоритм Укконена достиг сложности O (n), построив дерево суффикса слева направо. Алгоритмы до этого строят его справа налево, и все не удалось достичь O (n). Поэтому я не думаю. –