Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб1АиАС.doc
Скачиваний:
182
Добавлен:
13.04.2015
Размер:
169.47 Кб
Скачать
    1. 3.4. Вычисление временной сложности

Теоретическое нахождение времени выполнения программ (даже без определения констант пропорциональности) — сложная математическая задача. Однако на практике определение времени выполнения (также без нахождения значения констант) является вполне разрешимой задачей – для этого нужно знать только несколько базовых принципов.

1. При оценке за функцию берется количество операций, возрастающее быстрее всего.То есть, если в программе одна функция, например, умножение, выполняетсяO(n)раз, а сложение –O(n2)раз, то общая сложность программы –O(n2), так как в конце концов при увеличенииnболее быстрые ( в определенное, константное число раз) сложения станут выполнятся настолько часто, что будут влиять на быстродействие куда больше, нежели медленные, но редкие умножения. Это принцип обуславливаетправило сумм асимптотических соотношений.ПустьT1(n) иТ2(п) — время выполнения двух программных фрагментовР1 иР2, T1(n) имеет степень ростаO(f(n)), аТ2(п) O(g(n)). ТогдаТ1(п) +Т2(п), т.е. время последовательного выполнения фрагментовР1 иР2, имеет степень ростаO(max(f(n), g(n))).

2. При оценке O( ) константы не учитываются.Пусть один алгоритм делает2500n + 1000операций, а другой –2n+1. Оба они имеют оценкуO(n), так как их время выполнения растет линейно.Этот принцип является следствием правила произведений, которое заключается в следующем. Если T1(n) и Т2(п) имеют степени роста O(f(n)) и O(g(n)) соответственно, то произведение T1(n)T2(n) имеет степень роста O(f(n)g(n)).

3.Другое следствие опускания константы – алгоритм со временемO(n2)может работать значительно быстрее алгоритмаO(n)при малыхn. За счет того, что реальное количество операций первого алгоритма может бытьn2 + 10n + 6, а второго –1000000n + 5. Впрочем, второй алгоритм рано или поздно обгонит первый.n2растет куда быстрее1000000n.

4.Основание логарифма внутри символа O( ) не пишется.Причина этого весьма проста. Пусть у нас естьO(log2n). Ноlog2n=log3n/log32, аlog32, как и любую константу, асимптотика – символО( )не учитывает. Таким образом,O(log2n)=O(log3n). К любому основанию мы можем перейти аналогично, а значит и писать его не имеет смысла.

Теперь дадим несколько правил анализа программ. В общем случае время выполнения оператора или группы операторов можно параметризовать с помощью размера входных данных и/или одной или нескольких переменных. Но для времени выполнения программы в целом допустимым параметром может быть только n, размер входных данных.

1. Время выполнения оператора присваивания складывается из времени вычисления выражения и времени выполнения операции присваивания. Если выражение не содержит вызовов функций (в том числе перегруженных операций), то на его вычисление тратится некоторое постоянное время. Операция присваивания так же требует некоторого постоянного времени. Таким образом, время выполнения операторов присваивания обычно имеет порядок О(1).

2. Время выполнения операторов ввода – вывода обычно имеет порядок О(1).

3. Время выполнения последовательности операторов определяется с помощью правила сумм. Поэтому степень роста времени выполнения последовательности операторов без определения констант пропорциональности совпадает с наибольшим временем выполнения оператора в данной последовательности.

4. Время выполнения условных операторов состоит из времени выполнения условно исполняемых операторов и времени вычисления самого логического выражения. Время вычисления логического выражения обычно имеет порядок O(1). Время для всей конструкции if-then-else состоит из времени вычисления логического выражения и наибольшего из времени, необходимого для выполнения операторов, исполняемых при значении логического выражения true (истина) и при значении false (ложь).

5. Время выполнения цикла является суммой времени всех исполняемых итераций цикла, в свою очередь состоящих из времени выполнения операторов тела цикла и времени вычисления условия прекращения цикла (обычно последнее имеет порядок O(1)). Часто время выполнения цикла вычисляется, пренебрегая определением констант пропорциональности, как произведение количества выполненных итераций цикла на наибольшее возможное время выполнения операторов тела цикла. Время выполнения каждого цикла, если в программе их несколько, должно определяться отдельно.

6. Для программ, содержащих несколько процедур или функций (среди которых нет рекурсивных), можно подсчитать общее время выполнения программы путем последовательного нахождения времени выполнения этих подпрограмм, начиная с той, которая не имеет вызовов других процедур или функций. Так как мы предположили, что все подпрограммы нерекурсивные, то должна существовать хотя бы одна подпрограмма, не имеющая вызовов других процедур или функций. Затем можно определить время выполнения подпрограмм, вызывающих эту подпрограмму, используя уже вычисленное время выполнения вызываемой подпрограммы. Продолжая этот процесс, найдем время выполнения всех подпрограмм и, наконец, время выполнения всей программы.

7. Если есть рекурсивные процедуры или функции, то нельзя упорядочить все подпрограммы таким образом, чтобы каждая подпрограмма вызывала только процедуры или функции, время выполнения которых подсчитано на предыдущем шаге. В этом случае мы должны с каждой рекурсивной процедурой (функцией) связать временною функцию Т(n), где n определяет объем ее аргументов. Затем мы должны получить рекуррентное соотношение для T(n), т.е. уравнение (или неравенство) для Т(п), где участвуют значения T(k) для различных значений k<n.

Общий метод решения таких рекуррентных соотношений состоит в последовательном раскрытии выражений Т(к) в правой части уравнения (путем подстановки в исходное соотношение k вместо n) до тех пор, пока не получится формула, у которой в правой части отсутствует Т. При этом часто приходится находить суммы различных последовательностей; если значения таких сумм нельзя вычислить точно, то для сумм находятся верхние границы, что позволяет, в свою очередь, получить верхние границы для Т(n).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]