1. Атушева М.К. Основы теории алгоритмов

advertisement
МИНИСТЕРСТВО НАУКИ И ОБРАЗОВАНИЯ
РЕСПУБЛИКИ КАЗАХСТАН
ЗАПАДНО-КАЗАХСТАНСКИЙГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ им.М.УТЕМИСОВА
Атушева М.К.
ОСНОВЫТЕОРИИАЛГОРИТМОВ
Уральск-2004
УДК 519.7:519.876.5
Рецензенты:
доцент
кафедры
прикладной
математики
практической физики ЗКАТУ В.С.Молдагалиев ,
доцент кафедры математики ЗКГУ Б.В.Уланов.
и
В учебном пособии изложены основы теории алгоритмов: понятие
алгоритма на неформальном уровне, средства описания алгоритмов,
организация данных, алгоритмические системы по уточнению
понятия алгоритма, введение в основы теории параллельных
однородных структур.
Рассчитано на
преподавателей по информатике, студентов
специальностей «прикладная математика», «информатика», «учитель
информатики».
©Западно-Казахстанский государственный университет им. М.Утемисова,
2004г.
Предисловие
Массовое развитие класса персональных компьютеров (ПК) и
программных средств для них создало у многих пользователей, по
мнению известных в области информатики ученых, несколько
искаженное представление о современном состоянии компьютерной
информатики, ее тенденциях и перспективах.
Как правило, подавляющее большинство современных
компьютерных курсов сводится к «натаскиванию» слушателей на
работу с конкретными программными средствами для IBMсовместимых ПК либо к основам программирования в среде
популярных языков (Basic,Pascal, C и др.). При этом у начинающего
пользователя, в частности студентов специальностей по информатике,
формируется
искаженное
представление
на
современную
компьютерную информатику, сводимую сугубо к идеологии
персонального компьютера. При таком походе вырабатывается весьма
однобокое отношение к данной сфере человеческой деятельности, т.к.
упускается из виду ряд важных компонент компьютерной
грамотности: история развития современной ВТ, нынешнее ее
состояние и перспективы развития, без чего невозможно
формирование современного компьютерного мировоззрения.
Настоящее учебное пособие в определенной мере пытается
восполнить указанные недостатки при изучении раздела,
посвященного элементам теории алгоритмов –
теоретического фундамента основ информатики и вычислительной
техники.
Пособие состоит из трех разделов. Первый раздел, посвящен
введению в алгоритмизацию и организации данных. Здесь
рассматриваются понятие алгоритма, средства записи алгоритмов,
структуры алгоритмов и структуры данных. Материал раздела, в
основном ориентирован для специальностей «учитель информатики и
физики», «информатика и английский язык» и другие педагогические
специальности.
Во втором разделе рассматриваются некоторые алгоритмические
теории по уточнению понятия алгоритма. Описаны алгоритмические
системы Э.Поста, А.Тьюринга, А.Маркова, А.Черча, дано понятие о
их эквивалентности, рассматриваются некоторые неразрешимые
алгоритмические проблемы. Материал раздела ориентирован на
специальности «информатика», «прикладная математика» и может
рассматриваться в качестве спецкурсов для педагогических
специальностей по информатике. Практика обучения показывает, как
тяжело усваивается студентами программный материал по машинным
командам, по языку Ассемблер. Поэтому целесообразно обучение
основам алгоритмизации и практику построения алгоритмов
отработать на примере одного из формальных вычислителей – модели
машины Тьюринга (если не построение машин Тьюринга, то по
крайней мере их применение). Материал соответствует программе
Государственного стандарта для специальности
прикладная
математика. Но единого учебного пособия по разделу «Введение в
теорию алгоритмов» пока нет.
За пределами учебного пособия остался материал, связанный с
рекурсивными алгоритмами, рассмотрение классов сложности,
сортировки алгоритмов и некоторые другие, возможно, они будут
изданы как вторая часть учебного пособия.
Третий раздел
посвящен интенсивно развивающемуся
направлению современной информатики – теории параллельных
моделей вычислителей, в частности, теории однородных структур,
которые составляют основу теории параллельного программирования.
Рассматривается роль параллельных ОС-моделей для перехода к
параллельной не неймановской архитектуре, что позволит решить
проблему создания ЭВМ, необходимых для решения современных
теоретических, прикладных проблем науки. Материал дан в
ознакомительном плане.
Глава I
Алгоритмы и данные
В теории алгоритмов, развитой логиками в 30-х годах ХХ века,
были предугаданы основные концепции, заложенные в аппаратуру и
языки программирования. При этом математически эквивалентные
главные модели алгоритма,
на практике породили различные
направления в программировании. В настоящее же время основной
составляющей прогноза дальнейшего развития ВТ являются их
вычислительные
возможности,
поэтому
данный
вопрос
рассматривается на формальном уровне. Основу такого рассмотрения
в настоящее время составляют теория алгоритмов и вычислений.
В то же время, широкая известность понятия алгоритма в наше
время обусловлена развитием и широким применением электронновычислительной техники. Использование ЭВМ способствовало
уяснению того, что разработка алгоритма – необходимый этап в
процессе решения задач на ЭВМ и, что, в связи с этим, алгоритмы
представляют самостоятельную ценность как интеллектуальные
ресурсы общества. Когда задача имеет положительное решение,
описание вычислительного процесса носит интуитивный характер и
это допустимо в тех случаях, когда указание четко определенных
правил получения искомого решения задачи вполне можно считать
алгоритмом ее решения. Рассмотрим понятие алгоритма и его
свойства в этом аспекте, прежде чем перейти к строго
формализованному уровню понятия алгоритма.
§ 1.1. Понятие алгоритма
Понятие алгоритма относится к фундаментальным понятиям
математики и возникло задолго до появления ЭВМ. В данной главе
алгоритмизация рассматривается как внемашинный процесс. Но,
вместе с тем, современный уровень математизации и информатизации
общества, где алгоритмы ценны с точки зрения возможности
реализации
на ЭВМ (хотя не менее важно предварительное
доказательство их правильности или существования), определяет
основные линии изложения алгоритмизации, главной из которых
является ориентация на последующую реализацию построенных
алгоритмов с помощью одного из языков программирования.
Алгоритм – понятное и точное предписание исполнителю
выполнить конечную последовательность команд, приводящую от
исходных данных к искомому результату.
Исполнитель алгоритма – это тот объект или субъект, для
управления которым составлен алгоритм.
Система команд исполнителя – это вся совокупность команд,
которые исполнитель умеет выполнять.
Свойства
алгоритма:
понятность,
точность,
конечность,
массовость.
Понятность: алгоритм составляется только из команд, которые
входят в систему команд исполнителя.
Точность: каждая команда алгоритма управления определяет
однозначное действие исполнителя.
Конечность (или результативность): выполнение алгоритма
должно приводить к результату за конечное число шагов.
Свойство массовости: для каждого алгоритма существует свой
класс объектов, допустимых в качестве исходных данных, т.е.
свойство массовости означает применимость алгоритма ко всем
объектам этого класса.
Среда исполнителя: обстановка, в которой функционирует
исполнитель.
§ 1.2. Средства записи алгоритмов
В информатике используются определенные средства для
представления
алгоритмов,
рассчитанные
на
различных
исполнителей. Рассмотрим эти средства.
Словесная запись алгоритма. Ориентирована на исполнителя
алгоритма – человека. Команды
алгоритма нумеруют, чтобы можно было оформлять на них ссылки.
Рассмотрим в качестве примера словесной формы записи
классический алгоритм Евклида для нахождения наибольшего общего
делителя двух натуральных чисел.
1. Если числа равны, то взять первое число в качестве ответа и
закончить исполнение алгоритма, иначе перейти к пункту 2.
2. Определить большее из двух чисел.
3. Заменить большее число на разность большего и меньшего
чисел.
4. Перейти к п. 1.
Схемы алгоритмов. Схемы представляют алгоритм в наглядной
графической форме. Для записи команд используется естественный
язык с элементами математической символики.
Рассмотренный выше алгоритм Евклида представим в виде блоксхемы.
В записи команд используем известную из школьного курса
команду присваивания. ( см. схему 1).
Псевдокоды. Псевдокод – это система команд абстрактной
машины. Он представляет собой систему обозначений и правил для
единообразной записи алгоритмов. В псевдокоде обычно имеются
некоторые конструкции, присущие формальным языкам, что
облегчает переход от записи на псевдокоде к записи алгоритма на
формальном языке. Также в псевдокоде используются служебные
слова, смысл которых не меняется.
нач
а,в
a<>b
bbbb
a>b
a:=a-b
b:=b-a
a
кон
Схема 1
Рассмотрим запись на одном из псевдокодов алгоритма Евклида.
алг Евкл;
нач
ввод(а,в);
пока а=в
нц
если а>в
то а:=а-в
иначе в:=в-а
все
кц
вывод(а);
кон.
Языки программирования.
Формализованный, для
исполнения на ЭВМ, язык записи алгоритма называется языком
программирования. В настоящее время насчитывается свыше 3500
тысяч языков программирования, рассчитанные
на различные
классы, решаемых с помощью ЭВМ задач.
Языки
программирования можно классифицировать, основываясь на 1)
основное функциональное назначение и на 2) поддерживаемые
технологии программирования. Существует классификация языков в
зависимости от их реализации (интерпретаторы, компиляторы);
языки также подразделяются на процедурные и непроцедурные. В
рамках первого подхода выделяют четыре большие группы класса
языков:
- для обучения программированию;
- общего назначения;
- проблемно (предметно) ориентированные;
- параллельного программирования.
Запишем на одном из них языке Турбо Паскаль,
предназначенным для обучения программированию, наш
алгоритм Евклида:
Program evkl;
Var a,b:integer;
Begin
Read(a,b);
While a<>b do
If a>b then a:=a-b else b:=b-a;
Writeln(a);
End.
§ 1.3. Данные в алгоритмическом языке
Объект, явление, процесс и пр. любой природы становится
доступным компьютерной обработке только после представления его
в виде текста над конечным алфавитом. Т.е. независимо от
содержания и сложности любой данное в памяти ЭВМ выражается
последовательностью битов, а его значением может служить
соответствующее двоичное число. Однако, для человека описывать и
исследовать
сколь-нибудь
сложные
данные
в
терминах
последовательностей битов весьма неудобно. Поэтому даже в языках
программирования,
обрабатываемая
на
ЭВМ
информация,
представляется в виде значений более крупных и содержательных,
нежели бит, «строительных блоков» для организации произвольных
данных. Эти значения получают на основе понятия «тип данного».
Мы, для описания алгоритмов, используем псевдокод, поэтому будем
кодировать информацию с помощью данных этого языка.
Данное – это отдельный информационный объект, который имеет
имя, значение и тип. Данные в алгоритме подразделяют на
постоянные и переменные. Постоянные данные (константы) не
изменяют своего значения в
ходе выполнения
алгоритма.
Переменные могут изменять свои значения в ходе выполнения
алгоритма. Для обозначения данных используется идентификатор,
т.е. последовательность букв и цифр, начинающаяся с буквы.
Константа может обозначаться и собственным значением (числа 5,
3.4) или символическим именем (число ). Переменная всегда
обозначается символическим именем (х, А, Р5 и т.д.).
Тип данных определяет множество значений, которые могут
принимать данные, и множество операций, которые можно выполнять
с данными. Основные типы данных: целый, вещественный,
символьный, логический. Присваивание – основной способ изменения
значений данных. Команда присваивания в общем случае
записывается следующим образом:
<Идентификатор> := <выражение>;
§ 1.4. Структуры алгоритмов
Алгоритмы конструируются из отдельных базовых элементов, для
описания которых используется псевдокод и язык блок-схем.
1.4.1.Простые команды. Простая команда обозначает один
элементарный шаг переработки или отображения информации. К
простым командам относятся команды ввода, вывода и присваивания.
Например, ввод(а) – получение из внешнего источника значения
переменной; аналогично можно записать вывод (отображение
информации). Для изменения значения величины используется
команда присваивания: х:=х+1; в данном случае переменной х
присваивается значение, которое на 1 больше ее предыдущего
значения. Простая команда изображается на блок-схеме в виде
функционального блока, имеющего один вход и один выход.
Команда
1.4.2. Составные команды. Образуются из простых команд и
проверки условий. К составным командам относятся: команда
следования, команда ветвления и команда повторения (цикл).
К о м а н д а с л е д о в а н и я. Образуется из последовательности
команд, следующих одна за другой. В общем виде команда
записывается следующим образом:
Нач <действие>; <действие>; …; <действие> кон;
Здесь под действием понимается или простая или составная команда;
«нач» и «кон»- служебные слова, выполняющие роль скобок, наличие
которых представляет команду следования как единое действие,
состоящее из более простых.
Пример команды следования:
нач
ввод(а);
х:=а2+2;
у:=sqrt(а2+х2);
кон;
Блок-схема команды следования:
Действие
Действие
..
Действие
К о м а н д а в е т в л е н и я. Команда ветвления реализует выбор
одного из двух возможных действий в зависимости от условия. На
псевдокоде в общем виде записывается так:
если
<условие>
то
<действие 1>
иначе <действие 2>
все;
Действия, указанные после служебных слов то и иначе, могут быть
простыми или составными командами. При исполнении команды
ветвления выполняется только одно из действий: если условие
соблюдено, то выполняется действие 1, в противном случае –
действие 2. Блок-схема команды ветвления имеет вид:
услов
ие
Действие
1
Действие
2
Полная форма команды ветвления
.
Команда ветвления может использоваться в сокращенной форме
(коррекция). В коррекции, при несоблюдении условия, никакое
действие не выполняется. Запись на псевдокоде имеет вид:
если <условие>
то <действие>
все;
услов
ие
Действие
Сокращенная форма .
Примеры применения команды ветвления и коррекции:
1. если х>0
то у:=х+1
все;
2. если х>0
то
нач
у:=х;
р:=р+х;
кон
иначе у:=х2 ;
все;
К о м а н д а п о в т о р е н и я (ц и к л ). Команда повторения,
называемая также циклом, содержит условие, которое используется
для определения количества повторений.
Запись на псевдокоде команды повторения с предусловием
имеет вид:
п ока <условие>
нц
<действие>
кц;
Под действием понимается простая или составная команда. Правило
выполнения команды:
-проверяется условие;
-если условие соблюдено, то выполняется действие;
-снова проверяется условие.
Выполнение цикла завершается, когда условие перестает
соблюдаться. Для этого необходимо, чтобы команда, выполняемая в
цикле, влияла на условие.
Команда повторения с постусловием выполняется аналогично, только
условие проверяется после выполнения команды, а повторение
выполнения команды происходит в том случае, когда условие не
соблюдено, т.е. повторение производится до соблюдения условия
(поэтому этот цикл называют также циклом «до»). На псевдокоде
цикл с постусловием записывается в виде
повторять <действие>
до <условие>;
Условие
Действие
Действие
Услов
ие
Цикл с предусловием
Примеры применения команд повторения.
Вычисление факториала.
нач
ввод(n);
f=1;
k:=0;
пока kn
нц k:=k+1
F:=f*k;
кц
вывод(f); кон.
Цикл с постусловием.
2. сумма = xiy i
сумма:=0; i:=1;
пока i<=n
нц
сумма:= сумма+ xiyi ;
i:=i+1;
кц;
1.4.3. Основы структурного построения алгоритмов
Алгоритм конструируется на основе простых управляющих
структур. В качестве базовых при этом выбираются управляющие
структуры следования, ветвления, организации циклов. Все
перечисленные структуры допускают только один вход и один выход.
Более того, они составляют тот минимальный базис, на основе
которого можно создавать любой корректный алгоритм с одним
входом и одним выходом, без зацикливаний и невыполнимых
команд. Следование отражает сам принцип последовательного
выполнения команд алгоритма, пока не встретится изменяющая эту
последовательность команда. Ветвление определяет выбор одного из
возможных путей дальнейших вычислений; типичными командами,
обеспечивающими данную управляющую структуру, являются: если
А то В иначе С и команда выбора. Структура цикла реализует
повторное выполнение группы операторов,
выполняется некоторое логическое условие, типичными командами,
обеспечивающими данную управляющую структуру являются «пока
А нц действие кц» и «нц действие кц до», «для А нц действие кц».
Таким образом, базисные структуры определяют соответственно
последовательную (следование), условную (ветвление) и итеративную
(цикл) передачи управления в алгоритмах. При этом теоретически
любой корректный структурированный алгоритм может быть
разработан с использованием только структур следования, команд
ветвления и цикла.
Алгоритм строится в несколько этапов – сначала он формулируется в
самых общих чертах, а затем уточняется путем детализации более
крупных действий через более мелкие. Этот способ известен под
названием метода пошаговой детализации или метода «сверху вниз».
Приведем примеры построения алгоритмов, при этом, как и в
школьном псевдокоде, оформляется заголовок алгоритма.
1.Задана квадратная матрица А =[aij], i>=1, j<n. Найти сумму всех
положительных элементов этой матрицы.
алг сумма_полож;
нач
ввод(ai,j);
сумма:=0;
нц
j:=1;
нц
если aij>0
то сумма:=сумма+ aij;
все;
j:=j+1;
кц
до j> n;
i:=i+1;
кц
до i > n
кц;
вывод(сумма); кон.
2.На интервале [2,n] найти натуральное число с максимальной суммой
делителей.
алг сумма_делит;
нач
ввод(N); Sum_max:=1; chislo:=1;
i:=2;
пока i<=n
нц sum:=0;
k:=1;
пока k<=I div2+1
нц
если I mod k = 0
то sum:=sum+k
все;
k:=k+1;
кц;
sum:=sum+I;
если sum>sum_max
то sum_max:=sum;
chislo:=i
все;
i:=i+1;
кц;
вывод(sum_max) кон.
1.4.4.Вспомогательные (подчиненные) алгоритмы
При решении задачи, она может быть разбита на более простые
подзадачи. Если для какой-то подзадачи уже построен алгоритм, то он
может быть включен в состав разрабатываемого алгоритма решения
задачи.
Готовые алгоритмы, целиком, включаемые в состав разрабатываемого
алгоритма, называются вспомогательными или подчиненными
алгоритмами в отличие от главного или основного алгоритма, в
состав которого они включаются. В псевдокодах используются
специальные правила оформления вспомогательных алгоритмов. В
заголовке вспомогательного алгоритма следом за именем в круглых
скобках указывается список формальных параметров. В списке
формальных параметров указываются имена входных и выходных
величин. Таким образом, при ссылке на вспомогательный алгоритм, в
основном
алгоритме
задаются
значения
входных
для
вспомогательного алгоритма
величии, а после исполнения
вспомогательного алгоритма, можно будет получить результаты его
исполнения – значения соответствующих переменных основного
алгоритма. Ссылка на вспомогательный алгоритм в основном
алгоритме реализуется с помощью команды вызова вспомогательного
алгоритма. Команда имеет вид:
<Имя_ вспомогательного алгоритма>(<список фактических параметров>);
Указанные в команде фактические параметры подставляются
вместо формальных параметров при исполнении вспомогательного
алгоритма. Исполнение команды вызова вспомогательного алгоритма
означает исполнение, вызываемого ею, вспомогательного алгоритма.
КВУР(а,в,с,х1,х2); - это команда вызова алгоритма решения
квадратного уравнения ах2 + вх + с =0 в качестве вспомогательного
алгоритма. Здесь а,в,с – фактические параметры, которые будут
подставлены вместо формальных параметров в вспомогательном
алгоритме; х1, х2 – результаты исполнения вспомогательного
алгоритма, которые будут использованы в основном алгоритме.
алг четн_корни;
нач
ввод(а,в,с);
КВУР(а,в,с,х1,х2);
если х1 mod х2 =0
то вывод(«четные корни»)
иначевывод(«нечетные корни»);
кон.
Вспомогательный алгоритм имеет вид:
алг КВУР(,,,1,2);
нач
D:= 2 – 4**;
если D>=0 то нач 1:=- - sqrt(D); 2;=- + sqrt(D);
вывод(1,2) кон
иначе вывод(«действит. корней нет»)
все;
кон.
Здесь ,,,1,2 – список формальных параметров вспомогательного
алгоритма.
§1.5. Структуры данных
Для построения алгоритмов чрезвычайно важны
способы
организации действий – допустимые управляющие структуры. Они
рассмотрены нами выше. Не менее важны и способы организации
информации – структуры данных (на всех уровнях их представления).
Программа – это алгоритм, представленный на одном из языков
программирования.
И,
следовательно,
является
описанием
последовательности действий (операций), которые необходимо
осуществлять с некоторой совокупностью данных.
Разрабатывая модель для решения на ЭВМ нужной задачи,
пользователь ставит в соответствие элементам соответствующей
предметной области, некоторые математические объекты и
характеризует связи между этими объектами. Этим он определяет
логическое представление данных.
Выбирая для решения задачи конкретный алгоритмический язык,
пользователь фиксирует присущие этому языку средства описания
выделенных ранее математических объектов. Этим определяется
синтаксическое представление данных.
Наконец, устройство конкретной ЭВМ и особенности трансляции
определяют внутреннее представление данных - их размещение в памяти
вычислительной машины.
Задачи, решаемые на ЭВМ, являются математическими моделями
процессов и явлений реальной жизни. В математической модели
находят отражение наиболее существенные связи между реальными
объектами. Модели реальных объектов вместе с присущими им
связями образуют структуры данных, процесс обработки которых и
описывается с помощью алгоритмов.
Разные классы решаемых на ЭВМ задач характеризуются и
разными структурами данных, что
находит
отражение
и
в
соответствующих
языках
программирования. Языки, ориентированные на решение различных
классов задач,
используют и различные способы представления и обработки
структур данных. При решении задачи на ЭВМ, подобно тому, как
структуры разнообразных алгоритмов отображаются на структуру
машинного языка, так и разнообразные структуры данных
отображаются на структуру машинной памяти. Поэтому грамотное
оперирование логическим уровнем представления данных является
необходимым условием грамотного программирования структур
данных.
Память ЭВМ имеет дискретную структуру и
состоит из
элементов, называемых ячейками. Каждая ячейка может содержать
одно значение, называемое машинным словом. Ячейки нумеруются
следующими подряд натуральными числами. Таким образом, память
ЭВМ представляет собой линейную последовательность ячеек.
1.5.1.Простые переменные.
Простые переменные описывают структуры, состоящие из одного
элемента, поэтому каждая простая переменная характеризуется одним
значением. При отображении на память ЭВМ имени простой
переменной ставится в соответствие номер ячейки памяти, в которой
хранится значение этой переменной (в современных ЭВМ значения
простых переменных занимают, в основном, более одной ячейки,
например, значение символьной переменной, целого числа).
1.52. Простейшие статические структуры – массивы, записи .
Массив представляет структуру, состоящую из упорядоченной
совокупности однотипных элементов- компонент массива, которые
являются переменными с индексами.. Тип компонента называется
базовым типом массива. Математическими прообразами массива
являются векторы и матрицы с числовыми компонентами. В языках
программирования все элементы массива объединяются общим
именем – идентификатором массива. Массив является переменной
структурированного типа. Массиву присваивается имя, с помощью
которого можно будет ссылаться на него, как на единое целое, так и
на любую из его компонент.
В нашем псевдокоде массив будет описываться следующим
образом: < имя массива >[< индекс>];
Переменная с одним индексом описывает одномерный массив.
Значения элементов одномерного массива хранят в памяти ЭВМ
также в виде последовательности, т.е. структура одномерного массива
однозначно отображается на структуру памяти ЭВМ. Это свойство
используется для отображения других структур данных (стек, очередь
и др.) на одномерный массив и, следовательно, соответствует
отображению их на память ЭВМ.
Переменные с двумя (и более) индексами служат для описания
многомерных массивов. Двумерный массив состоит из элементов,
образующих прямоугольную таблицу. В этом случае первый индекс
обозначает номер строки, а второй индекс – номер столбца таблицы,
на пересечении которых и расположен элемент.
При отображении двумерного массива на одномерный элементы
двумерного массива располагаются в виде последовательности
(строка за строкой или столбец за столбцом). При отображении по
строкам номер k элемента двумерного массива а[I,j]
в
последовательности может быть вычислен по формуле k=(i-1)+j, где n
– число элементов в строке двумерного массива.
Массив как структура данных характерен тем, что с помощью
индексов обеспечивается прямой доступ к любому элементу массива,
поэтому операции выбора элемента массива или записи в массив
сводятся к вычислению значений индексов.
Когда нужно использовать массивы?
1.Когда все данные должны быть представлены в памяти для
обработки. Классическим примером является сортировка численных
значений, т.е. их упорядочение по возрастанию или убыванию: когда
в память вводится последнее значение, его необходимо сравнить со
всеми предыдущими, а для этого ими всеми надо располагать. А вот в
примерах на определение максимального, минимального элемента,
среднего значения, скользящего среднего и т.п. такое хранение
данных в памяти не обязательно.
2.Когда результаты вычислений или промежуточные переменные,
содержащиеся в нескольких ячейках памяти, все должны быть
сохранены в памяти и несут одинаковую логическую функцию». Эти
ячейки могут быть сгруппированы под одним именем и образуют
массив.
Предположим, нужно подсчитать число вхождений всех 33 букв
алфавита в некотором тексте. Для этого нужно иметь счетчик для
запоминания вхождений буквы «А», еще один счетчик для подсчета
вхождений буквы «Б» и т.д. и 33-й счетчик для подсчета вхождений
буквы «Я».
Таким образом, все 33 счетчика выполняют одну и ту же
логическую функцию. Сгруппируем их под одним именем, например,
СЧЕТЧИК, имеющий размер 33; его индекс изменяется от 1 до 33,
что позволяет различать 33 счетчика, соответствующих 33 буквам
алфавита: СЧЕТЧИК(1) содержит число вхождений «А»,
СЧЕТЧИК(2) содержит число вхождений «Б» ,..., вплоть до
СЧЕТЧИКА(33), содержащего число вхождений «Я».
Записи. На практике часто требуется обрабатывать таблицы
(экзаменационная ведомость группы и т.п.) , в первом столбце могут
располагаться фамилии студентов (каждая фамилия – это строка
символов), во втором столбце – полученные оценки (целые числа).
Т.е. таблица не может быть представлена двумерным массивом, т.к. не
выполняется требование однотипности элементов. Для представления
совокупностей такого типа вводится понятие записи. Элементами
записи являются поля. Сама запись и каждое поле имеют имя. В
простейшем случае каждому полю соответствует простая переменная
стандартного типа. В общем случае каждое поле может иметь
достаточно сложную структуру, являться, например, массивом или
записью. В случае экзаменационной ведомости запись будет иметь
два поля: первое поле – одномерный массив элементов строк, второе –
одномерный массив элементов целого типа.
1.5.3. Строковые данные
Строка – последовательность символов из некоторого алфавита.
Подстрока – группа подряд расположенных символов строки.
Основные операции над строками:
- последовательный перебор символов строки;
- включение в строку нового символа;
- исключение из строки заданного символа;
- включение или исключение подстроки.
В современных версиях ЯВУ программирования
введены
дополнительные средства, облегчающие работу со строками. Поэтому
не требуется специальных средств отображение строк на массив: в
современных языках программирования, в частности Паскале, к
символу строки можно обратиться как к элементу массива. В нашем
псевдокоде мы также будем придерживаться этих современных
подходов.
Описание строки символов на используемом нами псевдокоде может
быть записано следующим образом:
х: строка[12]; р: строка;
у:=’’; - значением переменной у является пустой символ (пробел);
Для подсчета числа символов строки у используется функция длин(у),
значением которой является число букв строки у.
Примеры алгоритмов.
1.Исключить из данного слова буквы «а» :
алг число_букв;
прмн у,x:строка;
i:цел;
нач
ввод(у);
барабан
х:= ’’;
х=’’
i:=1;
1
пока i<= длин(у) да да да да да да да нет
нц
если у[i] =/
нет да нетда нет да нет
то х:=х+
б - - р -- б -- н
все
i:= i+1;
2
3 4 5 6 7 8
кц
вывод(х);
брбн
кон.
Слева от алгоритма продемонстрировано пошаговое исполнение
алгоритма. На наш взгляд этот способ исполнения эффективен для
построения именно того алгоритма, который решает данную задачу.
Т.е. – это способ проверки правильности построенного алгоритма.
Также он способствует правильному построению в алгоритме именно
тех команд, которые задаются тем или иным действием.
1.5.4.. Полустатические структуры - стеки, очереди
Стек(stack) - структура данных, в которой новый элемент всегда
записывается в ее начало (вершину) и очередной читаемый элемент
также всегда выбирается из ее начала. Здесь используется принцип
«последним пришел – первым ушел » или LIFO (Last In – First Out).
Примерами стеков могут служить:
-магазин пистолета – классический пример стека;
-железнодорожный тупик;
-труба с одним запаянным концом, куда помещают разноцветные
«бочонки».
Последний пример в наибольшей степени соответствует
программистскому понятию стека: заглядывая в трубу, мы можем
видеть, что бочонков в трубе нет, или видеть цвет верхнего бочонка,
но не можем видеть, есть ли бочонки под верхним, сколько их и каких
они цветов.
Элемент стека, который в данный момент можно взять, т.е. самый
«верхний» (верхнее колечко на пирамидке, последний загнанный
вагон в тупик и т.п.), называется вершиной стека. Если число
элементов в стеке не может превышать некоторой величины, то стек
называют ограниченным, а максимальное число элементов в нем –
глубиной стека. Стек, в котором нет ни одного элемента, называется
пустым.
Стек можно отобразить на одномерный массив a[1],a[2],…,a[n].
Для указания вершины стека можно использовать индекс i. При
записи в стек указатель вершины будет сдвигаться в сторону конца
массива, при чтении из стека указатель стека будет перемещаться в
сторону начала массива. Значение i=0 перед чтением из стека служит
признаком того, что стек пуст, а значение i= n перед записью в стек –
признаком того, что стек переполнен.
Отображение стека на массив из пяти элементов можно
изобразить следующим образом:
i
«верш
ина»
Организация стека
Для работы со стеком применяются операции:
- добавления элемента в стек,
- исключения элемента из стека,
- считывания содержимого верхнего элемента,
-определения, пуст ли стек.
Рассмотрим алгоритм записи элемента в
стек и чтения элемента из стека.
алг запись_в_стек;
нач
если in
то нач i:=i+1;
a[i]:=y;
кон
иначе вывод(«переполнение cтека»)
все;
кон;
алг чтение_из_стека;
нач
если i=/=0
то нач x:=a[i];
i:=i-1; кон
иначе вывод («стек пустой»);
все;
кон.
Всякий раз, когда возникает понятие уровня, можно использовать
стек. Это происходит при использовании подпрограмм, при играх,
управлении памятью, использовании скобок в арифметических
выражениях и т.п.
Управление адресами возврата в инструкции gosub (Бейсик)
также выполняется при помощи стека. При каждой инструкции
gosub происходит добавление в стек, при каждой инструкции return –
удаление из стека (инструкция return всегда отсылает к адресу в
вершине стека). Если имеется слишком много одновременных
инструкций gosub в программе, стек полон (сообщение об ошибке:
OUT OF MEMORY).
На компьютере, использованном для этой проверки, разрешаются
одновременно 638 инструкций gosub.
Когда стек пуст, но из него хотят удалить элемент, это значит
имеется return без gosub( сообщение об ошибке: RETURN WITHOUT
GOSUB).
Стек удобен для вычисления значения постфиксного
арифметического выражения, представленного в обратной польской
(бесскобочной) записи. Выражение А+В в инфиксной записи (обычно
используемая запись) в постфиксной записи выглядит так: АВ+.
Приведем пример алгоритма для стекового калькулятора. Вычислить
значение формулы А(В+С)+Д, постфиксная запись которой имеет
вид: АВС+*Д+ где А=5, В=7, С=8, Д=25.
алг вычисление;
нач
ввод_в_стек(5);
ввод_в_стек (7);
ввод_в_стек (8);
сложить;
умножить;
ввод_в_стек(25);
сложить;
вывод;
кон.
Последовательные состояния стека при выполнении
этого алгоритма изобразим на рисунке:
5
7
8
15
8
7
5
75
25
100
75
5
Как видно из примера, длина стека может изменяться в процессе
его использования, но эти изменения не должны выходить за пределы
фиксированного значения (i=n – признак переполнения стека),
поэтому стек – полустатическая структура данных.
Очередь(queue). Очередь – хорошо известные структуры
данных, организованные по принципу «первым пришел – первым
ушел
Эта структура содержит переменное число элементов (возможно,
нуль), два из которых являются особыми: первый называется головой,
а последний – хвостом очереди. Над очередью можно производит две
операции – помещать в нее элемент или брать из нее элемент, но
помещают после последнего элемента очереди, а берут первый
элемент очереди.
Перед операцией:
взять
Голова
После операции:
Хвост
Голова
поместить
Хвост
Элементы, находящиеся в середине очереди, между ее первым и
последним элементами, недоступны для обработки. Для отображения
очереди используется одномерный массив a[1],a[2], … ,a[n]. При этом
нужно учесть следующие моменты:
-размер очереди;
-пустая очередь;
-полная очередь;
-очередь сдвигается вправо.
В случае очереди, в отличие от стека, поступают следующим
образом: рассматривают индексы головы и хвоста по модулю
массива. Это означает, что, если размер массива равен 50 и индекс
хвоста принимает значение 51, то рассматривают 51 по модулю 50,
т.е. остаток от деления 51 на 50, т.е. здесь 1. Тогда речь идет о
циклической очереди, поскольку за последним элементом массива
идет первый.
a[1]
i
«Голова
a[2]
a [3]
j
«Хвост»
a [4]
a [5]
Очереди используются, когда нужно имитировать реальную
очередь (к окошку...); они позволяют исследовать изменения числа
людей в очереди, когда изменяются некоторые параметры.
Очереди используются также в операционных системах больших
компьютеров
для
управления
ресурсами
при
мультипрограммировании.
Алгоритмы записи в очередь и чтения из очереди могут быть
представлены в виде:
алг запис_в_очер;
нач
a[i]:=y;
если j=/=n
то j:=j+1;
иначе j:=1;
все;
если j=1
то вывод(«переполнение очереди»);
все;
кон.
алг чтение_из_очер;
нач
х:=a[i];
если i =/=n
то i:= i +1;
иначе j:=1;
все;
если i:=1
то вывод(«пустая очередь»);
все;
кон.
Глава 2
Основы теории алгоритмов
В теории алгоритмов были предугаданы основные концепции,
заложенные в аппаратуру и языки программирования на ЭВМ.
Главные модели алгоритма математически эквивалентны, но на
практике породили разные направления в программировании. В
настоящее время, направления дальнейшего развития, в первую
очередь,
вычислительных
возможностей
ЭВМ,
влияния
последующего развития ЭВМ на жизнь человечества, пытаются
рассмотреть на формальном уровне. Основу такого рассмотрения
составляет теория алгоритмов и вычислений, элементы которой
неформально будут рассмотрены в данной главе.
2.1. Уточнение понятие алгоритма. Алгоритмическая система
Э.Поста
Исследование математиками проблемы уточнения понятия
алгоритма поставило такую задачу: понятие алгоритма может быть
уточнено лишь путем описания некоторого специального класса
алгоритмов, обладающего таким свойством: для любого
произвольного алгоритма можно построить эквивалентный ему
алгоритм из этого класса. Алгоритмы такого специального вида
должны использовать конечное число каких-либо элементарных
операций, причем операции любого алгоритма должны быть такими,
чтобы их можно было свести к совокупности операций из этого
набора. Набор операций, позволяющий реализовать любой алгоритм,
называется алгоритмически полным. Математики предложили
несколько вариантов уточнения понятия «алгоритм». Мы рассмотрим
несколько
алгоритмических
систем:
Э.Поста,
А.Тьюринга,
А.Маркова, теория рекурсивных функций.
Прямое определение алгоритма впервые было дано А.Тьюрингом
и Э.Постом в 1936 году почти одновременно с подходами ЧерчаКлини. В основе их подхода лежит определение специальных
абстрактных автоматов (машин), «класс реализуемых которыми
алгоритмов
было
предложено
рассматривать
в
качестве
исчерпывающего, т.е. любому мыслимому алгоритму соответствует
подходящий абстрактный автомат, его реализующий».
2.1.1. Преобразование информации по Посту
Эмиль Леон Пост – американский математик, в 1936 году ввел
уточнение понятия алгоритма. За несколько лет до появления
универсальных вычислительных машин, в абстрактной форме были
определены и сформулированы их основные принципиальные черты.
Таким образом, одна из первых моделей алгоритма – это абстрактная
вычислительная машина. В основе теории уточнения понятия
алгоритма в алгоритмической системе Э.Поста лежит алфавитный
подход к преобразованию информации.
Алфавит - любая конечная совокупность попарно различимых
символов. Символы алфавита называют буквами этого алфавита.
Любая конечная последовательность букв некоторого алфавита
называется словом в данном алфавите.
Например, множество {a; } – алфавит; a,  - буквы этого алфавита;
ааа, ааа, , аааа, аа, ...– слова этого алфавита.
Алфавитный способ представления информации универсален: любую
информацию всегда можно записать алфавитным способом.
Практически, из школьного курса информатики вам известно, что:
- одна и та же информация может быть записана в различных
алфавитах;
- информацию, представленную в одном алфавите можно записать,
или правильнее закодировать, в другом алфавите.
- коды различных слов различны.
Обобщенно эти сведения из школьного
представлены в виде следующей таблицы.
Типы информации
1 Символ.
2 Целое число.
3 Вещественное
число.
4 Графическая
(пиксель).
5 Звуковая.
курса
могут
быть
Способ
Обобщение
кодирования.
1(2)
байт, К о н е ч н а я
т.е.8(16)битов.
2 байта, т.е. 16 последовательность
битов.
4 байта, т.е. 32 букв конечного
битов.
24
бита
алфавита
6
(≈16*10 цветов)
8
бит
(16
{ 0 , 1 }.
бит.регистр)
Из таблицы следует, что информация, представленная в любом
алфавите, может быть записана в двоичном алфавите. Делается это
следующим образом: каждая буква исходного алфавита заменяется
словом (кодом) двоичного алфавита. При этом соблюдаются
следующие условия:
а) двоичные коды букв исходного алфавита должны быть
одинаковой длины, например, длины n;
б) коды различных букв исходного алфавита должны быть
разными.
Это необходимые условия для восстановления исходного слова.
Правило восстановления исходного слова::
-весь массив двоичного кода разбивается на слова длиною в n двоичных букв;
-заменить каждое двоичное слово соответствующей ему буквой исходного
алфавита;
Применение этого правила требует определения длины двоичных
слов. Предположим, что исходный алфавит имеет t букв. n – длина
двоичных слов; k – количество всех двоичных слов длины n.
Тогда количество всех возможных двоичных слов длины n равно:
k = 2n .
При этом очевидна необходимость выполнения условий:
k >= t , или 2n >= t.
Т.е. для того, чтобы двоичные коды различных букв были
различными, необходимо, чтобы число двоичных кодов длины n
было не меньше числа букв исходного алфавита.
Для нахождения длины двоичных кодов n нужно в это неравенство
подставить значение t.
Приведем пример. Слова 34 и 526, записанные в алфавите
0,1,2,3,4,5,6,7, представить в двоичном алфавите.
t = 7, следовательно из неравенства 2n >= t имеем 2n >= 8, тогда n = 3.
Представим буквы исходного алфавита в двоичном алфавите:
Буквы
исходного
алфавита
Двоичные
коды букв
0
1
2
3
4
5
6
67
00 001 00 00 00 00 006 00
0
2
3 4
5
7
Исходные слова запишутся так: 34 – 011100, а 526 – 101010110.
Таким образом, в двоичном алфавите можно записать информацию,
представленную в любом другом алфавите, и, следовательно,
двоичное кодирование может быть названо универсальным способом
представления информации. Практические знания, полученные вами
из школьного курса, информатики получили строго обоснование.
2.1.2. Алгоритм Поста
Перейдем к рассмотрению содержания алгоритмической системы
Поста. Содержание алгоритмической системы Поста составляют
следующие основные положения:
- любая информация перед обработкой приводится к стандартному
виду, т.е. приводится к некоторому удобному алфавиту, а потом
кодируется в виде слов двоичного алфавита;
- в качестве исходных данных могут использоваться только двоичные
слова;
- каждое данное двоичное слово кодируется в другое двоичное слово
побуквенно, буква за буквой; для этого Пост ввел шесть
элементарных операций, каждая из которых выполняется по
отдельному приказу.
Алгоритм Поста - это набор приказов. Легко убедиться, что все
требования, предъявляемые к алгоритмам, выполняются и для
алгоритмов Поста. Например, если говорить о свойстве дискретности
алгоритма, то алгоритм Поста имеет дискретную структуру. Алгоритм
Поста – это последовательность пронумерованных приказов (команд).
Каждый приказ понятен, следовательно, доступен – свойство
понятности алгоритма. Каждая команда однозначно определяет
действие исполнителя, в данном случае машины Поста. Выполнение
последовательности приказов всегда приводит к результату за
конечное число шагов.
Выполнение свойств алгоритма станет очевидным при рассмотрении
машины Поста.
2.1.3. Машина Поста
«Абстрактная машина Поста» - это бесконечная информационная
лента, разделенная на секции (клетки). В каждой клетке может либо
стоять метка, либо пусто, т.е.
информация представляется в двоичном алфавите: наличие метки
– 1, отсутствие – 0.
До начала работы машины метки на ленте распределяет человек.
Информация о том, какие секции пусты, а какие отмечены, образует
состояние ленты. Вдоль информационной ленты движется каретка.
Она может передвигаться шагами: один шаг – смещение на одну
клетку вправо или влево. Клетка, у которой установлена каретка,
называется текущей.
Лента

