Анализ трудоёмкости алгоритмов Анализ трудоёмкости алгоритмов позволяет найти оптимальный алгоритм для решения данной задачи. В качестве критерия оптимальности алгоритма берут трудоемкость алгоритма количество элементарных операций, которые необходимо выполнить для решения задачи с помощью данного алгоритма. Функцией трудоемкости называется отношение, связывающие входные данные алгоритма с количеством элементарных операций. Анализ трудоёмкости алгоритмов Трудоёмкость алгоритмов по-разному зависит от входных данных. Для некоторых алгоритмов трудоемкость зависит только от объёма данных, для других алгоритмов — от значений данных, иногда – от порядка поступления данных. Трудоёмкость многих алгоритмов может в той или иной мере зависеть от всех перечисленных выше факторов. Анализ трудоёмкости алгоритмов – асимптотический анализ Это один из упрощенных видов анализа алгоритмов. Целью асимптотического анализа является сравнение затрат времени (и других ресурсов) различными алгоритмами, предназначенными для решения одной и той же задачи, при больших объёмах входных данных. В асимптотическом анализе оценка функции трудоёмкости называется сложность алгоритма. Она позволяет определить, как быстро растет трудоёмкость алгоритма с увеличением объёма данных. Асимптотический анализ В асимптотическом анализе алгоритмов используются обозначения, принятые в математическом асимптотическом анализе. Основной оценкой функции сложности алгоритма f(n) является оценка , где n — величина объёма данных (длина входа). Говорят, что ‘функция g(n) является асимптотически точной оценкой функции f(n) если c1g1(n) ≤ f(n) ≤ c2g2(n) Т.Е. при достаточно больших n f(n) будет заключена между и Оценка функции f(n) Оценка функции f(n) Говорят ещё, что функция g(n) является асимптотически точной оценкой функции f(n), так как по определению функция f(n) не отличается от функции g(n) с точностью до постоянного множителя. дает одновременно верхнюю и нижнюю оценки роста функции. Часто бывает необходимо рассматривать эти оценки по отдельности. Оценка О функции f(n) Оценка О представляет собой верхнюю асимптотическую оценку трудоемкости алгоритма. Запись ‘функция g(n) является верхней асимптотической оценкой функции f(n) f(n) ≤ c g(n) означает, что f(n) принадлежит классу функций, которые растут не быстрее, чем функция g(n) с точностью до постоянного множителя. Оценка О функции f(n) Оценка функции f(n) Оценка задает нижнюю асимптотическую оценку роста функции f(n) и определяет класс функций, которые растут не медленнее, чем g(n) с точностью до постоянного множителя. обозначает класс функций, которые растут не медленнее, чем В этот класс попадают все полиномы со степенью большей единицы, равно как и все степенные функции с основанием большим единицы. Оценка функции f(n) Равенство выполняется тогда и только тогда, когда И Классификация задач по классам сложности Классификация задач по классам сложности – (P-сложные, NP-сложные, экспоненциально сложные и др.). К классу P относятся задачи, которые могут быть решены за время, полиномиально зависящее от объёма исходных данных, с помощью детерминированной вычислительной машины (машины Тьюринга); а к классу NP — задачи, которые могут быть решены за полиномиально выраженное время с помощью недетерминированной вычислительной машины, то есть машины, следующее состояние которой не всегда однозначно определяется предыдущими. История вопроса В начале 1960-х годов в связи с началом широкого использования вычислительной техники для решения практических задач возник вопрос о границах практической применимости данного алгоритма решения задачи в смысле ограничений на ее размерность. Какие задачи могут быть решены на ЭВМ за реальное время? Ответ на этот вопрос был дан в работах Кобмена (Alan Cobham, 1964) и Эдмондса (Jack Edmonds, 1965), в которых были введены классы сложности задач. Класс P (задачи с полиномиальной сложностью) Задача называется полиномиальной (относится к классу P), если существуют константа k и алгоритм, решающий задачу с Fa (n) = O(nk ), где n - длина входа алгоритма. Задачи класса P – это интуитивно задачи, решаемые за реальное время. Отметим следующие преимущества алгоритмов из этого класса: 1. для большинства задач из класса P константа k < 6; 2. класс P инвариантен по модели вычислений (для широкого класса моделей); 3. класс P обладает свойством естественной замкнутости (сумма или произведение полиномов есть полином). Таким образом, задачи класса P - уточнение определения «практически разрешимой» задачи. Класс NP (полиномиально проверяемые задачи) Представим себе, что алгоритм получил решение задачи. Соответствует ли полученный ответ поставленной задаче, и насколько быстро мы можем проверить его правильность? Рассмотрим задачу о сумме: Можно ли представить число V в виде суммы какихлибо элементов массива А? Дано n чисел – А = (a1,…an) и число V. Найти X=(x1,…,xn), xiє{0,1}, чтобы aixi = V. Класс NP (полиномиально проверяемые задачи) Если какой-то алгоритм выдает результат – массив X, то проверка правильности этого результата может быть выполнена с полиномиальной сложностью: проверка aixi = V требует не более Q (n) операций. Содержательно задача относится к классу NP, если ее решение некоторым алгоритмом может быть быстро (полиномиально) проверено. Класс NP (полиномиально проверяемые задачи) Другое определение класса NP: к классу NP относятся задачи, решение которых с помощью дополнительной информации полиномиальной длины, данной нам свыше, мы можем проверить за полиномиальное время. В частности, к классу NP относятся все задачи, решение которых можно проверить за полиномиальное время. Класс P содержится в классе NP. Классическим примером NP-задачи является задача о коммивояжёре. Очевидно, что любая задача, принадлежащая классу P, принадлежит и классу NP, т.к. она может быть полиномиально проверена – задача проверки решения может состоять просто в повторном решении задачи. На сегодня отсутствуют теоретические доказательства как совпадения этих классов (P=NP), так и их несовпадения. Предположение состоит в том, что класс P является собственным подмножеством класса NP, т.е. NP \ P не пустое.