#algorithm #time-complexity #big-o #complexity-theory
#алгоритм #временная сложность #big-o #сложность -теория
Вопрос:
Существует три вложенных цикла for, и я могу найти сложность, если цикл увеличивается на 1, но если цикл увеличивается так i = c, я запутался?
for (int i = 0; i < n; i =c)
for (int j = 0; j < i; j )
for (int k=0; k < m; k )
result[i,j]= x[j]-y[k]
Сложность третьего цикла for равна m, но для первого цикла for, я думаю, равно n / c, а для второго цикла for равно n ==> умножьте диапазоны вместе: n / c * n * m = n ^ 2 / c * m ==> наихудший случай — O (n ^ 2). это правильно?
Как найти общее количество итераций, используя форму суммы?
Комментарии:
1. Что такое m? Это длина массива?
2. Да, m и n — это длина двух разных массивов
Ответ №1:
В вашем случае временная сложность зависит от двух параметров: m
и n
как средний цикл может быть выражен как функция первого.
Если учесть общее количество итераций, они имеют порядок:
1/2 * m * n * (n-1) = O(mn^2)
Левая часть предполагает c=1
. Однако, учитывая c
как константу, общая временная сложность не изменится.
Если c не задан как константа, результирующая временная сложность будет O(mn^2)/c
Комментарии:
1. Я думаю, вы должны разделить это на
c
из-заi = c
2. Спасибо за вашу помощь. Мое замешательство было связано с частью c, и я видел здесь много примеров, если i = 2, сложность будет n / 2. c будет иметь разные значения при каждом запуске программы.
3. но если n ^ 2 является доминирующим, должен ли я включать его только в нотацию big O или должен включать все переменные O (mn ^ 2 / c) ?!
4. Зависит от того, есть ли у вас дополнительная информация
m
, и вы можете ее охарактеризовать. Например, еслиm=O(n^2)
иc=O(1)
тогда это становитсяO(n^4)
, но если у вас нет никакой информации об этом, тогда вам следует уйти, так как временная сложность также зависит от этого, являясь частью ввода.5. Большое вам спасибо за разъяснения.