Каретка
Состояние ленты с указанием места расположения каретки задает
состояние машины в данный момент времени.
Цель работы машины Поста – замена начального состояния ленты
конечным.
Назначение машины Поста – преобразование записи на
информационной ленте.
Данные
–
определенная расстановка
меток в
клетках
информационной ленты.
Действия машины Поста – с помощью каретки машина Поста
может:
- распознать, клетка пустая или помеченная;
- стереть метку в текущей клетке;
- поставить метку в пустую текущую клетку.
Система команд машины Поста: (буква nобозначает номер текущей
команды)
n. m
n.
m
n.  m
n.
m
a
n. ?
b
Сдвиг каретки на одну позицию вправо и
Переход к команде номер m;
Сдвиг каретки на одну позицию влево и
переход к команде номер m;
В текущую пустую клетку поставить метку
и перейти к команде m
Стереть метку в текущей клетке и перейти к
команде m
Проверка состояния клетки; если клетка пустая,
то перейти к команде, а иначе перейти к команде
b.
n. !
Остановка машины.
2.1.4. Примеры алгоритмов Поста
Пример 1. Начальное состояние информационной ленты:
....
...


1. 2
2.  3
3. !
По этой программе добавляется метка справа от данной.
Конечное состояние информационной ленты:
...


...

