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

ВВЕДЕНИЕ

ВВЕДЕНИЕ

В.1. Интуитивное определение алгоритма

Уже в глубокой древности (Египет, Вавилон) люди научились вычис-


лять длину пути, площадь участка земли, стоимость товаров и т.д. Посте-
пенно вычисления усложнялись, превращаясь в определённый вычисли-
тельный процесс. Приведём примеры наиболее давних вычислительных
процессов: нахождение наименьшей общей меры при измерении длин
отрезков, определение наибольшего общего делителя, выполнение ариф-
метических операций с целыми числами в непозиционных системах счис-
ления, а позже – с целыми и дробными в позиционной десятичной системе
счисления. Примером более современного вычислительного процесса
может служить решение системы линейных уравнений методом Гаусса
последовательного исключения переменных.
Эти и подобные им вычислительные процессы осуществлялись по
определённой схеме и в соответствии с оговоренными правилами. Со вре-
менем появлялись новые вычислительные процессы, общие для некото-
рого класса задач. Эти процессы предполагали наличие:
 определённой последовательности действий, составляющей
схему;
 правил выполнения действий.
Позже такие процессы назвали алгоритмами. Термин “алгоритм”
происходит от имени узбекского математика Аль-Хорезми, который еще в
IX в. сформулировал правила выполнения арифметических операций.
На рубеже ХIХ-ХХ вв. в результате анализа существующих
алгоритмов были выявлены общие для всех алгоритмов признаки.

4
О.Н. Паулин. Основы теории алгоритмов

1. Дискретность. Алгоритм - процесс последовательного


получе-ния величин, идущий в дискретном времени (по шагам) по
определённой схеме и известным правилам.
2. Элементарность шагов. Очередной шаг алгоритма должен
быть элементарным для исполнителя алгоритма (человека или машины).
3. Детерминированность (определённость). Система величин в
дан-ный (не начальный) момент времeни (на данном шаге) однозначно
определя-ется системой величин, полученной в предыдущие моменты
времени.
4. Результативность (сходимость). Алгоритм через
некоторое конечное число шагов приводит к остановке, которая
свидетельствует о достижении требуемого результата; если способ
получения последующей системы величин из какой-либо заданной
системы не даёт результата, то должно быть указано, что надо считать
результатом алгоритма.
5. Массовость. Начальная система величин может выбираться
из некоторого (потенциально бесконечного) множества.
Если вычислительный процесс удовлетворяет перечисленным
признакам, то он является алгоритмом.
Заметим, что эти признаки не равноценны: если признаки 3-5 являются
обязательными, характеризуя внутреннюю сторону вычислительного процесса,
то первые два характеризуют внешнюю его сторону.
Понятия алгоритм и вычислительный процесс близки, однако отли-
чаются тем, что в алгоритме больше внимания уделяется тому, как делать, а
в вычислительном процессе – что делать для получения результата.

5
ВВЕДЕНИЕ

Рассмотрим процесс нахождения наибольшего общего делителя,


предложенный Евклидом, и проиллюстрируем на этом примере признаки
алгоритма.
Пример В.1. Даны два целых положительных числа A и B.
Требуется найти их наибольший общий делитель (НОД) N.
Обозначим: R - остаток от деления двух чисел; C – макси-
мальное значение для пары чисел, C = max(A, B); D - минимальное
значение для пары чисел, D = min(A, B).
Решение задачи нахождения НОД может быть получено в таком
виде.
1. Сравниваем A и B. Если A=B, то N=A и переходим к п.3. Если
A>B, то C=A, D=B, иначе C=B, D=A. Переходим к п.2.
2. Делим C на D и определяем остаток R. Если R=0, то N=D,
переходим к п.3, иначе C=D, D=R; переходим к п.2.
3. Конец.
Нетрудно убедиться, что процесс нахождения НОД удовлетворяет
перечисленным выше признакам (процесс пошаговый, операции элементарны,
результат однозначен, процесс сходится, причём независимо от конкретных
значений исходных данных), и, следовательно, является алгоритмом. Так, хотя
заранее и неизвестно, сколько раз будет осуществляться проверка условия
R=0, но ясно, что для данных двух целых чисел цель будет достигнута за
конечное число шагов (признак результативности).
Итак, понятие "алгоритм" было определено через приведенные выше
признаки; это понятие не строгое, интуитивное. Оно устраивало математиков до
начала ХХ в., пока проблемы алгоритмической разрешимости (вычис-
лимости) сводились к вопросу, является ли данный вычислительный процесс
для класса задач алгоритмом, т.е. к вопросу, можно ли любой сколь угодно
сложный вычислительный процесс выразить через ограниченное количество

6
О.Н. Паулин. Основы теории алгоритмов

простых операций. Однако затем положение с проблемой алгоритмической


