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

Оптимизация алгоритмов

Рассмотрим способы оптимизации алгоритмов, направленные на увеличение скорости выполнения программ.

Первый способ основан на следующем правиле. Сложение и вычитание выполняются быстрее, чем умножение и деление. Целочисленная арифметика быстрее арифметики вещественных чисел. Таким образом, Х+Х лучше, чем 2Х, а i+0,5 хуже, чем (2i+j)0,5. При выполнении операций над целыми числами следует помнить, что благодаря применению двоичной системы счисления умножение на числа, кратные двум, можно заменить соответствующим количеством сдвигов влево. Поэтому 10А выполняется дольше, чем , гдеshl – операция сдвига влево.

Второй способ заключается в удалении избыточных вычислений.

Пример.

Root 1:=(-b+sqrt(sqr(b)-4a*c)/(2*a);

Root 2:=(-b-sqrt(sqr(b)-4a*c)/(2*a);

Требуется выполнить четыре операции сложения/вычитания, шесть операций умножения, две операции деления, два вызова функции sqrt и два вызова функции sqr.

Лучшим решением является следующее.

DvaA:=а+а;

DvaС:=с+с;

Discrim:=sqrt(b*b+ DvaA* DvaC);

Root 1:=(-b+ Discrim)/ DvaA;

Root 2:=(-b- Discrim)/ DvaA;

Пять операций сложения/вычитания, два умножения, два деления и одно обращение к функции sqrt.

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

Четвертый прием - исключение циклов.

Пример. Рассмотрим следующий фрагмент:

for i:= 1 to1000 do

А[i]:=0;

for i:= 1 to1000 do

for j:= 1 to10 do

А[i]:= А[i]+ C[i,j];

можно переписать так:

for i:= 1 to1000 do

begin

B:= C[i,1];

for j:= 2 to10 do А[i]:= B;

B:=B+ C[i,j];

end.

В данном примере выигрыш достигается, во-первых, за счет уменьшения количества циклов (два, а не три), а во-вторых, за счет того, что с введением временной переменной В уменьшено количество операций вычисления адресов элементов массива.

Пятый прием — развертывание циклов.

Пример. Запись

for i:= 1 to1000 do

for j:= 1 to 3 do

А[i]:= А[i]+ C[i,j];

можно переписать так:

for i:= 1 to1000 do

А[i]:= А[i]+ C[i,1] + C[i,2] + C[i,3];

Выигрыш в скорости вычислений вполне очевиден.

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

4.1 Классификация языков и способов программирования. Языки программирования высокого уровня

Язык программирования – формализованный язык для описания алгоритма (последовательности) решения задачи на компьютере.

Языки программирования в зависимости от используемого синтаксиса делятся на классы:

  1. Машинные языки (языки низкого уровня) – языки воспринимаемые аппаратной частью компьютера. Представлены двумя классами:

1.1. Непосредственно машинные языки – машинные коды (computer language).

1.2. Машинно-ориентированные языки – ассемблеры (computer-oriented language), которые отражают структуру конкретного типа компьютера. Ассемблеры (и макроассемблеры), представляют собой средства упрощающие подготовку машинных кодов программ за счет написания их в некоторых мнемонических обозначениях с последующим автоматическим переводом (компиляцией). Отличие макроопределений от процедур языков высокого уровня в том, что процедура компилируется один раз, и затем ссылки на нее реализуются в виде команд вызова.

Соседние файлы в папке Информатика_ 1 семестр