#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 и не используют никаких низкоуровневых оптимизаций, поэтому вопрос кажется мне законным.