- •Содержание курса “Теория алгоритмов и вычислительных процессов”
- •I. Теория алгоритмов
- •Основные понятия теории алгоритмов
- •1.1. Предварительные сведения
- •1.2. Основные требования к алгоритмам
- •1.3. Необходимость математического понятия алгоритма
- •2. Типы алгоритмов
- •3. Способы представления (описания) алгоритмов
- •3.1. Исполнитель алгоритма
- •3.2. Строчная словесная запись алгоритма
- •3.3. Графическая форма записи
- •3.4. Управляющие структуры
- •4. Описание задачи и выбор алгоритма
- •5. Универсальные алгоритмические модели
- •Понятие конструктивного объекта
- •Понятие об алфавитных алгоритмах
- •5.3. Формализация понятия “алгоритм”
- •5.4. Схема построения алгоритмической системы
- •6. Рекурсивные функции
- •6.1. Примитивно-рекурсивные функции
- •6.1.1. Оператор суперпозиции (подстановки)
- •6.1.2. Оператор примитивной рекурсии
- •6.2. Частично-рекурсивные функции
- •Пример 6.2.2. Рассмотрим функцию
- •6.3. Тезис Черча
- •7. Машины Тьюринга (Поста)
- •7.1. Основные понятия машин Тьюринга
- •7.2. Способы представления машины Тьюринга
- •7.2.1. Представление машины Тьюринга совокупностью команд
- •7.2.2. Представление машины Тьюринга графом
- •7.2.3. Представление машины Тьюринга таблицей соответствия
- •7.3. Примеры построения машин Тьюринга
- •Вычислимость по Тьюрингу
- •7.5. Некоторые операции над машиной Тьюринга
- •7.5.1. Композиция машин Тьюринга
- •7.5.2. Итерация машины Тьюринга
- •7.5.3. Разветвление машин Тьюринга
- •7.4. Универсальная машина Тьюринга
- •7.5. Тезис Тьюринга
- •7.6. Машина Поста
- •9. Алгоритмическая разрешимость. Алгоритмические проблемы
- •10. Сложность алгоритмов и вычислений
- •Анализ скорости выполнения алгоритмов
- •Память или время
- •Временнáя сложность алгоритма
- •Оценка с точностью до порядка
- •Определение сложности
- •Сложность рекурсивных алгоритмов
- •Средний и наихудший случай
- •Общие функции оценки сложности
- •Скорость работы алгоритма в реальных условиях
- •19.5. Труднорешаемые задачи
1.3. Необходимость математического понятия алгоритма
Понятие алгоритма, в какой-то мере определяемое перечислением свойств 1 – 5, также нельзя считать строгим, поскольку в формулировках свойств использованы термины «величина», «способ», «простой», «локальный» и другие, точный смысл которых не установлен. В дальнейшем данное определение мы будем называть нестрогим (иногда его называют интуитивным) понятием алгоритма. Пользуясь интуитивным понятием алгоритма, можно описывать процесс решения той или другой задачи, но с его помощью нельзя убедиться в том, что описанный процесс представляет собой алгоритм.
Пока математика имела дело в основном с числами и вычислениями, а понятие алгоритма отождествлялось с понятием метода вычисления, необходимость в изучении самого понятия алгоритма не возникало. Поэтому понятие метода вычисления считалось интуитивно понятным и не требовало специальных исследований.
Дальнейший процесс развития вычислительных методов содействовал утверждению, что решение любой математической проблемы должно быть алгоритмическим. Такой мысли придерживались выдающиеся математики Р.Декарт, Г.Лейбниц, Д.Гильберт. Декарт развивал аналитическую геометрию с намерением сделать ее доступной для изучения алгебраическими методами, и тем самым достичь более полной алгоритмизации геометрии. Лейбниц также занимался уточнением и решением алгоритмических проблем. Ему принадлежит первая попытка создать автоматически действующую машину для решения таких задач, но попытка закончилась неудачно. Гильберт активно стимулировал алгоритмические исследования. В частности, среди 23 знаменитых проблем Гильберта, есть десятая: дано алгебраическое уравнение f(x1,…,xn) = 0 с целыми коэффициентами. Необходимо найти метод, с помощью которого за конечное число операций можно было бы установить, имеет ли это уравнение решения в целых числах. Метод, про который идется в этой проблеме, понимают ныне как алгоритм. В то время теория алгоритмов еще не была создана и речь могла идти лишь о позитивном решении этой проблемы. Тем не менее в 1970 г. советский математик Ю.В. Матиясевич доказал, что такого алгоритма не существует.
К началу 20 в. стали усложняться объекты, с которыми оперировали алгоритмы (появилась необходимость выполнять операции над векторами, матрицами, множествами, функциями и т. д.). Возникли проблемы, связанные с трактовкой элементарности тех или иных шагов алгоритма, понимаемого на интуитивном уровне. Другие проблемы были связаны с оценкой конечности и однозначности алгоритма. Возникла мысль, что не для всяких математических задач вообще можно найти процедуру решения, которая явилась бы алгоритмом, то есть появилась идея о том, что существуют алгоритмически неразрешимые проблемы. Для решения указанных проблем необходимо было дать точное определение алгоритма.
Возникает вопрос: так ли уж важно и необходимо иметь точное определение алгоритма, если и без него возможно составление и применение алгоритмов (причем, даже без употребления самого термина)? Тем более, что интуитивное понятие алгоритма хотя и не обладало строгостью, но было настолько ясным, что практически до 20 в. не возникало ситуаций, когда математики разошлись бы в суждениях относительно того, является ли алгоритмом тот или иной конкретный процесс. Положение существенно изменилось в начале 20 в., когда были сформулированы такие проблемы, алгоритмическое решение которых было не очевидным.
Действительно, для доказательства существования алгоритма необходимо просто решить данную задачу, пользуясь набором известных приемов, или в их отсутствии предложить новые приемы – в таких ситуациях достаточно и интуитивного понятия алгоритма, чтобы удостовериться в том, что описанный процесс есть алгоритм. Гораздо сложнее доказать факт невозможности построения алгоритма решения некоторой задачи (или класса задач) – без точного определения алгоритма эта проблема теряет смысл. То есть, только при наличии формального определения алгоритма можно сделать вывод о разрешимости или неразрешимости каких-либо проблем.
Другим основанием, потребовавшим построения точного определения алгоритма, явилось неопределенность понятия «элементарность шага» при выполнении алгоритмических действий. Пока математика изучала числовые объекты, действия с ними сводились к некоторой последовательности вычислительных операций, и элементарными считались арифметические операции, а также несколько логических, связанных с проверкой отношений между величинами (равенство, неравенство, больше, меньше и пр.). Однако позднее математика перешла к исследованию свойств и действий со сложными объектами – векторами, матрицами, множествами, функциями – и понятие элементарности шага алгоритма перестало быть очевидным. Например, можно ли считать элементарным шагом взятие интеграла или транспонирование матрицы?
Наконец, в тех ситуациях, когда задача допускает построение нескольких алгоритмов решения, то с теоретической и с практической точек зрения оказывается существенным вопрос их сопоставления и выбора наиболее эффективного алгоритма, что также невозможно без строгого определения алгоритма. Это также дает возможность для сравнения различных проблем по сложности алгоритмов их решения.
Впервые вера в универсальность алгоритмических методов была подорвана в 1931 г. работой К.Геделя, в которой было показано, что есть такие математические проблемы, которые не могут быть решены с помощью алгоритмов из некоторого точно определенного класса алгоритмов. Поэтому до уточнения понятия “алгоритм” в математике были распространены две точки зрения.
Все проблемы алгоритмически решены. Но алгоритм для решения некоторых из них пока не найден, потому что не достаточно способов в современной математике для его построения. Построение искомых алгоритмов – дело будущего.
Существуют классы задач, для решения которых вообще не существует алгоритма. То есть некоторые проблемы нельзя решать механически с помощью формальных соображений и вычислений.
Таким образом, в теории алгоритмов возникла совсем новая ситуация. До того времени, пока математики верили в возможность алгоритмического решения математических задач, не возникало потребности в уточнении понятия алгоритма: если для решения некоторого класса задач предлагался некоторый алгоритм, ученые доходили согласия считать его действительно искомым алгоритмом. И только доведение того, что не существует алгоритма для решения определенного класса задач, потребовало уточнения этого важного понятия.
Так возникла необходимость в точном определении понятия «любой алгоритм», т.е. максимально общем определении, под которое подходили бы все мыслимые виды алгоритмов. В 20-е гг. XX в. построение определения алгоритма стало одной из центральных математических проблем. Определение это, с одной стороны, должно было соответствовать сущности интуитивного понятия алгоритма, а с другой стороны, быть формально строгим. Попытки формулировки такого понятия привели к появлению в 30-х гг. XX века теории алгоритмов как самостоятельной науки, которая вместе с математической логикой изучает основные средства математики – методы доказательств, способы построения аксиоматических теорий, свойства математических процедур и пр. Когда же в 40-е – 50-е гг. началось бурное развитие вычислительной техники и наук, связанных с ее функционированием и использованием, то выяснилось, что в основе этих наук также должна лежать теория алгоритмов, поскольку компьютер может реализовать только такие процедуры, которые представимы в виде алгоритмов. Любая программа есть ни что иное, как запись алгоритма на языке, который может «понять» исполнитель – компьютер. Таким образом, с практической точки зрения также представляется важным уточнение понятия алгоритма.
Действительно, одно дело – доказать существование алгоритма, а совсем другое – доказать его отсутствие. Для этого необходимо знать точно, что такое алгоритм, и что такое “алгоритмически нерешенные проблемы”. Начиная с 1935 года, был предложен ряд таких уточнений. Математики согласились на том, что уточненные понятия адекватно выражают интуитивное представление об алгоритме. Для этого есть ряд оснований:
1. Доказано, что все известные на этот час уточненные понятия алгоритма эквивалентные между собой.
2. Все алгоритмы в точном понимании являются алгоритмами в интуитивном понимании.
3. Все известные алгоритмы в интуитивном понимании можно “перемоделировать” алгоритмами в точном понимании.
Доказать адекватность интуитивного и точного понятия алгоритмов невозможно потому, что не существует точного определения алгоритма в интуитивном понимании. Вместе с тем эта адекватность широко используется как гипотеза. Первым такую гипотезу в 1936 году высказал Алонзо Черч. Ныне она известна как гипотеза Черча. Эта гипотеза не может быть доказана математическими методами, так как она сформулирована на основании практического опыта и ее правильность подтверждается практикой. Аналогичная ситуация имеет место, например, в физике: законы Ньютона подтверждается практикой и не имеют математического доказательства.
Уточнение понятия алгоритма производится в рамках алгоритмических моделей. Модель определяет набор средств, использование которых допустимо при решении задачи, т.е. перечень элементарных шагов, способы определения следующего шага и т.п. Алгоритмические модели могут быть теоретическими и практическими. С теоретической точки зрения наибольший интерес представляют модели, которые, с одной стороны, были бы универсальными, т.е. позволяли бы описать любой алгоритм, а с другой стороны – максимально простыми, т.е. использовали бы минимум средств решения задачи. Требование простоты важно для того, чтобы выделить действительно необходимые элементы и свойства алгоритма и обеспечить доказательство общих утверждений об этих свойствах. В практических и прикладных моделях более значимым является удобство программирования и эффективность вычислений, поэтому их средства – набор элементарных шагов и пр.– намного богаче и сложнее, что затрудняет теоретический анализ.
