Вы находитесь на странице: 1из 39

Алгоритмы

Оглавление

1.

Алгоритмы сортировки

 

4

1.1. Сортировка выбором

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

1.2. Сортировка обменами (метод пузырька)

.

.

.

.

.

.

.

.

.

.

.

5

1.3. Сортировка вставками

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

6

1.4. Метод Неймана (сортировка слияниями)

.

.

.

.

.

.

.

.

.

.

.

6

2.

Графы

 

7

2.1.

Алгоритмы

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

9

 

2.1.1. Поиск в глубину

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

9

2.1.2. Построение остова минимального веса

.

.

.

.

.

.

.

.

11

2.1.3. Построение эйлерова цикла

 

.

.

.

.

.

.

.

.

.

.

11

1

2.1.4. Задача о коммивояжёре .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

12

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

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

13

2.1.6. Алгоритм поиска кратчайших путей между всеми

 

вершинами графа

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

14

2.1.7. Алгоритм поиска в ширину .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

14

2.1.8. Построение наибольшего паросочетания в двудоль-

 

ном графе

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

2.1.9. Алгоритм укладки графа на плоскости

.

.

.

.

.

.

.

.

16

3. Стандартные численные задачи

 

18

3.1. Трансцендентные уравнения

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

3.1.1. Постановка задачи

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

3.1.2. Метод дихотомии (бисекции)

 

.

.

.

.

.

.

.

.

.

.

18

3.1.3. Метод простых итераций .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

19

3.1.4. Метод Ньютона

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

20

3.2. Решение систем линейных уравнений

.

.

.

.

.

.

.

.

.

.

.

.

.

20

2

3.2.1. Постановка задачи

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

21

3.2.2. Метод исключения Гаусса

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

21

3.2.3. Метод Зейделя

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

3.3. Интерполяция функций

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

23

3.3.1. Постановка задачи

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

23

3.3.2. Интерполяционный полином Лагранжа

 

.

.

.

.

.

24

3.3.3. Интерполяционный полином Ньютона

 

.

.

.

.

.

.

.

.

25

3.4. Аппроксимация функций

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

26

3.4.1. Постановка задачи

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

26

3.4.2. Алгоритм

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

27

3.5. Вычисление интегралов .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

28

3.6. Поиск минимума функции одной переменной

 

.

.

.

.

.

29

3.6.1. Метод золотого сечения .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

29

3.6.2. Метод Ньютона

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

30

3.6.3. Метод парабол

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

31

3.7. Задача линейного программирования

.

.

.

.

.

.

.

.

.

.

.

.

.

32

3

3.7.1. Постановка задачи

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

32

3.7.2. Симплекс-метод

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

34

4. Метод Монте-Карло

35

4.1. Моделирование случайных величин

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

35

4.1.1. Дискретные случайные величины

.

.

.

.

.

.

.

.

.

.

.

35

4.1.2. Непрерывные случайные величины

.

.

.

.

.

.

.

.

.

.

36

4.2. Вычисление интегралов .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

37

4.2.1. Стандартный метод

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

37

4.2.2. Геометрический метод

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

39

1. Алгоритмы сортировки

В приведенных ниже алгоритмах рассматривается упорядочение мас- сива a i , i = 1, n в порядке неубывания.

1.1.

Сортировка выбором

При сортировке выбором производится последовательный поиск i-го (i = 1, n) минимального элемента из оставшейся неупорядоченной ча- сти n i + 1 элементов массива и помещение его на i-ое место. Число сравнений в алгоритме порядка n 2 .

1.2. Сортировка обменами (метод пузырька)

При сортировке обменами, как и при сортировке выбором, произво- дится последовательное упорядочивание массива. Отличие заключается в способе поиска i-го (очередного) минимального элемента. При поиске i- го минимального элемента производится поиск максимального j такого, что a j < a j1 . Элементы a j и a j1 меняются местами и просмотр про- должается с a j1 элемента до i-го. Выполнение данной процедуры для i от 1 до n приведет к упорядочению массива.

5

1.3.

Сортировка вставками

При сортировке вставками на каждом этапе весь массив рассматри- вается как две части. Первая часть из i элементов упорядочена, а вторая часть должна быть размещена между элементами первой. При реали- зации данного алгоритма важное значение имеет способ поиска места элемента из второй группы среди элементов первой. Наиболее распро- страненным является метод бинарного поиска. Метод бинарного поиска аналогичен методу дихотомии поиска нуля трансцендентного уравнения.

1.4. Метод Неймана (сортировка слияниями)

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

6

