Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТРПО учебное пособие.doc
Скачиваний:
24
Добавлен:
22.08.2019
Размер:
3.13 Mб
Скачать

7.1 Разбиение задачи на независимые подзадачи

Основным алгоритмом, используемым для решения задач, является алгоритм разбиения на независимые подзадачи. Для того, чтобы решить задачу A, ее первоначально необходимо разбить на независимые подзадачи B, C, D и т.д.

A: procedure;

Задача B;

Задача C;

Задача D;

end A;

Решение подзадач может производиться по любому алгоритму.

7.2 Разбиение задачи на одинаковые по сложности части

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

  • проверить первый элемент;

  • if заданный элемент не найден, then продолжить поиск среди оставшихся элементов.

Таким образом, задача разбивается на две части: проверку первого элемента и поиск среди оставшихся. Ясно, что такие алгоритмы не равнозначны по сложности. Модифицированный алгоритм — двоичный поиск — имеет вид:

  • проверить первый элемент;

  • if заданный элемент не найден, then продолжить поиск в верхней или нижней половине списка.

В этом случае задача разбивается на две части, примерно одинаковые по сложности. Каждая из частей может иметь рекурсивное решение.

7.3 Рекурсия и динамическое программирование

7.3.1 Рекурсия

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

Примером рекурсивного решения является вычисление факториала fact(N) = 1×2×…×N. Пусть неизвестно значение fact(460), если умножить fact(459) на 460, тогда задача сводится к вычислению fact(459). Если это преобразование далее повторить 458 раз, то можно вычислить значение факториала, поскольку fact(1) = 1. Таким образом, функция F является рекурсивной, если:

1) F(N) = G(N, F(N – 1)) для некоторой известной функции G и

2) F(1) равно некоторому известному значению.

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

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

7.3.2 Динамическое программирование

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

7.3.3 Моделирование

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