Учитывая два символа и , давайте определим строку Фибоначчи следующим образом:б к
с обозначающей конкатенацию строк.
Таким образом, мы будем иметь:
- ...
Получая строку , образованный символов, определим Фибоначчи подстроки как любой подстроки из , которая также является строкой Фибоначчи для подходящего выбора и .нa b
Проблема
Учитывая , мы хотим найти его самую длинную подстроку Фибоначчи.
Тривиальный алгоритм
Для каждой позиции строки предположим, что там начинается (достаточно проверить, что и -й символы различны). Если это так, проверьте, можно ли его расширить до , затем и т. Д. После этого начните снова с позиции . Повторяйте, пока не достигнете позиции .S F ( 2 ) i ( i + 1 ) F ( 3 ) F ( 4 ) i + 1 n
Мы должны посмотреть на каждый символ хотя бы один раз, так что это . Здесь задействованы только два цикла for, поэтому мы можем также сказать, что это .O ( n 2 )
Однако (что неудивительно) этот наивный алгоритм работает намного лучше, чем обычные квадратичные алгоритмы (если он выполняет большую работу на позиции, он не будет выполнять большую работу на следующих позициях).
Как я могу использовать свойства Фибоначчи, чтобы найти более точные границы для времени выполнения этого алгоритма?