Пример2. Выполнить на машине Поста программу:
1.  2
2. 3
2
3. ?
3
4.
5
5.  6
6. !





Рассмотренные примеры записи различных алгоритмов в виде
программ для машины Поста позволяют сделать вывод о том, что
вообще всякие алгоритмы, представленные в любой другой форме,
могут быть записаны в виде таких программ. Иначе говоря,
программа для машины Поста – универсальная форма записи любого
алгоритма. Это предложение и является основной гипотезой,
высказанной Э.Постом. Справедливость ее не может быть строго
доказана, т.к. основывается лишь на том, что все известные в
настоящее время алгоритмы могут быть заданы в такой форме.
Можно предположить, что и любой алгоритм, созданный в будущем,
также можно будет представить как программу для машины Поста.
2.2. Последовательные модели вычислителей
(машины Тьюринга)
До 30-х годов 20-го века понятие алгоритма носило сугубо
интуитивный характер. Этот подход к определению понятия
алгоритма рассмотрен нами в гл.1. Такое положение было вполне
допустимо, пока дело касается задач, имеющих положительное
решение, когда указание четко определенных правил получения
искомого решения задачи вполне можно было считать алгоритмом ее
решения. Совершенно иначе обстоит дело, когда задача или класс
задач могут и не иметь решения. В этом случае требуется строго
формализованное понятие алгоритма, чтобы иметь возможность
доказать его отсутствие и избежать двусмысленностей. Такое понятие
было определено в середине
30-х годов 20-го века в двух
эквивалентных формулировках: на основе рекурсивных функций
(Д.Гильберт, К.Гедель, С.Клини) и абстрактных автоматов
(А.Тьюринг, Э.Пост). В настоящее время теория алгоритмов и
математическая логика образуют фундаментальную основу
современной вычислительной техники, позволяющую решать любые
алгоритмически описанные задачи.
Точное определение понятия алгоритма было дано А.Тьюрингом в
1936 году. Его подход также базируется на понятии алфавита.
2.2.1. Понятие машины Тьюринга
Алфавит – непустое конечное множество символов, элементы
алфавита называются его буквами. Слово в алфавите  есть конечная
последовательность (а может быть и пустая) его букв. Слово в
алфавите  имеет вид а0а1...аn , где аi. Множество всех слов в
алфавите  обозначают *.
Основная операция на словах – операция приписывания слова к
слову: если дано слово А, имеющее вид а0а1...аn и слово В вида
в0в1...вm , то можно образовать новое слово вида
а 0а1...аn
в0в1...вm ,, полученное конкатенацией слов А и В. Пустое слово
обозначается через  и А=А=А.  - внешний алфавит, S
–
внутренний алфавит или алфавит состояний.
Символы , R, L не входят в эти алфавиты. R- вправо, L-влево.
Команды имеют вид.
qa  rb - находясь в состоянии q и наблюдая состояние а, перейти в
состояние r и напечатать букву b.
qa  rbR
qa  rbL, где
(q,r  S, а,b  ).
Список команд или программа (в алфавите , S ) есть конечная
последовательность команд.
Машина Тьюринга М с внешним алфавитом  порождает
функцию, перерабатывающую некоторые слова в алфавите  в слова
этого же алфавита .
2.2.2. Конструкция машина Тьюринга
Машина Тьюринга (МТ) является важным инструментом
исследования в современной теории алгоритмов и вычислимости.
Конструкция машины Тьюринга в абстрактной форме предвосхитила
многие основные принципы современных ЭВМ. Классическая
машина Тьюринга состоит из трех компонент: конечный автомат,
сканирующая головка, внешняя лента.
КА
Конечный автомат
Сканирующая головка
...
Sj-p
...
Sj-1
Sj
Sj+1
...
Внешняя лента
S = {□, s1 , s2 , … , sn } - внешний алфавит МТ;
□ – пустая ячейка ленты.
Слово, записанное на ленте – конфигурация всех состояний
ячеек, читаема слева направо; конечное слово – слово, имеющее
конечное число вхождений символов sk (k=1, … , n).
Бесконечная в обе стороны лента разбита на ячейки; каждя ячейка
содержит строго один символ из алфавита
S. Ленту можно
рассматривать в качестве внешней памяти МТ.
Конечный автомат (КА) машины – устройство, находящееся в
каждый дискретный момент времени Т = 0,1,2,3,... в некотором
состоянии из конечного множества Q = {q0,q1,q2, … , qn }, где q0состояние определяет останов МТ.
При этом множества S и Q не имеют общих символов, т.е. SՈQ = Ø,
где Ø – пустое множество. Конечный автомат наделен внутренней
(оперативной) памятью, содержащей программу работы МТ, и
устройством управления
(УУ), обеспечивающим механизм
выполнения всех допустимых машиной операций. Множество
символов Q называется внутренним алфавитом МТ; МТ с внешним
S и внутренним Q алфавитами обозначают MTqs ; #S=s и #Q=q ,
где #A – мощность (количество элементов) произвольного Амножества.
Сканирующая головка (СГ) за единичный момент времени (такт
машины) сдвигаться вправо/влево на одну ячейку ленты и изменять
состояние сканируемой ею ячейки. СГ может оставаться и
неподвижной любое число таков машины.
Работа
MTqs
происходит в дискретные моменты времени и
управляется УУ конечного автомата: в зависимости от внутреннего qсостояния и
s-состояния сканируемой ячейки внешней ленты
производится в общем случае изменение обоих состояний и сдвиг
сканирующей головки. Если на некотором шаге КА переходит в q0состояние, то MTqs переходи в заключительное состояние и
останавливается, завершая вычисление.
Существуют универсальные машины Тьюринга, способные
моделировать любую конкретную MTqs . Более того доказано
существование универсальных МТ с бинарным S={0,1} внешним
алфавитом и машин, чья минимальная сложность SL = s*q
определяется наилучшим на сегодня значением SL=4*7=28 (включая
заключительное q0-состояние КА). Таким образом, столь просто и
прозрачно устроенный и функционирующий абстрактный автомат,
как МТ способен реализовать сколь угодно сложный алгоритм в
нашем современном понимании.
2. 2.3. Применение машины Тьюринга.
Рассмотрим простой пример. Машина Тьюринга задана внешним
алфавитом S={0,1,*}, алфавитом внутренних состояний Q={q0 , q1 , q2
,q3 } и программой
q10Л, q20q3 1П,
q30q10Л, q11q20Л, q21q21Л, q31q31П,
q1*q00, q2*q2*Л, q3*q3*П.
Программа машины может быть записана также в виде таблицы:
S
0
1
*
Q
q1
q2 0Л
q00
q2
q31П
q 21Л
q2*0Л
q3
q10Л
q 31П
q3*П
На пересечении q2 и 1 находится q 21Л. Это означает, что на
следующем шаге машина останется в прежнем состоянии q2 и
сохранит содержимое обозреваемой ячейки 1, затем перейдет к
следующей левой ячейки на ленте.
Применим эту машину к слову 11*11.
11*1q11=>11* q 210=>11 q 2*10=>1 q 21*10=> q 211*10=> q 2011*10=>1
q 311*10=>11 q 31*10=>111 q 3*10=>111* q 310=>
111* 1q 30=>111* q10=>111 q2*00=>11 q21*0=>1 q211*0=> q2111*0=>
q20111*0=>1q3111*0=>11q311*0=>111q31*0=>1111q3*0=>1111*q30=>1
111 q1*0=>1111 q0 00.
Можно проверить, что данная машина Тьюринга осуществляет
следующие преобразования конфигураций:
11* q11=>111 q00,
1*111 q11=>1111 1q00,
11*11 q11=>111111 q00,
11111*111 q11=>1111 111q00.
Нетрудно заметить, что данная машина Тьюринга вычисляет
функцию f(х)=х+1, те. Реализует операцию сложения: в результате ее
работы на ленте записано подряд столько единиц, сколько их было
всего записано по обе стороны от звездочки перед началом работы
машины.
На этом примере мы смогли убедиться, что машина Тьюринга – не что
иное, как некоторое правило (алгоритм) для преобразования слов
алфавита SQ, то есть конфигураций.
Таким образом, любую задачу из бесконечного множества задач
можно выразить (закодировать) некоторым словом некоторого
алфавита, а решение задачи – каким-то другим словом того же
алфавита. В результате получим функцию, заданную на некотором
подмножестве множества всех слов выбранного алфавита и
принимающую значение в множестве всех слов того же алфавита.
Решить какую-либо задачу – значит найти значение этой функции на
слове, кодирующем данную задачу. А иметь алгоритм для решения
всех задач данного класса – значит, иметь единый способ,
позволяющий в конечное число шагов «вычислять» значения
построенной функции для любых значений аргумента из ее области
определения. Таким
образом алгоритмическая проблема – по существу проблема о
вычислении значений функции, заданной в некотором алфавите.
2.2.4. Частично- рекурсивные функции
Машина Тьюринга М с внешним алфавитом  порождает
функцию, перерабатывающую некоторые слова в алфавите  в слова
того же алфавита . Однако, функция М может быть определена не
на всех словах в алфавите . Рассмотрим, что означает, что функция
вычислима с помощью машины Тьюринга.
Если Х1, ... , Хk – множества, то Х* ...* Хk – их декартово
произведение, т.е. множество упорядоченных наборов < x1, ... , xk >,
где x1 Х1, ... , xk Хk. Если Х, У – множества, то через ХУ
обозначим множество всех функций с областью определения Х,
принимающих значения в множестве У. Вместо f ( ХУ) пишут
f : ХУ. Функция
от
k
аргументов есь функция вида
f : Х1 * ... *Х k У, так что f(< x1, ... , xk >)  У. Обозначение
f(< x1, ... , xk >) традиционно пишется f( x1, ... , xk ) .
Через ХУ обозначим множество всех частичных функций из Х в
У, т.е. f : ХУ  область определения f включена в Х ( и
необязательно совпадает со всем множеством Х) и значения f
принимаются из множества У. В частности, функция
f : Х1 * ... *Х k У от k аргументов может быть и не определена для
некоторых наборов < x1, ... , xk >.
Множеству Х1 * ... *Х k У принадлежит, в частности, и нигде не
определенная функция.
Специально рассматриваются функции, перерабатывающие слова.
Если  - алфавит, то через * обозначим множество всех слов в
алфавите . Пусть 1, ... , k – алфавиты. Машины Тьюринга можно
приспособить
для
вычислений
функций
вида
1*х ... хk*  *. С этой целью фиксируется некоторая новая буква
q, не входящая в рассматриваемые алфавиты. Наборы слов 1*х ...
хk* в алфавите будут изображаться в следующем виде: 1* U ...
Uk* U {q}. Например, упорядоченную тройку <х1,х2,х3> , где хi 
i*, изобразим в виде одного слова х1qх2qх3.
Функция f : 1*х ... хk*  * называется вычислимой (по
Тьюрингу), если существует машина Тьюринга, вычисляющая f .
Что значит уметь вычислять значения функции? Это значит
вычислять значения функции с помощью подходящей машины
Тьюринга. Для каких же функций возможно их тьюрингово
вычисление ? Многочисленные исследования ученых, обширный
опыт показали, что такой класс функций чрезвычайно широк. Каждая
функция, для вычисления значений которой существует какой-нибудь
алгоритм, оказывалась вычислимой посредством некоторой машины
Тьюринга. Это дало повод Тьюрингу высказать следующую гипотезу,
называемую основной гипотезой теории алгоритмов или тезисом
Тьюринга.
Тезис Тьюринга. Для нахождения значений функции, заданной в
некотором алфавите, тогда и только тогда существует какойнибудь алгоритм, когда функция является вычислимой по
Тьюрингу, то есть когда она может вычисляться на подходящей
машине Тьюринга.
2.2.5. Формальные
МТ-модели
вычислительные машины
и
современные
Являясь абстрактной моделью реальных ЭВМ, МТ определяют их
вычислительные возможности – вычислимость частично рекурсивных
функций, тем самым, давая ответ на вопрос о возможности
современной цифровой ВТ. Т.е. теоретически не существует
алгоритма , не мог бы быть реализован средствами современной ВТ.
На практике же существуют целочисленные функции, вычисление
значений которых требует сколь угодно больших виртуальной
памяти (оперативной и внешней) и времени вычислений. Например,
вычисление
n-го
члена
последовательности
однозначно
определенных сумм (ПООС) для сколь угодно большого n-значения.
Единственным алгоритмом для получения n-го члена такой ПООС
является информация о всех предыдущих
членах последовательности. Поэтому для каждой конкретной ЭВМ
существует такое целое n>0, для которого вычисление n-го члена
ПООС требует увеличения основных ресурсов ЭВМ. В этом смысле
ни одна ЭВМ не может считаться универсальной в смысле
вычислимости произвольной частично рекурсивной функции, т.е. для
нее существует класс не решаемых задач при условии неизменности
ее ресурсов ( в первую очередь памяти). Универсальность ЭВМ носит
сугубо потенциальный характер, ибо любая ЭВМ является конечным
автоматом (хоть и с очень большим числом внутренних состояний),
имеющим ряд ограничений на вычислимость. Таким образом,
бесконечность внешней памяти МТ принципиально расширяет
возможности абстрактных МТ-вычислителей.
Рассмотрим общие черты формальной МТ-модели вычислений и
реальной современной ЭВМ.
- Подобно МТ-модели в ЭВМ можно выделить элементарные
неделимые единицы информации – соответственно символы Sалфавита и двоичный алфавит.
-Подобно первой ЭВМ располагает конечным множеством команд,
лежащих в основе реализации и выполнения каждого алгоритма;
-Подобно МТ-модели ЭВМ функционирует дискретно (потактно) под
управлением программы, хранящейся в оперативной памяти.
-Устройство управления МТ-модели по назначению и в общих чертах
аналогично УУ ЭВМ.
ЭВМ имеют относительно МТ-моделей существенно более сложную
организацию и широкий набор более крупных команд, что позволяет
эффективно и выразительно представлять разнообразные алгоритмы
решаемых задач.
2. 3. Другие уточнения понятия алгоритма
2. 3.1. Нормальные алгоритмы Маркова.
Теория нормальных алгоритмов была разработана советским
математиком А.А.Марковым в конце 40-х – начале 50-х годов.
Алгоритмы Маркова можно считать уточнением понятия алгоритма,
достигаемым за счет использования специальной формы описания.
Уточнение понятия алгоритма также основывается на понятии
алфавита.
Определение. Марковской подстановкой называется операция над
словами, задаваемая с помощью упорядоченной пары слов (PQ),
состоящая в следующем. В заданном слове R находят первое
вхождение слова P (если такое имеется) и, не изменяя остальных
частей слова R, заменяют в нем это вхождение словом Q. Полученное
слово называется результатом применения Марковской подстановки
(PQ) к слову R. Если же первого вхождения P в слово R нет (и,
следовательно, вообще нет ни одного вхождения P в R), то считается,
что Марковская подстановка (PQ) не применима к слову R.
Рассмотрим примеры Марковских подстановок.
Преобразуемое
слово
138 578 926
тарарам
шрам
функция
логика
книга
поляна
Марковская
подстановка
(85 789, 00)
(ара, )
(ра, ар)
(, ζ-)
(ика, )
(,)
(пор, т)
Здесь  обозначает пустое слово.
Результат
130 026
трам
трам
Ζ-функция
лог
книга
[Не применима]
Обозначение Марковской подстановки: PQ – формула постановки
(P,Q).
Обозначение заключительной подстановки: : P .Q.
Упорядоченный конечный список формул подстановок в алфавите
А:
P1 (.)Q1
P2 (.)Q2
…………
Pr(.)Qr
называется схемой (или записью) нормального алгоритма в А.
Эта схема определяет алгоритм преобразования слов, называемый
нормальным алгоритмом Маркова.
Определение. Нормальным алгоритмом (Маркова) в алфавите А
называется следующее правило построения последовательности Р i
слов в алфавите А, исходя из данного слова Р в этом алфавите. В
качестве начального слова Р0 последовательности берется слово Р.
Пусть для некоторого i>=0 слово Рi построено и процесс построения
рассматриваемой последовательности еще не завершился. Если при
этом в схеме нормального алгоритма нет формул, левые части
которых бы в Рi, то Рi+1 полагают равным Рi, и процесс построения
последовательности считается завершившимся. Если же в схеме
имеются формулы с левыми частями, входящими в Рi, то в качестве
Рi+1 берется результат Марковской подстановки правой части первой
из таких формул вместо первого вхождения ее левой части в слово Р i.
Процесс построения последовательности считается завершившимся,
если на данном шаге была применена формула заключительной
подстановки, и продолжающимся в противном случае. Если процесс
построения последовательности обрывается, то говорят, что
рассматриваемый нормальный алгоритм применим к слову Р.
Последний член Q последовательности называется результатом
применения нормального алгоритма к слову Р. Говорят, что
нормальный алгоритм перерабатывает Р в Q.
Запись последовательностей Рi : P0 =>P1=> P2 … =>Pm-1=>Pm, где P0=P и
Pm=Q.
Пример. Пусть А= {a,b} - алфавит. Рассмотрим такую схему
нормального алгоритма в А:
а.
bb.
Здесь, всякое слово Р в алфавите А, содержащее хотя бы одно
вхождение буквы а, алгоритм перерабатывает в слово, получающееся
из Р вычеркиванием в нем самого левого (первого) вхождения буквы
а. Пустое слово перерабатывается в пустое слово. Алгоритм
неприменим к таким словам, которые содержат только букву b.
Например, aabab =>abab, ab=>b, bbab=>bbb, baba=>bba.
Пример. Дана функция:
3(11…1) =
n
1, если делится на 3;
, если не делится на 3.
Рассмотрим нормальный алгоритм в алфавите А={1} со следующей схемой:
11  . 
11  
1 . 
 . 1
