Сообщение Re[2]: Принудительный выход из рекурсии в случае, если ответ от 21.11.2020 18:57
Изменено 21.11.2020 19:16 Буравчик
Re[2]: Принудительный выход из рекурсии в случае, если ответ
Если функцию is_merge закэшировать, то получим рекурсию + динамику.
Это гарантирует максимальное время работы за O(N^2) от длины строки
Потребляемую память можно уменьшить, если оперировать индексами (позициями символов), а не целыми строками
Это гарантирует максимальное время работы за O(N^2) от длины строки
from functools import lru_cache
@lru_cache()
def is_merge(s, part1, part2):
if part1 == '':
return s == part2
if part2 == '':
return s == part1
if s == '':
return False
return s[0] == part1[0] and is_merge(s[1:], part1[1:], part2) or s[0] == part2[0] and is_merge(s[1:], part1, part2[1:])
Потребляемую память можно уменьшить, если оперировать индексами (позициями символов), а не целыми строками
Re[2]: Принудительный выход из рекурсии в случае, если ответ
Если функцию is_merge закэшировать, то получим рекурсию + динамику.
Это гарантирует максимальное время работы за O(N^2) от длины строки
Потребляемую память можно уменьшить, если оперировать индексами (позициями символов), а не целыми строками
ДОБАВЛЕНО:
Вообще, т.к. в кэш передаются полные строки (длины N), то полная сложность здесь будет O(N^3)
Но если работать с индексами, то получим обозначенные O(N^2)
Это гарантирует максимальное время работы за O(N^2) от длины строки
from functools import lru_cache
@lru_cache()
def is_merge(s, part1, part2):
if part1 == '':
return s == part2
if part2 == '':
return s == part1
if s == '':
return False
return s[0] == part1[0] and is_merge(s[1:], part1[1:], part2) \
or s[0] == part2[0] and is_merge(s[1:], part1, part2[1:])
Потребляемую память можно уменьшить, если оперировать индексами (позициями символов), а не целыми строками
ДОБАВЛЕНО:
Вообще, т.к. в кэш передаются полные строки (длины N), то полная сложность здесь будет O(N^3)
Но если работать с индексами, то получим обозначенные O(N^2)