разрешимости резко изменилось - на первом плане оказались проблемы, для
которых существование положительного решения было сомнительным, т.е.
проблемы алгоритмической неразрешимости, в связи с чем, главным
образом, понятие "алгоритм" подверглось глубокому изучению и уточнению.
Дело в том, что попытки решить ряд задач натолкнулись на трудности,
которые не удалось преодолеть, несмотря на долгие и упорные усилия многих
крупных математиков. Так, до сих пор не найдено алгоритма для решения
диофантовых уравнений1, осталась нерешённой проблема четырёх красок в
теории графов2; к алгоритмически неразрешимым относятся проблемы рас-
познавания выводимости в математической логике и эквивалентности слов - в
ассоциативных исчислениях и т.д. В связи с этим возникло предположение, что
не для всякого класса задач возможно построение разрешающего алгоритма;
это предположение требовало доказательства в каждом конкретном случае.
Если доказательством существования алгоритма служит само описание
разрешающего процесса и соответствие этого процесса признакам 1-5, то для
доказательства отсутствия алгоритма уже недостаточно интуитивного понятия
"алгоритм". Нужно точно определить, что такое "алгоритм", и разработать
методы доказательства алгоритмической неразрешимости. Две эти задачи
составили одну из центральных проблем математики в 20-х гг. XX ст.
Решение этой проблемы в общем виде было получено в середине 30-х гг. в
двух формах в работах Гильберта, Гёделя, Чёрча, Клини, Поста, Тьюринга.
Первое решение было основано на понятии "рекурсивная функция", а второе -
на описании точно сформулированного класса процессов, реализуемых на
машинах Тьюринга. Оба решения оказались эквивалентными.

1
Диофантово уравнение имеет вид xn + yn = zn, где n – целое. Требуется найти
целочисленное решение для произвольного n. Найти такое решение в общем виде не удаётся.
2
Существует теорема о том, что для раскраски любого планарного графа необходимо не
более чем 4 краски. Однако доказать эту теорему в общем виде не удаётся.

7
ВВЕДЕНИЕ

Таким образом, алгоритм - это вычислительный процесс, который может


быть описан с использованием рекурсивных функций или развёрнут на
машине Тьюринга. При этом он, естественно, должен удовлетворять
признакам 1-5.
С прикладной точки зрения построение алгоритма наталкивается на
проблему его эффективности, определяемую, в основном, сложностью
алго-ритма. Эффективность алгоритма зависит от того, как используются
ресурсы машины (необходимые для решения задачи время и память). Два
алгоритма для решения одной и той же задачи могут быть оба правильными,
но совер-шенно отличаться по своей эффективности. Алгоритмы
эквивалентны, если они при произвольных, но равных наборах исходных
данных дают одинаковые результаты. Важной является проблема
оптимизации алгоритма с целью получения максимальной его
эффективности. Сложность задач может ока-заться практически
неприемлемой - это так называемые NP-задачи.
Первоначально теория алгоритмов возникла в связи с внутренними пот-
ребностями теоретической математики. Математическая логика, основания ма-
тематики, алгебра, геометрия и анализ остаются и сегодня одной из основных
областей приложения теории алгоритмов. Другая область – ЭВМ, которые с
большой точностью моделируются машинами Тьюринга. Наконец, теория алго-
ритмов оказалась тесно связанной с рядом областей лингвистики, экономики,
физиологии мозга, психологии и т. д. Первое систематическое изложение тео-
рии алгоритмов было осуществлено С. Клини [1].

В.2. Виды вычислений и алгоритмов

Известно большое разнообразие вычислений, связанных с числами;


однако это узкий смысл термина "вычисление". Современное понимание

8
О.Н. Паулин. Основы теории алгоритмов

этого термина подразумевает обработку данных, для представления ко-


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

9
ВВЕДЕНИЕ

Отметим, что в численных вычислительных процессах большую долю сос-


тавляют комбинаторные вычисления; это вычисления на множествах, графах и
деревьях, в процедурах сортировки и поиска и т.п.
Алгоритмы (вычислительные процессы) могут быть представлены
следующими способами: 1) словесным описанием; 2) схемой; 3) програм-
мой на подходящем языке.
Наиболее полное и однозначное представление даётся конкретной
программой (собственно программа и позволяет реализовать данный
вычислительный процесс на ЭВМ); наиболее ёмкое - словесное описание
(обычно при этом излагается только идея организации вычислительного
процесса, расписанная по пунктам, число которых невелико); наиболее
наглядное - с помощью схемы алгоритма (СА). В то же время одна и та
же СА может соответствовать различным вычислительным процессам; СА
совместно с её интерпретацией (толкованием, раскрытием терминов, про-
цедур, обозначений и т.п.) и является представлением конкретного вычис-
лительного процесса. Степень подробности СА и близости её к данному
вычислительному процессу может быть различной и определяется целью
представления СА.
В рассмотренном выше примере даётся словесное описание алгоритма.
Решение некоторой задачи на ЭВМ осуществляется в такой последо-
вательности (см. также [2], где подробно описывается полное построение
алгоритма). В соответствии с постановкой задачи и выбранной её
моделью составляется либо выбирается стандартное словесное описание
алгоритма, по которому строится и оптимизируется СА, а затем пишется
программа на одном из языков высокого уровня (Паскаль, С и т.д.) или на
машинном языке – Ассемблере. За этим следует отладка (проверка
правильности, верификация) программы на ЭВМ, для чего используется
так называемый контрольный пример, который придуман самим

