Эффективный подсчет всех подстрок в отсортированном порядке

Вам дается строка, которая определяет частоту всех отсортированных подстрок (в порядке убывания) в соответствии с их частотой.

Например: ababa {"a", "b", "a", "b", "a", "ab", "ba", "ab", "ba", "aba", "bab", "aba" "," абаб "," баба "," абаба "}.

вывод:

3,2,2,2,2,1,1,1,1

объяснение

3 a 2 b 2 ba 2 aba 2 ab 1 abab 1 baba 1 ababa 1 bab

решение

1) одно очевидное решение - сохранить всю строку в хеш-карте и подсчитать ее частоту, но для сравнения потребуется o (n ^ 3logn) O (n ^ 2 * n) {n ^ 2 номер подстроки * O (n) of string * logn (поскольку карта поддерживается как красно-черное дерево)} 2) Вставить всю подстроку в троичное дерево поиска, затем получить частоту каждой подстроки, затем отсортировать частоту O (n ^ 3 logn)

Мне интересно, существует ли решение O (n ^ 2) или O (nlogn).

вот так http://www.quora.com/Given-a-string-how-do-I-find-the-number-of-distinct-substrings-of-the-string


person nil96    schedule 09.06.2015    source источник


Ответы (1)


Решение O (n ^ 2) может быть получено таким образом:

  1. Вставьте все подстроки в дерево. Это можно сделать за O (n ^ 2).

  2. Получите все частоты и отсортируйте их. Обратите внимание, что частота любой подстроки может быть только в диапазоне [0, n], поэтому сортировка по корзине может иметь все числа, отсортированные за O (n ^ 2), поскольку в худшем случае будет n ^ 2 чисел.

person lavin    schedule 09.06.2015
comment
Есть O (n ^ 2) подстрок размера O (n). Их вставка в дерево - O (n ^ 3). - person amit; 09.06.2015
comment
Но подстроки инкрементные. поэтому для abc вставка ab abc занимает всего 3 операции с деревом, а не 1 + 2 + 3 - person lavin; 09.06.2015
comment
Тогда он не вставляет подстроки O (n ^ 2) в дерево, это что-то еще, если вы хотите использовать тот факт, что они являются инкрементными. Я не утверждаю, что это невозможно, я утверждаю, что это не вставка в черный ящик подстрок O (n ^ 2). - person amit; 09.06.2015