Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика / Основы теории алгоритмов.doc
Скачиваний:
204
Добавлен:
10.02.2015
Размер:
611.84 Кб
Скачать

1.4. Типы алгоритмов

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

Если задача решается прямым способом, то она имеет детерминированный метод решения. Отсюда — детерминированные алгоритмы, которые всегда обеспечивают регулярные решении и характеризуются:

  • отсутствием элементов, вносящих неопределенность;

  • невозможностью произвольности в выборе решений, определяющих последовательность действий;

  • недопустимостью применения методов проб и ошибок,

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

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

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

1.5. Основные принципы и способы разработки алгоритмов

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

Реализация методов декомпозиции для разработки алгоритмов осуществляется на известном принципе нисходящего проектирования, или «сверху-вниз». Он предполагает процесс пошагового разбиения алгоритма на все более мелкие части до уровня элементарных конструкций, для которых возможно составить элементарные команды. Это проектирование основано на идее уровней абстракции, которые становятся уровнями модулей в разрабатываемой программе. То есть если для некоторой функции f существует ее композиция через две другие функции g и h, то проблема разработки алгоритма f сводится к разработке алгоритмов для g и h. В ходе проектирования строится схема иерархии, которая изображает эти уровни. При этом исходная, подлежащая решению задача разбивается на ряд подзадач, подчиненных по своему содержанию главной задаче. Этот принцип в литературе получил название «метод частных целей». Рассмотренный процесс называется детализацией или декомпозицией. В разрабатываемых алгоритмах необходимо избегать произвольных связей и передач управления между модулями.

Кроме рассмотренного принципа структурного программирования используют принцип «снизу-вверх», который обеспечивает получение конечного результата системным методом, позволяющим первоначально декомпозировать задачу на отдельные блоки (модули) с их связями между собой, а затем, после их разбивки, осуществить сборку блоков в единую программу (синтез). Этот принцип нашел широкое распространение при модульном программировании, предполагающем максимальное использование стандартных и специализированных программных продуктов, процедур, функций, модулей и объектов.

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

При разработке алгоритмов используют известные дедуктивный и индуктивный методы (подходы).

Дедуктивный способ (подход) — при заданных предположениях известный алгоритм приспосабливается к условиям решения задачи.

Примером могут быть вычислительные задачи линейной алгебры, для решения которых существуют известные пакеты прикладных программ (Mathcad, Autocad и др.).

Индуктивный способ (подход) — предполагает эвристический системный подход (декомпозиция—анализ—синтез) построения алгоритма, при котором используются такие методы разработки алгоритмов, как методы частных целей, подъема, отбрасывания назад, ветвей и грани и и др.

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

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

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

Рекурсия — метод определения или вычисления функции, процедуры или решения задачи посредством той же функции, процедуры и т.п.

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

Итерация используется для видов обработки, которые лучше определяются выражением типа «выполнить для всех х», а рекурсия — для получения результирующих данных, которые просто описать рекурсивно, то есть задать выражением вида «выполнить то же, что и в последний раз». Текущее действие определяется с помощью предыдущего ответа или предыдущих стадий вычислений. Особенностью итерации и рекурсии является их взаимозаменяемость. Так, рекурсивные процедуры могут быть переписаны в итерационном виде в языках, в которых рекурсия невозможна, а итерационные процедуры могут быть переписаны как рекурсивные в языках, в которых невозможна итерация. Известным классическим примером рекурсии является алгоритм определения факториала (1.1):

(1.1)

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

(1.2)

Процедура реализации рекурсивного и итерационного алгоритма может быть проиллюстрирована известными примерами 1 и 2.

Пример 1.

procedure факториал (п);

if n = 0

then return (1)

else return (n * факториал (n — 1))

end.

Пример 2.

procedure факториал (n);

f=1;

k=n;

while k>0 do

f=f∙k;

k=k-1;

return (f)

end.

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

Для рассмотренных примеров оба алгоритма имеют линейную сложность, но итерационная форма более предпочтительна, чем рекурсивная, для которой требуются дополнительные расходы памяти и времени выполнения в силу следующего:

  • при каждом рекурсивном вызове содержимое всех регистров ЭВМ сохраняется, а при возврате — восстанавливается, как и при любом вызове подпрограммы;

  • должны сохраняться все локальные переменные до момента возврата, так как они могут быть изменены вызываемой подпрограммой;

  • в силу многократного обращения из подпрограммы к самой себе создается и сохраняется много копий регистров, переменных и точек возврата.

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

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

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