Оптимизация вложенных циклов for — динамическое программирование

#python #numpy #dynamic-pro&rammin&

#python #numpy #dynamic-pro&rammin&

Вопрос:

Привет, у меня есть простой фрагмент кода, в котором я нахожу длины всех распространенных подпоследовательностей между любыми двумя заданными строками X и Y.

 m = len(X)
n = len(Y)
ACS = np.zeros([m 1, n 1], dtype = int)

#Computes len&ths of ACS(All common substrin&s)

for i in ran&e(m 1):
    for j in ran&e(n 1):
        if X[i - 1] == Y[j - 1]:
            ACS[i][j] = ACS[i - 1][j - 1]   1
        else:
            ACS[i][j] = 0
  

Вложенный цикл прост: всякий раз, когда он находит совпадение между двумя строками с индексом i-1 и j-1, он добавляет 1 к индексу i, j массива ACS, в противном случае заменяет его нулем.

Мой вопрос в том, можно ли это сделать быстрее, используя математические функции numpy?

Комментарии:

1. если вы используете определенный алгоритм, упомяните и это

Ответ №1:

Поскольку вы уже заполняете массив определенного размера m*n , для этого требуется минимум m*n операций. Ваш цикл также выполняется в O(m*n) . Таким образом, оптимизация больше невозможна.

Комментарии:

1. Я думаю, OP знает это и не спрашивает об улучшении временной сложности. Numpy предлагает векторизованные методы, которые оптимизированы не с точки зрения временной сложности, а с точки зрения низкоуровневой скорости (оптимизируйте расположение кэша и памяти, векторизируйте операции и т.д.). Существующие циклы полностью находятся в пространстве CPython и не используют никаких низкоуровневых оптимизаций, поэтому вопрос кажется мне законным.