К основному контенту

Как строить эффективные алгоритмы?

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

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

Шаги для построения эффективного алгоритма:
  1. Более строгая формулировка решаемой задачи, отделение существенного от неважного.
  2. Либо самостоятельно улучшить алгоритм, пришедший на ум первым, либо воспользоваться уже известными эффективными алгоритмами.
  3. Чтобы лучше понять алгоритм нужно выполнить его вручную (трассировка алгоритмов).
  4. Прежде чем анализировать эффективность алгоритма, нужно доказать, что данный алгоритм правильно решает задачу. Тут следует подчеркнуть важность проверок промежуточных состояний (assertions) и инвариантов цикла для доказательства корректности алгоритма.
  5. Превратить алгоритмы в программы и протестировать их, а затем сравнить результаты работы реальных программ с полученными посредством теоретического анализа.

При создании программных продуктов нужно обращать внимание на:
  • временную эффективность программ;
  • разумное использование памяти.

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

Ограничения могут быть связаны:
  • с производительностью компьютеров;
  • со сложностью решаемой задачи.

В начале 80-х годов зачастую общий размер программы и данных не превышал 64 К.

До сих пор существует активное сообщество, использующее платформу DOS и разрабатывающее для неё ПО.

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

Комментарии

Популярные сообщения из этого блога

Метод турниров

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

Наихудший случай

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

Выбор представления данных

Выбор представления данных часто довольно сложен и не полностью определяется имеющимися вычислительными средствами. Делать такой выбор всегда нужно с учетом операций, которые нужно выполнять с данными.  Нельзя принимать решения о структуре данных без учета того, какие алгоритмы применяются к данным, и что, обратно, структура и выбор алгоритмов часто сильно зависят от структуры обрабатываемых данных. Задачу построения программ нельзя отделять от задачи структурирования данных. Вопрос представления часто требует рассматривать несколько уровней детализации. Первое решение в цепочке зависит главным образом от решаемой задачи, а дальнейшие всё больше зависят от используемого инструмента и применяемых в нём технологий. Решения низкого уровня можно оставить проектировщикам вычислительного оборудования. Вряд ли можно требовать, чтобы программист решал, какое представление чисел использовать или даже какими должны быть характеристики устройства хранения данных. Реальный компьютер ...