Алгоритм работает по такому принципу: пока число букв 1 в
слове не меньше 3, алгоритм последовательно стирает по три буквы.
Если число букв меньше 3, но больше 0, то оставшиеся буквы 1 или
11 стираются заключительно; если слово пусто, оно заключительно
переводится в слово 1.
Например, 1111111 =>1111=>1=>;
111111111=>111111=>111=>=>1.
Таким образом, рассмотренный алгоритм реализует (или вычисляет)
данную функцию. Сформулируем теперь точное определение такой
вычислимости функций.
Определение. Функция f, заданная на некотором множестве слов
алфавита А, называется нормально вычислимой, если найдется такое
расширение В данного алфавита (АВ) и такой нормальный алгоритм
в В, что каждое слово Р (в алфавите А) из области определения
функции f этот алгоритм перерабатывает в слово f(Р).
Таким образом, нормальный алгоритм примера показывает, что
функция 3(х) нормально вычислима. Причем соответствующий
нормальный алгоритм построен в том же самом алфавите, на словах
которого была задана рассматриваемая функция, то есть расширять
алфавит не потребовалось (В=А).
Принцип нормализации Маркова. Для нахождения значений
функций, заданной в некотором алфавите, тогда и только тогда
существует какой-нибудь алгоритм, когда функция нормально
вычислима.
Этот принцип, как и тезис Тьюринга, носит внематематический
характер и не может быть строго доказан. Он выдвинут на основании
математического и практического опыта человечества.
2.3.2. Рекурсивные функции.
Рассмотрим основные положения еще одной алгоритмической теории
– теории рекурсивных функций.
Понятие рекурсивной функции является еще одним из
математических уточнений интуитивного понятия вычислимой
функции.
Приступим к построению класса рекурсивных функций, заданных на
множестве натуральных чисел и принимающие натуральные
значения. Рассматриваются только частичные функции, то есть
определенные, вообще говоря, не для всех значений аргументов.
В качестве исходных, простейших, функций выберем следующие:
S(x)=x+1
(функция следования),
O9x)=0
(нуль-функция),
n
Im (x1,x2,…,xn)=xm (функции-проекторы, 1<=m<=n).
В качестве операторов, с помощью которых будут строиться новые
функции, выберем следующие три: операторы суперпозиции,
примитивной рекурсии и минимизации.
Оператор суперпозиции. Будем говорить, что n-местная функция 
получена из m-местной функции  и n-местных функций f1,…,fm с
помощью
оператора суперпозиции, если для всех
x1,…xn
справедливо равенство:
(x1,…,xn)= (f1(x1,…,xn),…,fm(x1,…,xn)).
Оператор примитивной рекурсии. Скажем, что (n+1)-местная
функция
 получается из n-местной функции f и (n+2)-местной