должается до слияния всех групп в один массив. Можно показать, что для реализации данного алгоритма требуется проведение n log 2 n опера- ций сравнения.

2.

Графы

Многие задачи оптимального выбора при прямом их решении предпо- лагают перебор большого количества счетного числа вариантов. Теория графов позволяет во многих случаях решить задачу гораздо эффектив- нее, чем непосредственный перебор вариантов. gRAF - это геометриче- ская структура, состоящая из множества точек (вершин) и множества кривых (ребер). В алгоритмах, приведенных ниже, используются следу- ющие обозначения :

-{v} множество вершин графа, v i i-тая вершина, -{e} множество ребер графа, e i i-тое ребро,

7

- w ij вес ребра, соединяющий вершину i с вершиной j. sMEVNYMI называют ребра, имеющие общую вершину. Граф, у ко- торого ребрам приписаны направления, называется ориентированным, или ORGRAFOM . Последовательность попарно различных ребер, начинаю- щихся и заканчивающихся в одной вершине, такая, что соседние ребра смежны, в неориентированном графе называется CIKLOM, а в ориентиро- ванном - KONTUROM . Если последовательность смежных ребер соединяет разные вершины, то она называется CEPX@ (PUTEM ). Для последователь- ности с повторяющимися ребрами употребляют название MAR[RUT . Если между любой парой вершин существует маршрут, то граф называют SWQ - ZANNYM . Граф без циклов называют LESOM, а связанный граф без циклов называют DEREWOM. Цепь без повторяющихся вершин называют PROSTOJ. Граф называют PLANARNYM , если его можно расположить на плоскости так, что два различных ребра в качестве общей точки могут иметь толь- ко вершину. oSTOWOM называется дерево, включающее все вершины гра- фа. —JLEROWYM циклом называется цикл, включающий все ребра графа

8

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

- задание матрицей весов w ij ;

- задание списком ребер, массивы END(2,M) и W(M) ;

- задание списком смежности. Каждой вершине графа ставится в соот- ветствие список смежных вершин.

2.1.

Алгоритмы

2.1.1. Поиск в глубину

Данный алгоритм используется для поиска пути между двумя вер- шинами. В алгоритме используется вспомогательный стековый массив вершин Q, q число элементов в стеке, массив меток вершин l(n) и

9

массивы меток ребер. Изначально все вершины считаются непомеченны- ми, т.е. l i = 0.

1. Поместим стартовую вершину в стек q=1, Q(q)=s.

2. Если стек не пуст, то берем вершину из стека x=Q(q), q=q-1, в про-

тивном случае пути нет.

3. Если все смежные вершины просмотрены, то выполняем пункт два.

В противном случае рассматриваем очередную смежную с x вершину y.

Если y конечная вершина, то путь найден.

4. Проверяем наличие метки у вершины y. Если l(y)>0, то помечаем ре-

бро v yx как обратное, в противном случае ребро v xy помечаем как прямое

и присваиваем метку l(y)=l(x)+1. Вершина y помещается в стек q=q+1, Q(q)=y.

5. Выполнить пункт 3.

10

2.1.2.

Построение остова минимального веса

1. Упорядочить ребра графа по возрастанию весов.

2. Выбрать ребро с минимальным весом, не образующее цикл с выбран-

ными ранее ребрами. Занести выбранное ребро в список ребер строяще- гося остова.

3. Проверить, все ли вершины графа вошли в построенный остов. Если

нет, то выполнить пункт 2. Данный алгоритм имеет трудоемкость порядка m log 2 m, где m -число

ребер.

2.1.3.

Построение эйлерова цикла

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

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

11

2.1.4.

Задача о коммивояжёре

1. Построить минимальное остовное дерево T графа G.

2. Удвоить каждое ребро в T и получить T .

3. Найти в T эйлеров цикл.

4. Построить по эйлерову циклу гамильтонов :

Пусть v 1 , v 2 ,

4.1. Включаем вершину v 1 в гамильтонов цикл. Пусть на некотором этапе

просмотрена v 1 ,

4.2. Вершина v k+1 включается в цикл, если её нет в уже построенной части. В противном случае переходим к вершине v k+2 и т.д. Данный алгоритм приведет к минимальному циклу для графа с w ij

w ik + w kj .

,v

n , v 1 - эйлеров цикл.

,v

k часть эйлерова цикла.

12

2.1.5.

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

Будем характеризовать граф матрицей весов w ij и дополнительными вспомогательными массивами last(j) - номер предыдущей вершины при шаге в вершину j, lenf(j) - длина пути из стартовой вершины s до вершины j, label(n) - массив вспомогательных меток. 1. Положим lenf(j)=w(s,j), last(j)=s, label(j)=0, j=1,n. 2. Найти i : lenf(i)<lenf(j) и label(j)=0 для всех j. Присвоить label(i)=1. Если i конечная вершина, то задача решена. 3. Для всех label(j)=0 и lenf(j)>lenf(i)+w(i,j) присвоить lenf(j)=lenf(i)+w(i,j), last(j)=i. 4. Выполнить пункт 2.

13

2.1.6.

Алгоритм поиска кратчайших путей между всеми вер- шинами графа

Граф задается матрицей весов и матрицей направлений z ij . Элемент z ij задает номер первой вершины после i на пути к j.

1. Для всех i и j и w ij = положить z ij = j.

2.

Если условие выполнено, то w ij = w ik + w kj и z ij = z ik .

Для всех i, j, k и i

= k, w ik

= , w kj

=

проверить w ik + w kj < w ij .

2.1.7. Алгоритм поиска в ширину

Вводится вспомогательный массив номеров вершин Q, массив меток

матрица смежности v(i,k). Значение метки равно удаленности

l(j)

вершины от исходной.

1. q=1, Q(q)=s, j=1, l(s)=0.

и

14

2.

k=Q(j) - берем вершину из рабочего массива,

3. i=1, y=v(i,k) - первая смежная с k вершина,

4. Если смежная с k вершина y имеет метку, то выполнить п.5, иначе

l(y)=l(k)+1,

5. Если у k-ой вершины есть еще смежные вершины, то i=i+1 и выпол-

нить пункт 4, иначе j=j+1.

6. Если j q, то выполнить пункт 2.

last(y)=k,

q=q+1,

Q(q)=y.

2.1.8. Построение наибольшего паросочетания в двудольном графе

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

15

ющегося пути из ненасыщенной вершины до ненасыщенной вершины.

1. Построим какое-либо паросочетание M в графе G.

2. По графу G и паросочетанию M построить вспомогательный граф

= X + Y : всем ребрам из паросочетания M присваивается ориентация

из X в Y , остальные ребра графа G получают обратное направление.

3. Выполнить в графе поиск в ширину из множества Y ненасыщенных

вершин.

4. Если в результате поиска одна из вершин множества X получила мет-

ку, то найден добавляющий путь. Произвести инверсию ребер добавля- ющего пути относительно паросочетания.

2.1.9. Алгоритм укладки графа на плоскости

Назовем GRANX@ графа G часть плоскости, ограниченную ребрами графа, такую, что любые две ее точки могут быть соединены жордановой кривой, непересекающей ребра графа. sEGMENTOM графа G относительно

16

его подграфа G 1 назовем ребро графа G G 1 , смежное с вершинами гра- фа G 1 , или связанную компоненту графа GG 1 , дополненную смежными

вершинами графа G 1 .

1. Выберем некоторый простой цикл графа G и уложим его на плоско-

сти. Положим G 1 = C.

2. Найдем грани графа G 1 и сегменты относительно G 1 . Если множество

сегментов пусто, то задача решена.

3. Для каждого сегмента определим число граней, в которых он может

быть расположен.

4. Выберем сегмент, для которого число возможных расположений мини-

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

5. Присоединим выбранный сегмент к графу G 1 . Повторим п. 2.

17

3.

Стандартные численные задачи

3.1. Трансцендентные уравнения

3.1.1. Постановка задачи

Дана некоторая функция f (x). Найти с точностью до ε такое x 0 , что f(x 0 ) = 0. В том случае, когда решение не может быть найдено в явном виде, применяются численные методы. Наиболее распространенными из них являются метод деления отрезка пополам, метод простых итераций, метод касательных и метод хорд.

3.1.2. Метод дихотомии (бисекции)

1. Найдем отрезок [a, b] : f (a)f (b) < 0.

2. Положим c = (a + b)/2.

18

3.

Если f (a)f (c) < 0, то положим b = c, в противном случае a = c.

4.

Если b a < ε, то x 0 = (a + b)/2, в противном случае выполнить пункт

2.

 

3.1.3.

Метод простых итераций

Введем вспомогательную функцию φ(x) = x + ψ(x)f (x), где функция ψ(x) выбирается из условия |φ(x) | < 1.

1. Зададим начальное приближение x 0 .

2. Вычислим очередное приближение по формуле x n+1 = φ(x n ).

3. Если |x n+1 x n | < ε 1 , то решение найдено. Здесь ε 1 = ε|φ(x n+1 ) |/(1

|φ(x n+1 ) |).

19

3.1.4.

Метод Ньютона

Найдем выражение для производной f (x). Приведенный ниже алго- ритм сходится,если |ff /(f ) 2 | < 1.

1. Зададим начальное приближение x 0 .

2. Вычислим очередное приближение по формуле

x n+1 = x n f(x n )

f

(x n ) .

3. Если |x n+1 x n | < ε 1 , то решение найдено.

3.2. Решение систем линейных уравнений

20

3.2.1.

Постановка задачи

Пусть дана система n линейных уравнений с n неизвестными

n

j=1

a ij x j = b j

i = 1, n.

Требуется найти неизвестные x i , i = 1, n.

3.2.2. Метод исключения Гаусса

1. Положим i = 1.

2. Найдем максимальный по модулю элемент в i -том столбце, начиная

с i -го элемента. Пусть это будет a ki . Eсли a ki = 0, то главный опреде-

литель системы равен нулю и решения не существует ; иначе поменять строки k и i местами.

21

3.

К строкам с номерами j > i добавим строку i, домноженную на a ji /a ii .

4. Если i < n, то i = i + 1 и выполнить пункт 2.

5. Найдем неизвестные по формулам x n = b n /a nn и

x i =   b i

n

j=i+1

a ij x j

3.2.3. Метод Зейделя

/a ii .

Представим матрицу a ij в виде суммы двух треугольных матриц

a ij = c ij + d ij ,

1. Положим в качестве начального приближения x = 0.

2. Найдем очередное приближение по формулам

c ij = 0 для i > j и d ij = 0 для i j.

x˜ i =   b i

n

j=i+1

ij x˜ j

i1

j=1

d ij x j

/c ii .

22

3. Если | x˜ x| < ε 1 , то решение найдено, в противном случае x = выполнить первый пункт.

Метод сходится, если норма матриц удовлетворяет условию c 1 d < 1.

x˜ и

3.3. Интерполяция функций

3.3.1. Постановка задачи

Дана таблица значений функций y i в m точках x i . Требуется постро- ить непрерывную функцию f (x) такую, что f (x i ) = y i для всех i. Данная задача в общем случае может быть решена различными способами, что приведет к отличающимся значениям функции в промежуточных точках. Наиболее распространенной является задача полиномиальной интерпо- ляции.

23

3.3.2.

Интерполяционный полином Лагранжа

1. Зададим степень интерполяционного полинома n. Рекомендуется вы-

бирать n 5.

2. По заданному значению x и n определим j : x j < x < x j+n .

3. Вычислим значение f (x) по формуле

f(x) =

n+j

k=j

y

k

n+j

l=j

l

=k

(x x l )

(x k x l ) .

Погрешность интерполяции может быть оценена по правилу Рунге (см. с. 28).

24

3.3.3.

Интерполяционный полином Ньютона

1. Зададим степень интерполяционного полинома n. Рекомендуется вы-

бирать n 5.

2. По заданному значению x и n определим j : x j < x < x j+n .

3. Вычислим разделенные разности первого порядка

y

1 y i+j y j

i

=

x i+j x j

для i от 1 до n.

4. Вычислим разности второго и высших порядков по формуле

y

k

i

=

y

k1

i

y

k1

k1

x i+j x j+k1

для k = 2, n и i =

k, n.

5. Вычислим значение функции по формуле

f = y j + y

1

1

(x

x j ) + y

2

2

(x x j )(x x j+1 ) + ···

25

Погрешность интерполяции может быть оценена по правилу Рунге (см. с. 28).

3.4. Аппроксимация функций

3.4.1. Постановка задачи

Дана таблица значений функций y i в m точках x i . Требуется постро- ить непрерывную функцию f (x) такую, чтобы сумма квадратов откло- нений значений аппроксимационной формулы для известных точек

Φ =

m

i=1

(y i f(x i )) 2 ρ i

была минимальной. В данном выражении ρ i весовые коэффициен- ты,обычно выбираемые равными единицы или определяемые погрешно-

26

стями исходных данных. Такой метод получил название метода наимень- ших квадратов. Наиболее просто задача решается, когда функция f (x) представима в виде

3.4.2.

f(x) =

n

j=1

c j ϕ j (x),

Алгоритм

ϕ j (x) — известные функции.

1. По виду исходных данных выберите n линейно независимых функций

ϕ j (x).

2. Построим матрицу коэффициентов

a ij =

m

k=1

ϕ i (x k )ϕ j (x k ) и b i =

m

k=1

y k ϕ i (x k ).

3. Решим систему линейных уравнений a ij c j = b i .

27

3.5.

Вычисление интегралов

Для вычисления интегралов