Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по алгоритмам.doc
Скачиваний:
6
Добавлен:
05.11.2018
Размер:
264.7 Кб
Скачать

Value  значение переменной X, для которого рассчитывается Pn(X);

p и index вспомогательные переменные. */

for (index=1; index<=Order; index++)

p+=Array[index]*pow(Value,index);

return p;

}//Конец Polinom_Calculation

Из-за того, что в языках C, C++ не определена операция возведения в степень, в программе воспользовались библиотечной функцией pow(y,z), которая возводит переменную y в степень z и описана в библиотеке math.h Borland C++.

Данный алгоритм потребовал n сложений, n умножений и n операций возведения в степень. Но операция возведения в степень  одна из самых медленных в ЭВМ, поэтому приведённый алгоритм можно признать неудачным с точки зрения временной сложности. Попробуем составить более быстрый алгоритм. Здесь на помощь приходит классическая схема Горнера (Horner’s rule). Представим (1.1) в следующем виде:

Pn(x) = anxn + an-1xn-1 + … + a1x + a0 = (…(anx + an-1)x + … + a1)x + a0 (1.2)

Выражение (1.2) не требует операций возведения в степень. Составим программу для этого алгоритма.

// Программа 1.2

double Polinom_Calculation_Horner(double Array[], unsigned int Order, double Value)

/* Функция расчета по схеме Горнера значения полинома по заданным

коэффициентам, степени полинома и значению переменной x. */

{

double p=Array[Order];

unsigned int index;

/* Array массив коэффициентов полинома a0, a1, …, an; Order степень полинома;

Value  значение переменной X, для которого рассчитывается Pn(X);

p и index вспомогательные переменные. */

for (index=Order; index; index--)

p=p*Value+Array[index-1];

return p;

}//Полином Polinom_Calculation_Horner

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

Но возникает вопрос, нельзя ли составить программу более быстрого вычисления значения полинома, чем программа 1.2, приведённая выше? Алгоритм Горнера является оптимальным для неветвящихся программ, поэтому ещё сократить время вычислений можно только, учитывая особенности работы компилятора алгоритмического языка программирования. Резерв имеется следующий. Для вычисления значения полинома оба описанных алгоритма в цикле используют элемент Array[index]. То есть программа в каждом шаге цикла отыскивает соответствующий элемент массива полиномиальных коэффициентов. Поиск элемента в массиве достаточно медленная операция, поэтому её желательно заменить более быстрой. В языке C для этого имеются указатели на элементы массива. С их помощью можно составить следующую программу.

Программа 1.3 Расчет значения полинома по схеме Горнера с использованием указателя

double Polinom_Calculation_Fast(double Array[], unsigned int Order, double Value)

/* Функция расчета по схеме Горнера значения полинома по заданным коэффициентам,

степени полинома и значения переменной x. */

{

double p, *ptr;

unsigned int index;

/* Array массив коэффициентов полинома a0, a1, …, an; Order степень полинома;