Информация об изменениях

Сообщение Re[2]: Принудительный выход из рекурсии в случае, если ответ от 21.11.2020 18:57

Изменено 21.11.2020 19:16 Буравчик

Re[2]: Принудительный выход из рекурсии в случае, если ответ
Если функцию is_merge закэшировать, то получим рекурсию + динамику.
Это гарантирует максимальное время работы за 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) от длины строки

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)