#algorithm #recursion #big-o
Вопрос:
Это мой первый раз, когда я решаюсь выяснить теоретическую сложность моего алгоритма. Я начал с этой полезной ссылки для начинающих, которой поделился с несколькими ответами на этом сайте, чтобы понять сложность рекурсивного алгоритма, но мне нужна дополнительная информация.
В моем случае дополнительные шаги выполняются внутри рекурсивно вызываемой функции F(constants P, 2D matrix N)
:
function F:
For i = 1:N
If i satisfies condition
Save information to a global variable
Continue to i 1
If i does not satisfy condition
M = slicing of matrix N
Call F(constants P, matrix M)
End if
End for
End function
Я думаю , что для глубины рекурсивности k
большая часть рекурсивного алгоритма такова O(k^n)
. Кроме того, я думаю, что каждый вызов функции является O(n)
. Худшим случаем может быть то, что нарезка практически не удаляет какие-либо элементы матриц, так что N
и M
они одинаковы по размеру во всем алгоритме.
В MATLAB нарезка 2D-матриц выполняется с использованием логического индексирования, как описано в документации. Например:
M = N(condition1 amp;amp; condition2,:);
M = N(N(:,1) > 10 amp;amp; N(:,3) - N(:,4) > 20,:);
Как вы объединяете оба понятия в одно выражение?
Комментарии:
1. Можете ли вы добавить здесь некоторые определения? Повторяю ли я матрицу строка за строкой или элемент за элементом? Как работает нарезка M?
2. Я добавил пример и ссылку на документацию в конце. Однако, поскольку я полагаюсь на встроенную логическую индексацию MATLAB, а не сам выполняю нарезку с помощью циклов, я не знаю, достаточно ли эта информация хороша для вопроса.
3. Если когда-нибудь
N==M
у вас будет бесконечная рекурсия.4. Теперь я перефразировал это предложение.
5. Чтобы ответить на этот вопрос, мы должны знать, как работает нарезка. Смотрите комментарий @trincot, если N=M. Если N всегда является матрицей большего размера, чем M, то алгоритм не превышает O(n^4), но это действительно зависит от того, что такое цикл итераций и как выполняется нарезка