Урок №2

Урок №2 "Эффективность алгоритмов"

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

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

Для обоснованного использования времени и памяти вычислительной машины необходим теоретический и эмпирический анализ эффективности.

На практике приходится довольствоваться приближенным решением задачи и мириться с элементами неопределенности в решении. Как правило, точно решаются только задачи с конечным числом входных и выходных данных, допускающих конечное представление. Можно выделить две причины, по которым ограничиваются приближенным решением: либо задачу невозможно решить точно, либо точное решение не нужно. Невозможность получить точное решение может объясняться тем, что:

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

- информация приближенная, которая может появиться в результате многих причин, в том числе ошибок ЭВМ, ошибок при передаче данных, ограниченной точности представления и обработки чисел, ограничений на точность измерений;

- ограничен класс допустимых алгоритмов.

Большинство реальных задач приходится решать, располагая лишь неполной или приближенной информацией. Численные процедуры используют арифметику конечной точности и основываются на теории аппроксимации. В принципе желательно описывать численные алгоритмы с той же строгостью, что и алгебраические. Понятие вычисления может относиться не только к числам. Первые символьные манипуляции были связаны с использованием шифров и тайнописи. Начиная с 1963 г распространяются программные системы для формульных преобразований. Другим примером символьных вычислений являются: работа с текстами, игры в шашки, шахматы. К этой же группе программ относятся программы для получения математических доказательств.

Алгебраические алгоритмы реализуются в программных системах, допускающих ввод и вывод информации в символьных обозначениях. Она отличаются простыми формальными описаниями, существованием доказательств правильности и асимптотических границ времени выполнения. Кроме того алгебраические объекты можно точно представить в памяти ЭВМ, поэтому алгебраические преобразования могут быть выполнены без потери точности и значимости. Точность при использовании алгебраического алгоритма часто оплачивается большим временем выполнения и необходимым объемом памяти, чем для его численного аналога.

Существует ряд важных причин для анализа алгоритмов. Одной из них является необходимость получения оценок (или границ) для объема памяти или времени работы, которое потребуется алгоритму для успешной обработки конкретных данных. Машинное время и память относительно дефецитные и дорогие ресурсы. Другая – желание иметь некий количественный критерий для сравнений двух алгоритмов, претендующих на решение одной и той же задачи. Еще одна причина - желание иметь механизм для выявления наиболее эффективных алгоритмов. Иногда невозможно составить четкое мнение об относительной эффективности двух алгоритмов. Один может в среднем лучше работать, к примеру, на случайных входных данных, другой лучше работает на каких-то специальных данных. Важно также установить абсолютный критерий. Когда считать решение задачи оптимальным, т.е. когда наш алгоритм настолько хорош, что его невозможно (независимо от наших умственных способностей) значительно улучшить.

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

Ограничение финитности для практических целей является недостаточно жестким: используемый алгоритм должен иметь не просто конечное, а предельно конечное, разумное число шагов. В реальных вычислениях главный вопрос относительно некоторой функции состоит не в том "вычислима ли данная функция", а скорее в том "вычислима ли она практически". Т.е. существует ли программа, вычисляющая функцию за время, которым мы располагаем? Можно измерять время, требуемое для вычисления каждого значения функции по конкретной программе, в предположении, что каждый шаг совершается за единицу времени. И мерой вычислительной сложности брать время вычисления.

Недостаточно доказать правильность алгоритма. Все мы можем сделать ошибки при доказательстве и при переводе правильного алгоритма в программу. Каждый может забыть некоторый частный случай задачи. Мельчайшие особенности операционной системы могут вызвать для некоторых входных данных такое действие части вашего алгоритма, о котором вы и не подозревали. Программа должна быть проверена для широкого спектра допустимых входных данных. Этот процесс может быть утомительным и сложным. Аналитический и экспериментальный анализ дополняют друг друга. Аналитический анализ может быть неточным, если сделаны слишком сильные упрощающие допущения. В этом случае могут быть получены только грубые оценки. Экспериментальные результаты, особенно когда используются случайно сгенерированные данные, могут оказаться слишком односторонними. Чтобы получить достоверные результаты, следует проводить как аналитическое, так и экспериментальное исследование там, где это возможно.

Пусть имеется некоторая вычислительная машина, выполняющая

109 операций в секунду, несколько алгоритмов с различной временной сложностью и структура данных размера n=100. Рассмотрим время работы данной машины:

(Таб. 1)

Из таблицы 1 можно видеть, что вычисления, определяемые алгоритмами (7) и (8), вряд ли закончатся в обозримом будущем. Очень характерным является временной скачок между шестым и седьмым алгоритмами.

Теоретический материал

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

Ограничение финитности означает, что используемый алгоритм должен иметь не просто конечное, а предельно конечное, разумное число шагов.

Основные определения

1. Чем объясняется невозможность получения точного решения задач?

2. Назовите причины анализа алгоритмов.

3. Что такое ограничение финитности?

4. Назовите основные этапы построение алгоритмов.

5. Что представляет собой анализ алгоритмов?

6. Какие два критерия необходимо рассматривать при анализе алгоритма, для доказательства его эффективности?

Контрольные вопросы