10
О.Н. Паулин. Основы теории алгоритмов

программистом по результатам анализа задачи и может быть проверен


вручную. Контрольный пример должен проверять все возможные ветви
программы (схемы алгоритма); следует также убедиться, что программа
адекватна алгоритму. Анализируется алгоритм и его сложность
(выявляются узкие места в программе и определяется эффективность
алгоритма, для чего проводится тестирование). И только после
успешного решения контрольного примера и получения приемлемых ре-
зультатов тестирования можно вводить данные своей задачи и запускать
её на выполнение. Важным этапом решения задачи является составление
документации по всем предыдущим этапам (помните золотое правило:
оформляйте свои программы в таком виде, в каком вам хотелось бы
видеть программы, написанные другими!).
Итак, алгоритмом является всякая последовательность действий,
выполнение которой можно поручить вычислительной машине; подготовка
и решение задачи на ЭВМ сводятся к разработке, описанию и выполнению
алгоритма.

В.3. Базовые фрагменты схем алгоритмов

В теоретическом плане [3] СА – это ориентированный граф (совокуп-


ность вершин и связей между ними), вершины которого могут быть одного
из трёх типов (рис. В.1):
 функциональная (используется для представления функции f: X→Y,
т. е. арифметического выражения);
 предикатная (используется для представления предиката
p: X→{FALSE (ложь), TRUE (истина)}, т. е. логического выражения, опреде-
ляющего управление по одной из возможных ветвей);

11
ВВЕДЕНИЕ

 объединяющая (реализует передачу управления от одной


из двух входных ветвей к одной выходной ветви).
Отметим, что в практике объединяющие вершины не выделяются
(они ясны по умолчанию).
Из данных вершин графа составлены (рис. В.2) простейшие струк-
туры управления вычислительным процессом (базовые фрагменты СА).
Здесь В интерпретируется как булево выражение, а S 1 и S2 – как прог-
раммные операторы (процедуры). Схема на рис. В.2,а называется компо-
зицией (следованием) и записывается в виде S 1; S2. Схема на рис. В.2,б
называется альтернативой (выбором) и записывается в виде if B then S1
else S2; в частном случае S2= получается часто используемый сокращён-
ный оператор if B then S1. Схема на рис. В.2,в1 называется итерацией
(циклом или повторением); получили распространение 3 частных случая:
1) S2 = . Этому случаю соответствует оператор while B do S1.
2) S1 = . Этому случаю соответствует оператор do S2 while B или, в

эквивалентной форме, оператор repeat S2 until B .

3) S1 = S2 = . Схема вырождается в ждущую вершину (ждущие


вершины используются в СА процессов, управляющих событиями).

1
Строго говоря, схема рис. В.2,в не является структурой управления, так как использует
оператор goto.

12
О.Н. Паулин. Основы теории алгоритмов

Теоретически было показано [3], что любая СА может быть сос-


тавлена путём суперпозиции базовых фрагментов СА, изображённых на
рис. В.2 (теорема Дейкстра). Поскольку каждый из базовых фрагментов
имеет один вход и один выход, то у любой СА, составленной из этих
фрагментов, также будет один вход и один выход. СА, в которой
используются только базовые фрагменты, называется структурированной.
Этот же принцип (один вход и один выход) лежит в основе структурного
программирования.
Итак, совокупность трёх структур управления процессом вычислений

достаточна для построения любой СА. Но СА, полученная путём суперпо-


зиции этих структур, не обязательно будет простейшей или наиболее
естественной. Поэтому в практике допускается некоторое расширение
базового набора структур управления. Например, в некоторых случаях
удобнее использовать оператор множественного выбора (типа case…of).
Допускается также преждевременный выход из цикла – операторы
while…do и repeat…until, аккуратное применение оператора goto и др.

13
ВВЕДЕНИЕ

Во всех этих случаях выдерживается основной принцип управления про-


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

Контрольные вопросы

1. В каких случаях вычислительный процесс не является алгоритмом?


2. В чём суть проблемы алгоритмической неразрешимости? Почему
проблема алгоритмической неразрешимости более трудная, чем проблема
алгоритмической разрешимости?
3 Из чего следует необходимость уточнения понятия алгоритма?
Каковы подходы к его уточнению?
4. Какие виды обработки данных знаете Вы?
5. Каковы формы представления алгоритмов? Что у них общего и
чем они отличаются?
6. Какие основные блоки, используемые в СА, Вы знаете?
7. Какова последовательность действий при решении задачи на ЭВМ?
8. Что такое структуры управления вычислительным процессом? Как
они связаны с базовыми фрагментами СА?
9. Какие виды вычислительных процессов и алгоритмов Вы знаете?
10. Чем отличается тестирование программы от её отладки?

14
О.Н. Паулин. Основы теории алгоритмов

11. Как Вы понимаете неоднозначность СА? Что означает термин


интерпретация СА?

15

Вам также может понравиться