Сложность наивного алгоритма нахождения самой длинной подстроки Фибоначчи

10

Учитывая два символа и , давайте определим строку Фибоначчи следующим образом:б кabk

F(k)={bif k=0aif k=1F(k1)F(k2)else

с обозначающей конкатенацию строк.

Таким образом, мы будем иметь:

  • F(0)=b
  • F(1)=a
  • F(2)=F(1)F(0)=ab
  • F(3)=F(2)F(1)=aba
  • F(4)=F(3)F(2)=abaab
  • ...

Получая строку , образованный символов, определим Фибоначчи подстроки как любой подстроки из , которая также является строкой Фибоначчи для подходящего выбора и .нSna bSab

Проблема

Учитывая , мы хотим найти его самую длинную подстроку Фибоначчи.S

Тривиальный алгоритм

Для каждой позиции строки предположим, что там начинается (достаточно проверить, что и -й символы различны). Если это так, проверьте, можно ли его расширить до , затем и т. Д. После этого начните снова с позиции . Повторяйте, пока не достигнете позиции .S F ( 2 ) i ( i + 1 ) F ( 3 ) F ( 4 ) i + 1 niSF(2)i(i+1)F(3)F(4)i+1n

Мы должны посмотреть на каждый символ хотя бы один раз, так что это . Здесь задействованы только два цикла for, поэтому мы можем также сказать, что это .O ( n 2 )Ω(n)O(n2)

Однако (что неудивительно) этот наивный алгоритм работает намного лучше, чем обычные квадратичные алгоритмы (если он выполняет большую работу на позиции, он не будет выполнять большую работу на следующих позициях).i

Как я могу использовать свойства Фибоначчи, чтобы найти более точные границы для времени выполнения этого алгоритма?

wil93
источник

Ответы:

5

Скажем, что встречается в некоторой позиции, если подстрока, начинающаяся в этой позиции, совместима либо с либо с ее дополнением. Насколько близко могут быть вхождения ? Возьмите в качестве примера . Если возникает в позиции то она не может появляться в позиции или , но она может появляться в позиции . Мы допустим наименьшее число, такое, что два вхождения могут произойти на расстоянии . Вы можете по индукции доказать, что для имеемF ( n ) F ( n ) F ( 4 ) = a b a a b F ( 4 ) p p + 1 p + 2 p + 3 ( n ) F ( ) n 4 ( n ) = | F ( n - 1 ) |F(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2p+3(n)F()n4(n)=|F(n1)|(например, ).(4)=3

Для заданной строки длины для каждого пусть будет набором позиций, в которых встречается . Мы можем ограничить время выполнения вашей процедуры примерно какгде сумма пробегает все такие, что (скажем). Поскольку вхождения разделены как минимуммы видим, что время выполнения ограничено порядком Поскольку длины слов Фибоначчи экспоненциально растут, . Оставшийся членn P ( n ) F ( n ) n | P ( n ) | | F ( n ) | п | F ( n - 1 ) | N F ( n ) | F ( n - 1 ) | n | F ( n ) | ( NNnP(n)F(n)n|P(n)||F(n)|n|F(n1)|NF(n)|F(n1)|n| F(n)| =O(N)nO(N)=O(NlogN)logNO(NlogN)

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN), так как сумма содержит много членов. Мы заключаем, что время выполнения .logNO(NlogN)

Наоборот, время выполнения на равно , что можно доказать по индукции. Мы заключаем, что наихудшее время выполнения для строк длины - это . Ω ( | F n | log | F n | ) N Θ ( N log N )FnΩ(|Fn|log|Fn|)NΘ(NlogN)

Юваль Фильмус
источник