функции g с помощью оператора примитивной рекурсии, если для
любых значений х1,...,хn,у выполняются равенства
(x1,…,xn,0)= f1(x1,…,xn),
(x1,…,xn,у+1)= g(x1,…,xn,у,  (x1,…,xn,y)).
Эти равенства называют схемой примитивной рекурсии.
Пример. Функция s(x,y)=x+y может быть получена из простейших с
помощью оператора примитивной рекурсии. Для функции верны
тожества
х+0=х,
х+(у+1)=(х+у)+1,
которые можно записать в виде
s(x,0)=x,
s(x,y+1)=s(x,y)+1,
или
s(x,0)=I (x),
s(x,y+1)=S(s(x,у)).
А это и есть схема примитивной рекурсии, основывающаяся на
простейших функциях I и S.
Пример. Аналогично операция сложения, очевидные соотношения для
операции умножения
p(x,0)=x0=0=O(x),
p(x,y+1)=xy+x=p(x,y)+x=x+p(x,y)=s(x,p(x,y))
говорят о том, что функция p(x,y)=xy получена из простейшей
функции О(Х) и функции s(x,y)=x+y с помощью оператора
примитивной рекурсии.
Введем третий оператор.
Оператор минимизации. Будем говорить, что n-местная функция 
получается из n+1)-местных функций f1 и f2 с помощью оператора
минимизации, или оператора наименьшего числа, если для любых x1,
…, xn, y равенство (x1, …, xn)=у выполнено тогда и только тогда,
когда значения fi(x1, …, xn,0),..., fi(x1, …, xn ,y-1) (i-1,2) определены и
попарно неравны:
f1(x1, …, xn,0)  f2(x1, …, xn,0)
.....
....
....
.......
fi(x1, …, xn,у-1)  f2(x1, …, xn,у-1),
а f1(x1, …, xn,у)= fi2(x1, …, xn,у).
Коротко говоря, величина (x1, …, xn) равна наименьшему значению
аргумента у, при котором выполняется последнее равенство.
Используется следующее обозначение:
(x1, …, xn,0)= y[f(x1, …, xn,y)=0].
Оператор минимизации называется также  –оператором.
Пример. Рассмотрим следующую
помощью оператора минимизации:
функцию,
получающуюся
с
D(x,y)= z[y+z=x]= z[s(I32(x,y,z),I33(x,y,z))=I13(x,y,z)].
Вычислим, например, d(7,2). Для этого неужно положить у=2 и,
придавая переменной z последовательно значения 0,1,2,..., каждый раз
вычислять сумму y+z. Как только она станет равной 7, то
соответствующее значение z принять за значение d(7,2). Вычисляем:
z=0, 2+0=27;
z=1, 2+1=37;
z=2, 2+2=47;
z=3, 2+3=57;
z=4, 2+4=67;
z=5, 2+5=7;
Таким образом, d(7,2)=5.
Попытаемся вычислить по этому правилу d(3,4):
z=0, 4+0=4>3;
z=1, 4+1=5>3;
z=2, 4+2=63;
…. …. …..
Видим, что данный процесс будет продолжаться бесконечно.
Следовательно, d(3,4) не определено.
Таким образом, d(x,y)=x-y.
Процесс получения новых функций, исходя из простейших и
применяя, операторы суперпозиции, примитивной рекурсии и
минимизации, можно продолжать неограниченно. Получающиеся при
этом функции называются рекурсивными.
Определение. Частичная функция f называется рекурсивной, если она
может быть получена из простейших функций с помощью конечного
числа применений операций операторов суперпозиции, примитивной
рекурсии и минимизации. Если функция всюду определена и
рекурсивна, то она называется общерекурсивной.
Таким образом, всякая общерекурсивная функция рекурсивна. Кроме
того, функция, получающаяся с помощью оператора примитивной
рекурсии, определена для всех значений аргументов и потому
является общерекурсивной (если к тому же ее построение начато с
простейших функций). Все три функции, рассмотренные в примерах,
рекурсивны, а первая из них – еще и общерекурсивна. Возникает
вопрос, почему именно так выбраны простейшие функции и
операторы для получения новых функций?
Рекурсивными функциями мы стремимся исчерпать все мыслимые
функции, поддающиеся вычислению с помощью какой-нибудь
определенной процедуры механического характера. Подобно тезису
Тьюринга и принципу нормализации Маркова и в теории
рекурсивных функций выдвигается соответствующая гипотеза,
носящая название тезиса Черча.
Тезис Черча. Числовая функция тогда и только тогда
алгоритмически (или машинно) вычислима, когда она рекурсивна.
И эта гипотеза не может быть доказана строго математически, она
подтверждается практикой, опытом, ибо призвана увязать практику и
теорию. Все рассматривавшиеся в математике конкретные функции,
признаваемые вычислимыми в интуитивном смысле, оказались
рекурсивными.
2.3.3.Эквивалентность различных теорий алгоритмов
Как связаны между собой рассмотренные выше теории по уточнению
понятия алгоритма? Ответом является следующая теорема, которая
может быть строго доказана.
Теорема. Следующие классы функций (заданных на натуральных
числах и принимающих натуральные значения) совпадают:
а. класс все функциях вычислимых по Посту;
б. класс всех функций вычислимых по Тьюрингу;
в. класс всех нормально вычислимых функций;
г. класс всех рекурсивных функций.
По этой теореме теории машин Поста, Тьюринга, нормальных
алгоритмов и рекурсивных функций равносильны. Если бы один из
этих классов оказался шире какого-либо другого класса, то
соответствующий тезис Тьюринга, Маркова, Поста или Черча был бы
опровергнут. Например, если бы класс нормально вычислимых
функций оказался шире класса рекурсивных функций, то
существовала бы нормально вычислимая, но не рекурсивная функция.
В силу ее нормальной вычислимости она была бы алгоритмически
вычислима в интуитивном понимании алгоритма, и предположение о
ее не рекурсивности опровергало бы тезис Черча. Но
сформулированная теорема действительно справедлива, и таких
функций не существует, что служит еще одним косвенным
подтверждением тезисов Тьюринга, Поста, Маркова и Черча.
Существуют и другие теории алгоритмов, и для них всех также
доказана их равносильность с рассмотренными теориями.
2.3.4. Неразрешимые алгоритмические проблемы
Рассмотри обозначенную проблему на основе формальных МТвычислителей. Результаты теории формальных МТ-вычислителей
носят не только гносеологический характер, но и позволяют получать
доказательства невозможности тех или иных алгоритмов (носящих
практический характер), что позволяет проникнуть в суть самого
понятия алгоритма в
современном его понимании. Теория
абстрактных вычислителей на основе МТ-машин в настоящее время
развита достаточно хорошо.
Алгоритмическая проблема - это проблема, в которой требуется
найти единый метод (алгоритм) для решения бесконечной серии
однотипных единичных задач.
Рассмотрим пример функции, которая не может быть вычислена ни на
какой машине Тьюринга. Функция () задана на словах в алфавите
S1={1}. Для произвольного слова  длины n в алфавите S1={1}
положим:
n 1, если слово  перерабатывается машиной
() =
Тьюринга с номером n в слово n алфавите S1={1},
1,
в противном случае.
Теорема. Функция () не вычислима по Тьюрингу.(И.И.Игошин.
Математическая логика и теория алгоритмов).
Доказательство. Предположим, что существует машина Тьюринга 
со стандартным алфавитом {s0,1.q,П,Л} , вычисляющая эту функцию.
Пусть k – номер этой машины, =11...1, ()=(11…1).
k
Допустим, что машина  перерабатывает слово =11...1 в слово k в
том же алфавите S1={1}. Тогда по определению вычислимости
функции () на машине , это означает, что  (11…1)= k. Но с
другой стороны, по самому определению функции  (), это означает,
что (11…1)= k 1. Полученное противоречие доказывает, что
машины Тьюринга, вычисляющей функцию
 () , не существует.
