Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vremja_vypolnenija_programm.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
90.62 Кб
Скачать

Время выполнения программ.

Введение.

В процессе решения прикладных задач выбор подходящего алгоритма вызывает определенные сложности. С одной стороны, алгоритм должен быть простым для понимания, перевода в программный код и отладки. С другой стороны, должен эффективно использовать программные ресурсы и выполняться по возможности быстро.

Если написанная программа должны выполняться всего несколько раз, то первое требование более важно. Стоимость рабочего времени программиста обычно значительно превышает стоимость машинного времени выполнения программы. Если же имеется задача, решение которой требует значительных вычислительных затрат, то стоимость выполнения программы может превысить стоимость написания программы, особенно если программа должна выполняться неоднократно. Таким образом, необходимо иметь представление не только о методах построения алгоритмов, но и о том, когда и какие алгоритмы следует применять.

Не существует однозначного ответа на вопрос, что из себя представляет хороший алгоритм. Одна из важных оценок работы алгоритма - временная сложность или время выполнения алгоритма. Под временной сложностью (временем выполнения) понимается число элементарных шагов (инструкций) алгоритма, которые необходимо выполнить алгоритму, чтобы достичь запланированного результата. Часто разница между «медленным» и «быстрым» алгоритмом более существенна, чем между быстрым и медленным компьютером.

Пример. Пусть необходимо отсортировать массив из миллиона чисел. Имеется два алгоритма: один для сортировки n чисел требует выполнения операций, другой - операций. И пусть имеется два компьютера: более быстрый выполняет 108 операций в секунду, более медленный – 106 операций.

Для сортировки миллиона чисел плохим алгоритмом на быстром компютере получаем:

=20000 секунд5,56 часов

и всего

1000секунд17 минут

для хорошего алгоритма, выполняемого на более медленном компьютере.

Будем говорить, что время выполнения программы имеет порядок T(n) от входных данных размера n. Например, некая программа имеет время выполнения T(n)=cn2, где c – константа. В том случае, когда время выполнения является функцией входных данных (а не размера), T(n) определяется как время выполнения в наихудшем случае, т.е. как максимум времени выполнения по всем входным данным размера n. Также рассматривается среднее время выполнения по всем входным данным размера n. На практике среднее время найти значительно сложнее, чем наихудшее, так как, во-первых, это математически трудноразрешимая задача, а во-вторых, зачастую не имеет определение понятие «средних» входных данных.

Заметим еще, что константы пропорциональности зависят от компилятора, компьютера и других факторов.

Асимптотические соотношения

Далее предполагается, что все функции время выполнения определены на множестве неотрицательных чисел и их значения также неотрицательны, но необязательно целые.

Опр.1. Будем говорить, что T(n) имеет порядок O(f(n)), если существуют константы c и n0 такие, что для всех n n0 выполняется неравенство T(n)с f(n).

Для программ, у которых время выполнения имеет порядок O(f(n)), говорят, что они имеют порядок (или степень) роста f(n).

Запись О(1) означает «равнозначно некой константе».

Пример.

Пусть T(0)=1, T(1)=4, T(n)=(n+1)2 для n>1.

Положим n0=1, с=4, тогда:

(n+1)2=n2+2n+14n2 для n1, то есть T(n) имеет порядок O(n2)

Задание

Показать, что

1. T(n)=3n3+2n2 имеет порядок O(n3)

2. 17 имеет порядок О(1)

3. n(n-1)/2 имеет порядок O(n2)

Когда мы говорим, что T(n) имеет степень роста f(n), то подразумевается, что f(n) является верхней границей скорости роста T(n). Чтобы указать нижнюю границу скорости роста T(n) используется обозначение (g(n)).

Опр.2. Будем говорить, что T(n) есть (g(n)), если существуют константы c и n0 такие, что для всех n n0 выполняется неравенство T(n)с g(n).

Пример.

T(n)=3n3+2n2 есть (n3). Действительно, 3n3+2n2 n3 для n=0,1,2,…, т.е. c=1.

Запись T(n)=(f(n)) включает в себя две оценки: верхнюю и нижнюю.

Опр 3. Будем говорить, что T(n) есть (f(n)), если существуют константы c1, c2 и n0 такие, что для всех n n0 выполняется неравенство c1 f(n)T(n) c2 f(n). В этом случае f(n) является асимптотически точной оценкой для T(n).

Это определение симметрично для функций T(n) и f(n), т.е., если T(n) есть (f(n)), то f(n) есть (T(n)).

Замечание.

Отыскивая асимптотически точную оценку для суммы, можно отбрасывать члены меньшего порядка, которые при больших n становятся малыми по сравнению с остальными слагаемыми. Коэффициент при старшем члене роли не играет: он может повлиять только на выбор констант c1, c2.

Например, рассмотрим квадратичную функцию f(n)=an2+bn+c, где a,b,c – некоторые константы, a>0. Отбрасывая члены младших порядков и коэффициент при старшем члене, находим, что f(n)= (n2). Чтобы убедиться в этом формально, можно положить , , (проверить, что эти требования действительно выполнены).

Вообще говоря, для любого полинома p(n) степени d с положительным старшим коэффициентом имеем p(n)=(nd).

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