Чтобы найти время работы алгоритма, мы должны сначала написать выражение для алгоритма, и это выражение сообщает время выполнения для каждого шага. Поэтому вам нужно пройти каждый шаг алгоритма, чтобы найти выражение. Например, предположим, что мы определили предикат isSorted, который примет в качестве входных данных массив a и размер n массива и вернет true тогда и только тогда, когда массив будет отсортирован в порядке возрастания.
bool isSorted(int *a, int n) {
if (n == 1)
return true; // a 1-element array is always sorted
for (int i = 0; i < n-1; i++) {
if (a[i] > a[i+1]) // found two adjacent elements out of order
return false;
}
return true; // everything's in sorted order
}
Очевидно, что размер ввода здесь будет просто равным n, размер массива. Сколько шагов будет выполнено в худшем случае, для ввода n?
Первое, если на счету заявление как 1 шаг
для цикла будет выполнять N-1 раз в худшем случае (при условии, внутренний тест не пинать нас), на общее время n-1 для теста цикла и приращения индекса.
Внутри цикла есть еще одна инструкция if, которая будет выполняться один раз на итерацию в течение всего n-1 раз, в худшем случае.
Последний возврат будет выполнен один раз.
Таким образом, в самом худшем случае, мы сделали 1+ (п-1) + (п-1) +1
вычисления, для общего времени выполнения Т (п) ≤1 + (n-1) + (n-1) + 1 = 2n, и поэтому мы имеем функцию синхронизации T (n) = O (n).
Так вкратце то, что мы сделали - >>
1 параметры «п», который дает размер входным мы предполагаем, что каждый из простых утверждений, которые выполняются один раз будут принимать постоянное время, для простоты предположим, что один
2. Итеративные утверждения, такие как циклы и внутреннее тело, будут принимать переменное время в зависимости от ввода. Имеет решение T (n) = O (n), как это происходит с нерекурсивной версией.
3.So ваша задача состоит в том, чтобы идти шаг за шагом и записать функцию в терминах п к calulate временной сложности
Для рекурсивных алгоритмов, вы делаете то же самое, только на этот раз, когда вы добавить время принятый каждым рекурсивным вызовом, выраженный как функция времени, которое требуется на его входе. Например, давайте перепишем, isSorted как рекурсивный алгоритм:
bool isSorted(int *a, int n) {
if (n == 1)
return true;
if (a[n-2] > a[n-1]) // are the last two elements out of order?
return false;
else
return isSorted(a, n-1); // is the initial part of the array sorted?
}
В этом случае мы по-прежнему ходить по алгоритму подсчета: 1 шаг для первого, если плюс 1 шаг для второй, если, плюс время isSorted будет принимать входной размер n-1, который будет T (n-1), дающий рекуррентное отношение
T (n) ≤1 + 1 + T (n-1) = T (n-1)) + O (1)
У какой есть решение T (n) = O (n), как это происходит с нерекурсивной версией.
Простой достаточно! Практика Больше, чтобы написать рекуррентное отношение различных алгоритмов, имея в виду, сколько раз каждый шаг будет выполнен в алгоритме
отличный ответ. приятный информация. много спорили :-) –