Выделить не менее N одинаковых подстрок в строке
От: chukichuki  
Дата: 29.01.08 15:04
Оценка:
Созрел вопрос в свете предыдущего. Исходные данные:
n — число, >0
S — строка

Требуется найти в строке S такую подстроку максимально возможной длины, которая в S встречается не менее N раз.
Например:

S= "abcdxbcdfffbcd"
n = 2

Результат: подстрока "bcd". Встречается 3 раза.

По идее задачка, возникающая при разработке архиваторов и чего-то похожего, но решения на вскидку не нашел. Может кто знает куда копать ?
Re: Выделить не менее N одинаковых подстрок в строке
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 29.01.08 16:05
Оценка: +1
Ternary tree, suffix tree, suffix array.
Re[2]: Выделить не менее N одинаковых подстрок в строке
От: chukichuki  
Дата: 29.01.08 18:47
Оценка:
Здравствуйте, D. Mon, Вы писали:

DM>Ternary tree, suffix tree, suffix array.


Спасибо, я примерно в этом направлении и думал.
Re[3]: Выделить не менее N одинаковых подстрок в строке
От: Mab Россия http://shade.msu.ru/~mab
Дата: 29.01.08 20:21
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Спасибо, я примерно в этом направлении и думал.

Правильно. Задача элементарно решается с помощью suffix tree за линейное время. Самое трудное -- построить его.
Re[4]: Выделить не менее N одинаковых подстрок в строке
От: chukichuki  
Дата: 30.01.08 06:42
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, chukichuki, Вы писали:


C>>Спасибо, я примерно в этом направлении и думал.

Mab>Правильно. Задача элементарно решается с помощью suffix tree за линейное время. Самое трудное -- построить его.

Как я понимаю в худшем случае (для строки вроде 'abcde....z') получится n суфиксных деревьев. Первое дерево будет представлять собой список a->b->c->d-> ... ->z
второе b->c->d->...->z, тертье с->d->...->z и т.д. В случае если в строке будут повторяющиеся последовательности, то число деревьев будет уменьшаться.
Re[5]: Выделить не менее N одинаковых подстрок в строке
От: Mab Россия http://shade.msu.ru/~mab
Дата: 30.01.08 06:44
Оценка:
Здравствуйте, chukichuki, Вы писали:

C>Как я понимаю в худшем случае (для строки вроде 'abcde....z') получится n суфиксных деревьев.

В каком смысле? Каждой строке соответствует единственное суффиксное дерево. Никаких n там получиться не может. Если все символы разные, то устроено оно будет так: корень, из которого растут n дуг (каждая помечена соответствующим суффиксом).
Re[6]: Выделить не менее N одинаковых подстрок в строке
От: chukichuki  
Дата: 30.01.08 07:21
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, chukichuki, Вы писали:


C>>Как я понимаю в худшем случае (для строки вроде 'abcde....z') получится n суфиксных деревьев.

Mab>В каком смысле? Каждой строке соответствует единственное суффиксное дерево. Никаких n там получиться не может. Если все символы разные, то устроено оно будет так: корень, из которого растут n дуг (каждая помечена соответствующим суффиксом).

Пример — пусть имеем строку 'abcadbс', в ней встречаются символы 'a','b','c','d'. Тогда возможны подстроки, начинающиеся с 'a', c 'b', c 'c' и с 'd'. Все возможные подстроки представляем в виде суфиксных деревьев.


Подстроки начинающиеся с буквы 'a'

a -> b -> c -> a -> d -> b -> c
     | -> d -> b -> c

Подстроки начинающиеся с буквы 'b'

b -> c -> a -> d -> b -> c
  
Подстроки начинающиеся с буквы 'c'

c -> a -> d -> b -> c

Подстроки начинающиеся с буквы 'd' 

d -> b -> c
Re[7]: Выделить не менее N одинаковых подстрок в строке
От: chukichuki  
Дата: 30.01.08 07:24
Оценка:
Ощибся


Подстроки начинающиеся с буквы 'a'

a -> b -> c -> a -> d -> b -> c
| -> d -> b -> c
Re[6]: Выделить не менее N одинаковых подстрок в строке
От: chukichuki  
Дата: 30.01.08 08:34
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, chukichuki, Вы писали:


C>>Как я понимаю в худшем случае (для строки вроде 'abcde....z') получится n суфиксных деревьев.

Mab>В каком смысле? Каждой строке соответствует единственное суффиксное дерево. Никаких n там получиться не может. Если все символы разные, то устроено оно будет так: корень, из которого растут n дуг (каждая помечена соответствующим суффиксом).

Перепутал с префиксным деревом
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.