Пытаюсь вычислить время выполнения моей функции
У меня есть этот код python для поиска самой длинной подстроки. Я пытаюсь вычислить асимптотическое время его выполнения, и я пришел к ответу, но я не уверен, что это правильно. Вот код:
def longest_substring(s, t):
best = ' '
for s_start in range(0, len(s)):
for s_end in range(s_start, len(s)+1):
for t_start in range(0, len(t)):
for t_end in range(t_start, len(t)+1):
if s[s_start:s_end] == t[t_start:t_end]:
current = s[s_start:s_end]
if len(current) > len(best):
best = current
return best
Очевидно, что эта функция имеет очень медленное время выполнения. Именно так все и было задумано. Мой подход состоял в том, что поскольку существует цикл for с еще 3 вложенными циклами for, время выполнения примерно равно O(n^4). Я не уверен, что это правильно, потому что не каждый цикл повторяется над входом размер. Кроме того, предполагается, что s = t = n(входной размер). Есть идеи?1 ответ:
Если вы не уверены, что это O(n^5), попробуйте вычислить, сколько петель вы проходите только для строки
s
(т. е. внешние две петли). Когдаs_start == 0
, внутренний цикл выполняетсяn + 1
раз; когдаs_start == 1
, внутренний цикл выполняетсяn
раз, и так далее, покаs_start = n - 1
, для которого внутренний цикл выполняется дважды.Сумма
(n + 1) + (n) + (n - 1) + ... + 2
- арифметический ряд, для которого формула
((n + 1) + 2) * n / 2
, что означает O (n^2).
Дополнительный фактор n исходит из
s[s_start:s_end] == t[t_start:t_end]
, который является O(n).