Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
115
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

4.6. Вопросы для самоконтроля

  1. Структуры данных для представления графов.

  2. Алгоритмы обхода графа в глубину; в ширину.

  3. Поиск минимального остовного дерева методом Дейкстры-Прима.

  4. Поиск минимального остовного дерева методом Крускала.

  5. Поиск кратчайшего пути.

5. Численные методы

Математические вычисления лежат в основе большого числа разнообразных программ. Компьютерная графика требует большого объема вычислений с многочленами и матрицами. Эти вычисления обычно выполняют для каждой точки экрана, поэтому даже незначительные улучшения алгоритма могут привести к заметному ускорению. (Например, при размере экрана в 1024х768 точек – даже выигрыш на одно умножение на каждой из позиций приводит к значительной экономии!).

Умножение матриц встречается в многочисленных приложениях. Модели физических объектов в компьютерной графике, а также компьютерном проектировании, часто представляют собой матрицы.

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

Пример: изображение 512х512 точек. При применении шаблона 5х5 точек при свертке – шаблон умножается на блоки картинки для всех возможных положений блока (512 – 5 + 1) = 508 положений по вертикали и столько же по горизонтали. Следовательно, матрица (5х5) должна быть умножена на 258 064 блоков.

При использовании стандартного алгоритма умножения матриц потребуется 32 258 000 умножений. Более эффективный алгоритм позволяет сэкономить значительное время.

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

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

5.1. Вычисление значений многочленов

Для полного многочлена n-ой степени вида:

P(x) = anxn + an –1 xn-1 + an-2 xn-2 + … + a1 x + a0 ,

будем предполагать, что коэффициенты (ana0) известны и записаны в массив. Единственным входным данным служит х, а результат программы – значение многочлена в точке х.

Стандартный алгоритм вычисления

Evaluate (x, A)

// A – массив коэффициентов многочлена

result  a[0] + a [1] * x

x_Pow  x

for i = 2 to n do

x_Pow  x_Pow * x

result  result + a [i] * x_Pow

endfor

return (result)

end

В цикле for содержатся 2 умножения, которые выполняются (n – 1) раз. Кроме того, одно умножение выполняется до цикла, поэтому общее число умножений 2( n – 1) + 1 = 2n – 1.

В цикле выполняется также одно сложение и еще одно до входа в цикл, следовательно, сложений n – 1 +1 = n.

Общее число операций – (2n – 1) умножений и n сложений.

Схема Горнера

Эта схема основывается на следующем представлении многочлена:

p(x) = (((((an x1 + an-1)x + an-2) x + an – 3 + … + a1) x + a0

Соответствующий алгоритм имеет вид:

Horner (x, A)

result  a [n]

for i = n – 1 down 0 do

result  result * x + a [i]

end for

return (result)

end

Цикл выполняется n раз, внутри одно умножение и одно сложение.

Общее число операций: n умножений и n сложений – двукратное умень­шение числа умножений по сравнению со стандартным алгоритмом.