Глава 3. Параллельные модели вычислителей
(однородные структуры)
Рассмотренные в предыдущих разделах формальные модели
реализуют последовательный неймановский принцип компьютерных
вычислений. Параллельные же модели вычислений реализуют сугубо
параллельный принцип, называемый не-неймановским. Суть такой
терминологии станет ясна из нижеследующего. Современные
тенденции развития перспективных архитектур высокопараллельной
ВТ и средств микроэлектроники, проблемы моделирования
дискретных параллельных процессов, теория параллельных
дискретных динамических систем, дискретные математика и
синергетика, задачи искусственного интеллекта и робототехники,
параллельные алгоритмы и обработка информации определяют
подъем интереса к различного рода клеточным формальным моделям
высокопараллельного образа действия. Важнейшими из них
являются однородные структуры (ОС; основной синоним –
клеточные автоматы).
3.1.Концепция
формальных
ОС-моделей.
Однородные
структуры
являются
формализацией
понятия
бесконечных
регулярных решеток (сетей) из идентичных конечных автоматов,
которые информационно связаны друг с другом одинаковым
образом в том смысле, что каждый автомат решетки может
непосредственно получать информацию от вполне определенного для
него конечного множества соседних ему автоматов. При этом
соседство понимается не в геометрическом, а в информационном
плане. Соседство автоматов устанавливается постоянным для
каждого автомата решетки и определяется специальным вектором –
индексом соседства. Как правило, рассматриваются d-мерные
регулярные решетки в Евклидовом пространстве Ed , в целочисленные
точки которого помещены копии некоторого автомата Мура1.
ОС функционирует в дискретные моменты времени Т (Т=0,1,2,...) так,
что каждый автомат решетки может синхронно изменять свое
состояние в дискретные моменты времени Т>0, как функция
состояний всех соседей в предыдущий момент времени
(Т-1). Эта локальная функция перехода может со временем
меняться, но остается всегда постоянной для каждого автомат
решетки в любой конкретный момент времени Т>0. Одновременное
применение локальной функции перехода ко всем автоматам решетки
определяет глобальную функцию перехода в структуре, которая
действует во всей решетке, изменяя текущую конфигурацию
состояний автоматов решетки на новую конфигурацию. Изменение
конфигураций структуры определяет под действием глобальной
функции определяет динамику функционирования ОС-модели с
течением времени, которая играет основную роль в исследованиях ее
поведенческих свойств. Теория ОС в целом может рассматриваться
как структурная и динамическая теория бесконечных абстрактных
автоматов, наделенных специфической внутренней организацией,
носящей качественный характер. ОС служат формальной средой для
моделирования многих параллельных дискретных
процессов и
явлений в различных областях науки и техники.
3.2.Классическая d-мерная (d>=1) однородная структура (d-ОС)
определяется как упорядоченная четверка компонент:
d-OC=<Zd, A, (n), X>,
где А конечное непустое множество, называемое алфавитом
внутренних состояний единичных автоматов структуры и
представляющее собой множество состояний, которые может
принимать каждый элементарный (единичный) автомат структуры.
Компонента Zd представляет собой множество всех d-мерных
кортежей – целочисленных координат точек в евклидовом Ed
пространстве, т.е. Zd представляет собой целочисленную решетку в
Ed , элементы которой служат пространственной идентификацией
единичных автоматов структуры.
В каждую точку Zd помещают копию конечного автомата Мура,
алфавит внутренних состояний которого есть А. В этом случае
Автомат Мура представляет собой конечный автомат, выход которого в данный момент времени Т
зависит только от его внутреннего состояния в этот же момент времени Т и не зависит от значения его
входов.
1
каждая точка Zd определяет имя или координату единичного
автомата, помещенного в данную точку.
Компонента Х, называемая индексом соседства структуры, есть
упорядоченный кортеж n элементов из Zd , который служит для
определения автоматов-соседей любого единичного автомата
структуры, т.е. тех ее автоматов, с которыми данный единичный
автомат непосредственно связан информационными каналами.
Состояние всей однородной среды называется конфигурацией dОС и представляет собой набор текущих состояний всех
составляющих ее единичных автоматов.
Функционирование d-ОС осуществляется в дискретной шкале
времени Т=0,1,2,.. и определяется локальной функцией перехода
(ЛФП) s(n) , которая задает состояние каждого единичного z-автомата
структуры в момент времени Т на основе состояний всех соседних
ему автоматов (согласно Х-индексу соседства) в момент времени (Т1). Иными словами, ЛФП есть любое отображение (n): АnА; Для
ЛФП используются следующие обозначения:
(n)(a1,a2, …,an)=a1;
aj, a1A (j=1,…,n)
a1,a2, …,an a1 - множество параллельных подстановок.
Где a j состояние любого z-автомата d-ОС и его соседей в момент
времени (Т-1), a1 - состояние этого z-автомата в следующий момент
времени Т>0. Множество параллельных подстановок определяет
программу
(параллельный
алгоритм)
функционирования
классической ОС-модели. Параллельные подстановки представляют
собой параллельный язык программирования низшего уровня в среде
ОС-моделей. Здесь рассмотрены структуры с ограничением на
скорость передачи информации в них. Это предположение играет
существенную роль при исследовании динамических свойств d-ОС и
хорошо отвечает требованиям использования структур в качестве
основы
моделирования параллельных динамических систем
различной природы. Таким образом, динамика классических d-ОС
полностью определяется в терминах ЛФП – локальных
взаимодействий автоматов шаблона соседства каждого единичного zавтомата структуры, а сама ЛФП представляет собой типичный
пример
локального
алгоритма,
выполняющегося
сугубо
параллельным образом.
3.3.Параллельные алгоритмы переработки слов, определяемы
классическими ОС-моделями, исследуются особенно интенсивно в
настоящее время, что объясняется использованием d-ОС в качестве
формальных моделей в таких областях современного естествознания
как вычислительные науки, математическое моделирование, физика,
дискретная синергетика и др. Параллельные алгоритмы,
определяемые классическими d-ОС
(d-ПАОС ), играют
существенную роль в формальном описании целого ряда дискретных
процессов и программируемых систем, базирующихся на на
вычислительных однородных структурах. Несомненный интерес для
решения
задач
конструирования
языков
мультиобработки
представляет изучение формальных языковых
моделей,
функционирующих сугубо параллельным образом.
Установлена эквивалентность МТ и ОС-моделей в отношении их
универсальной вычислимости,
и доказана вместе с тем
возможность решения целого ряда задач на ОС-моделях с
существенно меньшими временными затратами. Следовательно,
реализация конкретных ОС-моделей позволяет надеяться на создание
высокопроизводительных вычислительных структур, исповедующих
нетрадиционный не-неймановский
принцип вычислений и
обработки информации – сугубо параллельный.
Опыт погружения моделей и алгоритмов ОС-среду позволяет
акцентировать следующие два момента ее практической
применимости. Во-первых, имеет место существенно
большая
сложность проблем синхронизации параллельно выполняющихся
частей единого алгоритма, чем в случае сугубо последовательных
моделей. Это требует уделять особое внимание разработке как
системного, так и прикладного ПО, что представляется значительно
более сложной задачей относительно случая традиционного ПО.
Во-вторых, не все задачи с одинаковой эффективностью могут
использовать максимальный параллелизм, обеспечиваемый Осмашинами.
Здесь
нужно
рассматривать
ряд
уровней
распараллеливания, ориентированных на тот или иной класс и
соответствующих им архитектур ЭВМ.
Отмеченные черты – параллелизм и локальность – результаты того
факта, что однородные структуры являются высокоабстрактными
физическими моделями; поэтому их можно удобнее других
архитектур отображать на многие физические реализации и они также
хорошо подходят для различных задач моделирования. Поэтому ОСмодели можно рассматривать в качестве основы перспективных
параллельных архитектур вычислительных систем.
Несмотря на ожидаемый прогресс в повышении быстродействия,
степени интеграции элементной базы ВТ и архитектурные решения,
ЭВМ, построенные на основе неймановской архитектуры
(базирующеся на МТ-моделях) и рассчитанные на последовательное
выполнение команд имеют небольшой по современным требованиям
предел роста производительности. Во многих теоретических и
прикладных областях требуется быстродействие порядка 200 млрд.
оп/с и выше, что принципиально недостижимо для ЭВМ с
традиционной
последовательной
архитектурой.
Наиболее
перспективным методом решения данной проблемы на базе
современной микроэлектронной технологии является переход на
параллельную не-неймановскую архитектуру ЭВМ. Целым классам
важных задач наиболее отвечают именно ОС-вычислители,
например: распознавание образов, обработка изображений, векторноматричное, сеточное, физическое и биологическое моделирование и
др. По данной проблематике ведутся интенсивные исследования во
многих странах: США, Японии, Германии, Великобритании, Италии,
Франции, России, Эстонии и ряде других.
Литература:
1. А.Н.Колмогоров, А.Г.Драгалин.
Математическая логика. Дополнительные главы:Учеб.пособие. М.: Изд-во Моск. ун-та, 1984. -120 с.
2. Вирт Н. Алгоритмы и структуры данных: Пер. сангл. –М.:Мир,
1989. – 360 с., ил.
3. Фролов Г.Д., Кузнецов Э.И. Элементы информатики: Учеб.
Пособие для пед. Ин-тов. – М.: Высш. шк., 1989. – 304 с., ил.
4. Игошин В.И. Математическая логика и теория алгоритмов. –
Саратов: Изд-во Сарат. Ун-та, 1991. – 256 с.
5. Абель П. Язык Ассемблера для IBM PC и программирования / Пер.
с англ. Ю.В.Сальникова. – М.: Высш. шк., 1992. – 447 с., ил.
6. В.Э.Аладьев, Ю.Я.Хунт, М.Л.Шишаков. Основы информатики.
Учебное пособие. – М.: Информационно-издательский дом
«Филинъ», 1998. – 496 с.
7. Кудрявцев В.Б., Алешин С.В., Подколзин А.С. Введение в теорию
автоматов. – М.: Наука.Гл. ред. Физ.-мат. лит., - 320 с.
ОГЛАВЛЕНИЕ
Предисловие ………………………. ............................................ ….…......…3
Глава1.Алгоритмы и данные ……………….. .................…….....….....…..5
§1.1. Понятие алгоритма ……………………………………........……...……5
§1.2.Средства записи алгоритмов ……………………………………...…… 6
§1.3 Данные в алгоритмическом языке…………………….……....…..…..…9
§1.4 Структуры алгоритмов………………...………......……….....…......……9
1.4.1. Простые команды ……………………………….…….......…………..…9
1.4.2. Составные команды … …………………………... ….. ..…………..…10
1.4.3. Основы структурного построения алгоритмов ……………..……..…14
1.4.4. Вспомогательные алгоритмы …………………………………….…….16
§1.5. Структуры данных ……………………………………….…..……........17
1.5.1. Простые переменные ……………………… ……………...………....18
1.5.2. Простейшие статические
структуры-массивы, записи …………………………………………………18
1.5.3. Строковые данные ……………………………..………………………22
1.5.4. Полустатические структуры–стеки, очереди …………………..……22
Глава 2. Основы теории алгоритмов………………………...……………..26
§ 2.1. Уточнение понятия алгоритма.
Алгоритмическая система Поста.............…………………………………....26
2.1.1 Преобразование информации по Посту………………………………..27
2.1.2 Алгоритм Поста……………………………………….….………..……29
2.1.3 Машина Поста……………………………………….…………………..30
2.1.4 Примеры алгоритмов Поста…………………………………….………31
§ 2.2. Последовательные модели
вычислителей (Машина Тьюринга) ……........………..........…….......…..….32
2.2.1 Понятие машины Тьюринга………………….…………………………33
2.2.2 Конструкция машины Тьюринга…………………….…………………33
2.2.3 Применение машины Тьюринга……………………….…………....….35
2.2.4 Частично-рекурсивные функции…………………..…...…………....…36
2.2.5 Формальные МТ-модели и современные
вычислительные машины…………………………………..……….…...…...38
§ 2.3 Другие уточнения понятия алгоритма ……………….……...…... …..39
2.3.1 Нормальные алгоритмы Маркова ………………………….…....……...39
2.3.2 Рекурсивные функции ………………………….. ..……………….. .. .42
2.3.3 Эквивалентность различных теорий алгоритмов……………………...45
2.3.4 Неразрешимые алгоритмические проблемы ……………………….….46
Глава 3. Параллельные модели вычислителей……………………….…......47
3.1. Концепция формальных ОС-моделей..............……….……..….......47
3.2. Классическая d-мерная (d>=1) однородная структура……………..48
3.3. Параллельные алгоритмы.............................................…………….....49
М.К.АТУШЕВА
ОСНОВЫ ТЕОРИИ АЛГОРИТМОВ
Редакционно-издательский отдел ЗКГУ
Усл.печ.л. 3,3 п.л.
Бумага офсетная /Тираж 100
Download