Сборник практических занятий по дисциплине "Теория

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ПЕНЗЕНСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ
ТЕОРИЯ АЛГОРИТМОВ
Методические указания
к практическим занятиям
ПЕНЗА
2011
УДК 681.3
А 22
Приводятся методические указания к практическим занятиям и теоретический материал по теории алгоритмов. Для технического оснащения
практических занятий используются ПЭВМ типа IBM PC специальное и стандартное программное обеспечение.
Методические указания подготовлены на кафедре "Информатика" Пензенской государственной технологической академии и предназначены для
студентов специальности 080800 - «Прикладная информатика», изучающих
дисциплину "Теория алгоритмов".
Ил. 1, библиогр. 10 назв.
Составители В. Б. Лебедев, Н. Е. Кирсанова
Рецензент В. В. Дрождин, заведующий кафедрой Пензенского государственного педагогического университета
2
Введение
Методические указания содержат описание 9 практических занятий, которые имеют общую методику проведения и техническое оснащение (ПЭВМ
типа IBM PC, программное обеспечение в виде специальных программных
приложений и стандартных средств текстового редактора MS Word для
Windows, предназначенного для оформления отчетов по практическим занятиям). Практические занятия рекомендуется проводить фронтально и последовательно в порядке их номеров. В описании практических занятий курсивом выделены наиболее важные термины, на изучение которых студенту
следует обратить особое внимание, а жирным шрифтом выделены нужные
названия опций и пунктов меню экранных панелей программных приложений.
Практическое занятие №1.
Словесное
представление
алгоритмов
Цель практического занятия: познакомиться с методом словесного
представления алгоритмов. Научится создавать простейшие словесные описания алгоритмов.
Общие сведения
1. Наиболее распространенный способ задания алгоритма в математике
и других дисциплинах — это словесный. Алгоритм задается в виде конечного
перечня простейших указаний (команд) на естественном языке, не оставляющих возможности произвольной интерпретации выполнения.
2. Простейшие указания (команды) словесного представления алгоритма следующие: начало (определяет начало алгоритма), задать (например,
конкретные числовые значения переменных), выполнить (вычисление вы3
ражения), сложить, умножить, разделить и т.д. как двухместные операции,
присвоить (например, значение выражения одной переменной или функции
для другой переменной), проверить выполнение логического условия (например, a b ? ), вывести результат (напечатать), запомнить (или сохранить),
переход (определяет безусловное изменение направления выполнения алгоритма), конец (определяет окончание алгоритма).
3. В алгоритме всегда существует только одна команда «начало» и одна
команда «конец».
4. Каждая команда записывается в виде одной строки, которая нумеруется.
5. Проверка выполнения логического условия обязательно помечается
результатом «да» или «нет» с указанием номера строки для перехода выполнения алгоритма.
6. Для организации многократного выполнения одинаковых вычислений образуются циклы с введением специальных переменных (счетчиков), в
которых осуществляется подсчет числа выполненных вычислений.
7. В описании алгоритма используются обычные математические выражения для переменных, например, ai – элемент вектора, aij — элемент
i
матрицы, a — степень,
n
ai — сумма. Для обозначения команды «присвоi 1
ить» используется символ :=, например, ai : 2 (переменной ai присваивается значение 2).
Порядок выполнения практического занятия
1. Изучить общие сведения и методику выполнения практического занятия, выполнить ее указания (прежде всего, создать рабочий каталог
для сохранения файлов к практическим занятиям).
2. Получить у преподавателя задание по практическому занятию (описание алгоритма).
4
3. Разработать алгоритм и представить его словесно в виде перечня
простейших указаний (команд).
4. Разработать словесное представление алгоритма в виде текста с помощью средств редактора MS Word для Windows. Для представления
формул использовать редактор формул MS Equation.
5. Предъявить разработанное словесное представление алгоритма преподавателю для контроля.
6. Составить отчет по работе в соответствии с прил. 1. В отчет включить
текст словесного представление алгоритма с комментариями.
7. Ответить устно на контрольные вопросы к практическому занятию.
Контрольные вопросы
1. В чем заключается словесное представление алгоритма на естественном языке?
2. Какие простейшие команды применяются для словесного представления алгоритма?
3. Как формулируется в словесном представлении алгоритма проверка
выполнения логического условия?
4. Как формулируется в словесном представлении алгоритма выполнение многократных вычислений (циклов)?
Практическое занятие №2.
Графическое
представление
алгоритмов
Цель практического занятия: познакомиться с методом представления
алгоритмов, основанном на применении блок-схем (в настоящее время, в
5
соответствии с ГОСТ, используется более простой термин — «схем»). Научится создавать простейшие схемы алгоритмов.
Общие сведения
1. Наиболее распространенный способ задания алгоритма в математике
и других дисциплинах — это словесный. Алгоритм задается в виде конечного
перечня простейших указаний (команд) на естественном языке, не оставляющих возможности произвольной интерпретации выполнения.
Задание алгоритма в виде конкретной программы для ЭВМ — также является описательной формой, но только на искусственном (алгоритмическом) языке (Бейсик, Фортран, Пролог…). Очень часто такому заданию предшествует графическая форма представления алгоритма (в виде схемы). Это
форма имеет ряд преимуществ, благодаря наглядности, обеспечивающая, в
частности, высокую «читаемость » алгоритма и явное отображение управления в нём.
2. Схема алгоритма — это ориентированный граф, указывающий порядок исполнения команд алгоритма. Вершины такого графа изображаются в
виде некоторых геометрических фигур (символов):
Эллипс. Символ называется «терминатор» и применяется, например, для обозначения начала и конца алгоритма;
Параллелограмм. Для обозначения ввода и вывода
данных;
Шестиугольник. Символ называется «подготовка» и применяется, например, для обозначения цикла «пока»;
Прямоугольник. Для обозначения процессов
(процедур);
6
Ромб. Предикатная вершина (называется «решение») применяется для обозначения условия;
Объединяющая вершина.
Более подробно правила выполнений схем алгоритмов см. в [4] (ГОСТ
19.701-90 — Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.)
Порядок выполнения практического занятия
1. Изучить общие сведения и методику выполнения практического занятия, выполнить ее указания (прежде всего, создать рабочий каталог для сохранения файлов к практическим занятиям).
2. Получить у преподавателя задание по практическому занятию (описание алгоритма).
3. Разработать алгоритм и представить его словесно в виде перечня
простейших указаний (команд).
4. Изучить описание ГОСТ 19.701-90 — Единая система программной
документации. Схемы алгоритмов, программ, данных и систем. Условные
обозначения и правила выполнения. Содержится в файле «ГОСТ 19.70190.pdf».
5. Разработать графическое представление алгоритма в виде схемы с
помощью графических средств текстового редактора MS Word для Windows.
7
6. Предъявить разработанную схему алгоритма преподавателю для контроля.
7. Составить отчет по работе в соответствии с прил. 1. В отчет включить
графическое представление алгоритма в виде схемы.
8. Ответить устно на контрольные вопросы к практическому занятию.
Контрольные вопросы
1. Чем отличается словесное представление алгоритма на естественном
и искусственном языке?
2. Как выполняется графическое представление алгоритма в виде схемы?
3. Как обозначаются на схемах алгоритма процесс, границы цикла, передача управления, соединитель, комментарий, предопределенный процесс, решение с несколькими выходами?
Практическое занятие №1.
Исследование работы
машины Поста
Цель практического занятия: познакомиться с описанием машины Поста. Научится создавать простейшие программы и выполнить исследование
работы машины Поста с помощью программного интерпретатора Алго2000.
Общие сведения
1. Устройство машины Поста. Машина Поста - абстрактная машина. Машина Поста состоит из ленты и каретки (считывающая и записывающая головка). Лента бесконечна и разделена на секции одинакового размера. В
каждую секцию ленты заносится один символ двоичного информации, который подлежит обработке. Один из символов двоичного алфавита - метка "√",
8
другой - пустота. Если в секцию занесена "√" - секция отмеченная, если в
секции "√" нет - секция пустая или неотмеченная. Каретка может передвигаться вдоль ленты влево и вправо. Когда она неподвижна, она стоит против
ровно одной секции ленты; говорят, что каретка обозревает эту секцию. А
такая секция называется текущей или обозреваемой. За единицу времени,
которая называется шагом, каретка может сдвинуться на одну секцию влево
или вправо. Кроме того, каретка может также распознать стоит или нет метка в обозреваемой ею секции, может заносить метку в пустую секцию и может удалять метку из отмеченной ячейки. Команды, по которым каретка
должна занести метку в отмеченную секцию или удалить метку из пустой
секции являются недопустимыми.
2. Команды машины Поста. Формат команды: nKm, где: n - номер текущей команды, K - команда из системы команд машины Поста, m - отсылка номер команды, которая будет выполняться следующей. Последовательность команд из системы команд - программа, если:
1) на n - ом месте этой программы будет стоять команда с номером n.
2) отсылке m соответствует реальная команда в программе.
Система команд машины Поста:
1). a→b
Сдвиг каретки вправо, содержимое ленты не меняется.
2). a←b
Сдвиг каретки влево, содержимое ленты не меняется.
3). a√b
В обозреваемую секцию ставится метка "√". Выполнение этой команды
возможно только в том случае, если обозреваемая секция пустая, в противном случае команда считается невыполнимой.
4). a↨b
9
Каретка стирает метку в обозреваемой секции. Выполнение этой команды возможно только в том случае, если обозреваемая секция содержит
метку, в противном случае команда считается невыполнимой.
5). a?b1, b2
Команда передачи. Проверяется содержимое текущей секции, если
метки нет, то происходит передача управления команде с номером b1, иначе, если метка есть - команде с номером b2. Содержимое ленты не меняется.
6). a![b]
Команда останова машины. Содержимое ленты не меняется. У команды
остановки отсылка не обязательна.
3. Порядок работы машины Поста. Работа машины Поста состоит в том,
что каретка передвигается вдоль ленты и печатает или стирает метки. Чтобы
машина Поста работала, надо задать некоторую программу и некоторое состояние машины (т.е. нужно как-то расставить метки по секциям ленты, в частности, можно все секции оставить пустыми, и поставить каретку против
одной из секций). Работа машины на основании заданной программы происходит следующим образом. Машина приводится в начальное состояние и
приступает к выполнению первой команды программы. Эта команда выполняется за один шаг, после чего машины приступает к выполнению той команды, номер которой равен отсылке первой команды. Эта команда также
выполняется за один шаг, после чего начинается выполнение той команды,
номер команды которой равен отсылке предыдущей команды. Вообще каждая команда выполняется за один шаг, а переход от выполнения одной команды к выполнению другой происходит по следующему правилу: пусть на
k-ом шаге выполнялась команда с номером a, тогда:
1) если эта команда имеет единственную отсылку b, то на (k+1)-ом шаге
выполняется команда с номером b;
10
2) если эта команда имеет две отсылки b1 и b2, то на (k + 1)-ом шаге выполняется одна из двух команд - с номером b1 или с номером b2;
3) если же выполняющаяся на k-ом шаге команда вовсе не имеет отсылки, то на (k+1) - ом шаге и на всех последующих шагах не выполняется
никакая команда – машина останавливается.
Возможные случаи останова машины Поста:
1) в ходе выполнения программы машина дойдет до выполнения невыполнимой команды; выполнение программы прекращается, машина останавливается - происходит безрезультатная остановка.
2) в ходе выполнения программы машина дойдет до выполнения команды остановки; программа в этом случае считается выполненной, машина
останавливается - происходит результативная остановка.
3) в ходе выполнения программы машина не дойдет до выполнения ни
одной из команд, указанных в первых двух вариантах; выполнение программы при этом никогда не прекращается, машина никогда не останавливается - процесс работы машины происходит бесконечно.
4. Информационная лента машины Поста. Лента состоит из 1999 ячеек,
нумерация от -999 до 999. Ячейка с толстой рамкой, находящаяся в центре
ленты - каретка. Всплывающее меню ленты вызывается при щелчке правой
кнопкой мыши на ленте. При получении фокуса лентой на ней появляется
курсор (синий прямоугольник). Его можно сдвигать по ленте вправо и влево
клавишами управления курсором. Удерживая клавишу Shift и нажимая клавиши "Влево"/"Вправо" можно выделить несколько ячеек. Также ячейки
можно выделить мышью: удерживая левую кнопку и выделив нужные. Метки ставятся/удаляются в ячейках, которые выделены. Это можно сделать несколькими способами (лента должна быть сфокусирована):
• клавишей "Пробел";
• щелкнуть мышью на кнопку "√" на панели инструментов;
11
• выбрать пункт главного или всплывающего меню "поставить/удалить
метки";
• двойным щелчком мыши (в этом случае изменение происходит только в одной ячейке).
Клавиши управления курсором "Вверх" или "Вниз" ставят курсор в каретку. "Home" - курсор в начало видимой части ленты. "End" - курсор в конец видимой части ленты. "Ctrl" + "Влево" - сдвиг каретки влево. "Ctrl" +
"Вправо" - сдвиг каретки вправо. Кнопки со стрелкой слева и справа от ленты
- прокрутить каретку соответственно влево и вправо. Кнопки со стрелкой и
вертикальной палочкой слева и справа от ленты - прокрутить каретку соответственно до крайней левой отмеченной ячейки и до крайней правой отмеченной ячейки. Номера этих ячеек указываются в строке состояния как мин и
макс соответственно. Можно непосредственно поставить каретку в нужную
ячейку, указав ее номер в редакторе над кареткой. Ленту можно запомнить
(пункт меню Команда/ Запомнить ленту) и затем восстановить (Команда/Восстановить ленту).
5. Таблица машины Поста. В нее непосредственно вписывается алгоритм решения задачи. В столбце "Номер" формируются номера команд алгоритма, начиная с 1, с шагом 1. В столбце "Команды" указываются команды
машины Поста. Они выбираются из выпадающего по нажатию клавиши
"Enter" или щелчку мыши списка. В столбце "Отсылка" указываются номера
отсылок, т.е. номер строки, которая должна выполняться следующей. Значения в этом столбце не должны быть меньше 1 и больше номера последней
команды. В столбце "Комментарии" можно писать различные пояснения, а
можно ничего не писать. При выполнении этот столбец игнорируется. Чтобы
удалить, вставить, добавить строки, очистить строки или столбцы воспользуйтесь соответствующими пунктами главного или всплывающего меню или
панелью инструментов.
6. Исполнение алгоритма машины Поста. Запуск алгоритма на исполнение:
12
• пункт главного меню Пуск/Запустить;
• кнопка запустить на панели инструментов.
При этом выполнение программы будет идти до тех пор, пока не встретиться команда стоп или не возникнет какая-нибудь ошибка.
Приостановить выполнение:
• пункт главного меню Пуск/Пауза;
• кнопка пауза на панели инструментов.
Если выполнение не было приостановлено, то оно всегда начинается с
первой команды алгоритма. Если была нажата пауза, то можно продолжить
выполнение с той команды, на которой машина остановилась. Программу
можно выполнить по шагам:
• пункт главного меню Пуск/ Пошагово;
• кнопка пошагово на панели инструментов.
При этом выполнится очередная команда и выполнение программы
приостановится. Полностью прервать выполнение программы:
• пункт главного меню Пуск/ Прервать;
• кнопка прервать на панели инструментов.
Регулировать скорость выполнения: пункт главного меню Скорость.
7. Ошибки машины Поста. При возникновении следующих ошибок происходит прерывание исполнения алгоритма:
• Не указана команда;
• Не указана отсылка;
• Неверно указан номер отсылки;
• Команды с таким номером не существует;
13
• Нельзя поставить метку, где она уже есть;
• Нельзя стереть метку, где ее нет;
• Ошибка чтения файла;
• Ошибка записи файла.
Порядок выполнения практического занятия
1. Изучить общие сведения и методику выполнения практического занятия, выполнить ее указания (прежде всего, создать рабочий каталог
для сохранения файлов к практическим занятиям).
2. Получить у преподавателя задание по практическому занятию (описание алгоритма и программы для машины Поста).
3. Загрузить интерпретатор машины Поста (Алго2000).
4. Ввести программу и выполнить ее исследование.
5. Сформулировать результаты исследования программы на машине
Поста в письменном виде.
6. Составить отчет по работе в соответствии с прил. 1. В отчет включить
результаты исследования алгоритма на машине Поста с комментариями.
7. Ответить устно на контрольные вопросы к практическому занятию.
Контрольные вопросы
1.
Объясните устройство машины Поста.
2.
Перечислите и объясните команды машины Поста.
3.
Объясните порядок работы машины Поста.
4.
Что представляет собой таблица машины Поста?
14
5.
Какие возможны ошибки в работе машины Поста?
Практическое занятие №2.
Исследование работы
машины Тьюринга
Цель практического занятия: познакомиться с описанием машины Тьюринга. Научится создавать простейшие программы и выполнить исследование работы машины Тьюринга с помощью программного интерпретатора
Алго2000.
Общие сведения
1. Устройство машины Тьюринга. Машина Тьюринга - абстрактная машина. Машина Тьюринга состоит из информационной ленты, каретки (считывающая и записывающая головка), лентопротяжного механизма и операционного исполнительного устройства. Лента ограничена (т.е. жестко закреплена) слева и бесконечна справа. Лента разделена на секции одинакового
размера. В каждую секцию ленты заносятся символы внешнего алфавита
машины Тьюринга A = {a0, a1,... aN}, где а0, как правило, пробел. Каретка
может передвигаться вдоль ленты влево и вправо. Когда она неподвижна,
она стоит против ровно одной секции ленты; говорят, что каретка обозревает
эту секцию. А такая секция называется текущей или обозреваемой. За единицу времени, которая называется шагом, каретка может сдвинуться на одну
секцию влево или вправо. Кроме того, каретка может также распознать содержимое обозреваемой секции, может заносить символ внешнего алфавита в текущую секцию и может стирать содержимое текущей ячейки. Операционное исполнительное устройство может находиться в одном из дискретных состояний: Q = {q0, q1,...qM} - внутренний алфавит машины Тьюринга
или алфавит внутренних состояний.
2. Команды и порядок работы машины Тьюринга.
15
Порядок работы машины Тьюринга обычно задается в виде таблицы: в
каждый столбец верхней строчки заносятся символы внутреннего алфавита,
в каждую строчку первого столбца - символы внешнего алфавита. В ячейках
на пересечении других столбцов и строчек помещаются команды. Если на
пересечении какой-либо строки и какого-либо столбца мы получим пустую
клетку, то это означает, что в данном внутреннем состоянии данный символ
встретиться не может.
A/Q
q0
q1 … qn
a0
a1
…
ai
aKq
…
am
Формат команды: aKq, где:
a - новое содержание текущей ячейки (новый символ внешнего алфавита, который заносится в текущую ячейку);
K - команда лентопротяжного механизма машины Тьюринга (влево,
вправо, стоп);
q - новое внутренне состояние машины Тьюринга.
Работа машины Тьюринга состоит в том, что каретка передвигается
вдоль ленты и печатает или стирает символы. Чтобы машина Тьюринга работала, первым делом надо задать внешний алфавит, т.е. указать какие символы в него входят. Затем надо задать некоторую программу и некоторое состояние машины (т.е. нужно как-то расставить символы внешнего алфавита
по секциям ленты, в частности, можно все секции оставить пустыми, и поста16
вить каретку против одной из секций). Работа машины на основании заданной программы происходит следующим образом. Предположим, что в данный момент времени машина Тьюринга находится во внутреннем состоянии
q[i], а в обозреваемой кареткой ячейке ленты находится символ a[j]. Тогда
машина переходит к выполнению команды aKq в ячейке, на пересечении
столбца q[i] и строчки a[j]:
1) в текущую секцию ленты заносится новый символ a.
2) происходит сдвиг каретки влево (K = влево), или сдвиг каретки вправо (K = вправо), или происходит остановка машины (K = стоп).
3) машины переходит в новое внутреннее состояние q.
3. Возможные случаи останова машины Тьюринга:
1) в ходе выполнения программы машина дойдет до выполнения команды остановки; программа в этом случае считается выполненной, машина
останавливается - происходит результативная остановка.
2) машина никогда не останавливается, происходит зацикливание.
4. Главное меню панели приложения Algo2000. Под текущей машиной
понимается машина Поста или машина Тьюринга, в зависимости от того, какая из них является активной в данный момент. Файл машины Поста имеет
расширение *.pst, а файл машины Тьюринга - *.tur
(МП) - данный пункт меню виден только в машине Поста.
(МТ) - данный пункт меню виден только в машине Тьюринга.
Файл
Новый - создает новый файл текущей машины с именем 'Без имени'
Открыть - загружает ранее сохраненный файл текущей машины
Сохранить - сохраняет файл текущей машины на диск
17
Сохранить как - сохраняет файл текущей машины на диск с новым именем
Выход - выход из программы
Интерпретатор - переход на соответствующую машину:
Машина Поста
Машина Тьюринга
Вид - прячет/ показывает соответствующие компоненты программы:
Панель инструментов
Условие задачи
Строка состояния
Команды
Каретка влево - сдвиг каретки влево на одну ячейку
Каретка вправо - сдвиг каретки вправо на одну ячейку
Поставить/ удалить метки (МП) - отметить/ удалить метки в выделенных
ячейках ленты
Отметить символ на ленте (МТ) - занести текущий символ внешнего алфавита в выделенные ячейки ленты
Изменить символ (МТ) - изменить значение в выделенных ячейках ленты
Очистить - очищает содержимое соответсвующих компонентов программы:
• Условие задачи
• Информационную ленту
18
• Таблицу
в МТ для очистки таблицы полностью нужно очистить внешний алфавит
• Столбец
• Строку
• Внешний алфавит (МТ)
• Комментарии (МТ)
• Все
Манипуляции со строками и столбцами в таблице:
Удалить столбец (МТ)
Вставить столбец (МТ)
Добавить столбец (МТ)
Удалить строку (МП)
Вставить строку (МП)
Добавить строку (МП)
в МТ строки добавляются (удаляются) добавлением (удалением) символов во внешнем алфавите
Запомнить ленту - запоминает ленту
Восстановить ленту - восстанавливает запомненную ленту
работают отдельно(независимо) для МП и МТ
Пуск
Запустить - начинает выполнение программы (для МП с команды номер
1, для МТ с состояния q0)
19
Пауза - приостановить выполнение программы (затем можно продолжить выполнение с данного места)
Пошагово - пошаговое выполнение программы
Прервать - прервать выполнение программы (продолжить выполнение
с прерванного места нельзя)
Скорость - изменяет скорость выполнения программы
Очень быстро
Быстро
Средне
Медленно
Очень медленно
Помощь
Справка - вызов справки
О программе - информация о программе Algo2000
5. Внешний алфавит. Это редактор для введения, отображения и хранения символов внешнего алфавита машины Тьюринга. Его необходимо заполнять в первую очередь, при написании алгоритма машины Тьюринга.
Каждый символ можно указать только один раз. Между символами могут
быть пробелы. Символ "Пробел" присутствует во внешнем алфавите всегда
по умолчанию. Если редактор "внешний алфавит" не виден, выберите пункт
меню "Вид/ Внешний алфавит", повторный выбор прячет редактор.
После окончания ввода внешнего алфавита формируется первый столбец таблицы: он заполняется символами внешнего алфавита в том же порядке. При редактировании внешнего алфавита автоматически изменяется
таблица: вставляются, удаляются или меняются местами строки. При очистке
"внешнего алфавита", очищается вся таблица.
20
6. Информационная лента машины Тьюринга. Лента состоит из 999
ячеек, нумерация от 1 до 999. Ячейка с толстой рамкой, находящаяся в центре ленты - каретка. Всплывающее меню ленты вызывается при щелчке правой кнопкой мыши на ленте. Перед тем как заполнять ленту нужно ввести
внешний алфавит. При получении фокуса лентой на ней появляется курсор
(синий прямоугольник). Его можно сдвигать по ленте вправо и влево клавишами управления курсором. Удерживая клавишу Shift и нажимая клавиши
"Влево"/ "Вправо" можно выделить несколько ячеек. Также ячейки можно
выделить мышью: удерживая левую кнопку и выделив нужные. Текущий
символ внешнего алфавита - символ который отображен на кнопке "Отметить символ на ленте" панели инструментов. Если на кнопке стоит надпись
"нет", значит текущим символом является пробел. Изменить текущий символ можно выбрав другой из списка, выпадающего по щелчку мыши на
кнопке с направленной вниз стрелочкой ("Изменить символ") или выбрав
пункт меню "Команды/Изменить символ". Новый символ сразу помещается
на кнопку на панели инструментов, а также записывается в выделенные
ячейки ленты. Символы внешнего алфавита ставятся в ячейках, которые выделены. Это можно сделать несколькими способами (лента должна быть
сфокусирована):
• нажать клавишу клавиатуры компьютера с соответствующим символом
• выбрать пункт главного или всплывающего меню "Изменить символ"
и выбрать символ из списка.
Записать текущий символ:
• щелкнуть мышью на кнопку "Отметить символ на ленте" на панели
инструментов
• выбрать пункт главного или всплывающего меню "Отметить символ на
ленте"
21
• двойным щелчком мыши (в этом случае изменение происходит только в одной ячейке).
Удалить символ в выделенных ячейках:
• клавиша "Пробел"
• выбрать пункт главного или всплывающего меню "Изменить символ"
и выбрать "нет" из списка.
Клавиши управления курсором "Вверх" или "Вниз" ставят курсор в каретку.
"Home" - курсор в начало видимой части ленты.
"End" - курсор в конец видимой части ленты.
"Ctrl" + "Влево" - сдвиг каретки влево
"Ctrl" + "Вправо" - сдвиг каретки вправо
Кнопки со стрелкой слева и справа от ленты - прокрутить каретку соответственно влево и вправо
Кнопки со стрелкой и вертикальной палочкой слева и справа от ленты прокрутить каретку соответственно до крайней левой отмеченной ячейки и
до крайней правой отмеченной ячейки. Номера этих ячеек указываются в
строке состояния как мин и макс соответственно. Можно непосредственно
поставить каретку в нужную ячейку, указав ее номер в редакторе над кареткой. Ленту можно запомнить (пункт меню Команда/Запомнить ленту) и затем восстановить (Команда/ Восстановить ленту).
7. Таблица машины Тьюринга. В нее непосредственно вписывается алгоритм решения задачи. Прежде, чем вводить алгоритм, нужно ввести
внешний алфавит. В ячейках верхней строки записываются символы внутреннего алфавита: Q1,Q2...Qn. В ячейках первого столбца записываются символы внешнего алфавита. В ячейках других столбцов и строчек помещаются
команды машины Тьюринга. Формат команды машины Тьюринга: aKq, где:
22
a - новое содержание текущей ячейки (новый символ внешнего алфавита, который заносится в текущую ячейку),
K - команда лентопротяжного механизма машины Тьюринга (влево,
вправо, стоп)
q - новое внутренне состояние машины Тьюринга
Чтобы ввести команду в ячейку нужно:
1) Ввести символ внешнего алфавита
2) Ввести одну из команд лентопротяжного механизма:
• "Влево" - ввести левую угловую скобку "<"
• "Вправо" - ввести правую угловую скобку ">"
• "Cтоп" - ввести восклицательный знак "!"
3) Ввести номер нового внутреннего состояния. Нужно ввести только
цифру, букву Q вводить не надо.
Пример: чтобы ввести команду #→Q1 нужно последовательно набрать
на клавиатуре символы: # > 1 , где:
# - указание машине Тьюринга записать символ "#" в текущую ячейку
ленту
> - указание машине Тьюринга сдвинуть каретку вправо
1 - указание машине Тьюринга перейти в новое внутреннее состояние
Q1
Пробелы в команде игнорируются. Чтобы указать в команде в качестве
символа внешнего алфавита "пробел", нужно ввести в ячейку символ подчеркивания "_", пробел или ввести сразу команду лентопротяжного механизма. Если команда не была введена правильно, то в ячейку таблицы ничего не запишется. Чтобы удалить, вставить, добавить столбцы, очистить стро23
ки или столбцы воспользуйтесь соответствующими пунктами главного или
всплывающего меню или панелью инструментов.
8. Исполнение алгоритма машины Тьюринга. Запуск алгоритма на исполнение:
• пункт главного меню Пуск/ Запустить
• кнопка запустить на панели инструментов
При этом выполнение программы будет идти до тех пор, пока не встретиться команда стоп или не возникнет какая- нибудь ошибка. Приостановить
выполнение:
• пункт главного меню Пуск/ Пауза
• кнопка пауза на панели инструментов
Если выполнение не было приостановлено, то оно всегда начинается с
нулевого внутреннего состояния Q0. Если была нажата пауза, то можно продолжить выполнение с той команды, на которой машина остановилась.
Программу можно выполнить по шагам:
• пункт главного меню Пуск/ Пошагово
• кнопка пошагово на панели инструментов
При этом выполнится очередная команда и выполнение приостановится. Полностью прервать выполнение программы:
• пункт главного меню Пуск/ Прервать
• кнопка прервать на панели инструментов
Регулировать скорость выполнения:
• пункт главного меню Скорость
9. Ошибки машины Тьюринга. При возникновении следующих ошибок
происходит прерывание исполнения алгоритма:
24
• Данного символа нет в алфавите;
• Не указана команда;
• Неверная запись команды;
• Состояние Qi отсутствует;
• Ошибка чтения файла;
• Ошибка записи файла.
Порядок выполнения практического занятия
8. Изучить общие сведения и методику выполнения практического занятия, выполнить ее указания (прежде всего, создать рабочий каталог
для сохранения файлов к практическим занятиям).
9. Получить у преподавателя задание по практическому занятию (описание алгоритма и программы для машины Тьюринга).
10.
Загрузить интерпретатор машины Тьюринга (программное приложение Algo2000).
11.
Ввести программу и выполнить ее исследование.
12.
Сформулировать результаты исследования программы на машине Тьюринга в письменном виде.
13.
Составить отчет по работе в соответствии с прил. 1. В отчет включить результаты исследования алгоритма на машине Тьюринга с
комментариями.
14.
Ответить устно на контрольные вопросы к практическому занятию.
Контрольные вопросы
1.
Объясните устройство машины Тьюринга.
25
2.
Перечислите и объясните команды машины Тьюринга.
3.
Объясните порядок работы машины Тьюринга.
4.
Что представляет собой таблица машины Тьюринга?
5.
Какие возможны ошибки в работе машины Тьюринга?
Практическое занятие №3.
Анализ трудоемкости
алгоритмов
Цель практического занятия: познакомиться с терминологией и методами анализа трудоемкости алгоритмов. Научится оценивать трудоемкость
простейших алгоритмов.
Общие сведения
1. В качестве формальной алгоритмической системы рассмотрим абстрактную вычислительную машину, включающую процессор, поддерживающий адресную память и набор «элементарных» операций соотнесенных с
языком высокого уровня. Конкретная проблема (задача) задается N словами
памяти, т.е. на входе алгоритма задано N
N [бит] информации, где
[бит] — длина слова. Таким образом, N является мерой длины входа алгоритма. Программа, реализующая алгоритм для решения общей проблемы,
состоит из М машинных инструкций длиной по M бит, всего — M
M M
бит информации. Кроме того, алгоритм может требовать следующих дополнительных ресурсов абстрактной машины: S d — память для хранения промежуточных результатов; S r — память для организации вычислительного
процесса (память, необходимая для реализации рекурсивных вызовов и
возвратов). Однако, по условию, при решении конкретной проблемы, заданной N словами памяти алгоритм выполняет не более, чем конечное количество «элементарных» операций абстрактной машины.
26
2. Трудоёмкость алгоритма. Под трудоёмкостью алгоритма A для данного конкретного входа N понимают количество «элементарных» операций
совершаемых алгоритмом для решения конкретной проблемы в данной
формальной системе — FA N .
Комплексный анализ алгоритма может быть выполнен на основе комплексной оценки ресурсов формальной алгоритмической системы. Для различных областей применения веса ресурсов будут различны, в этом случае
комплексная оценка трудоемкости алгоритма имеет вид:
A
c1FA N
c2 M
c3 S d
c4 S r , где ci — веса ресурсов.
3. При более детальном анализе трудоемкости алгоритма оказывается,
что количество элементарных операций, выполняемых алгоритмом на одном входе длины N, не всегда совпадает с количеством операций на других
входных данных такой же длины. Введем следующие обозначения. Пусть
D A — множество данных различных вариантов конкретной проблемы, заданное в формальной системе. Пусть D DA – задание конкретной проблемы и D
N . В общем случае существует собственное подмножество мно-
жества D A , включающее все конкретные проблемы, имеющие мощность N.
Обозначим это подмножество через DN : DN ={ D DA : D
мощность множества DN через M DN ,т.е. DN
N }; обозначим
M DN . В этом случае алго-
ритм A, решая различные задачи размерности N, будет выполнять различное
количество операций.
4. Ведем следующие обозначения:
FA N — худший случай – наибольшее количество операций, совершаемых алгоритмом А для решения конкретных проблем размерностью N;
FA N — лучший случай – наименьшее количество операций, совершаемых алгоритмом А для решения конкретных проблем размерностью N;
27
FA N — средний случай — среднее количество операций, совершае-
мых алгоритмом А для решения конкретных проблем размерностью N:
FA N
FA D — средний случай на DN .
1/ M DN
D DN
5. В зависимости от свойств функции трудоемкости рассматривают следующие типы алгоритмов:
а) количественно-зависимые по трудоемкости алгоритмы
Это алгоритмы, функция трудоемкости которых зависит только от размерности конкретного входа, и не зависит от конкретных значений:
FA D
FA D
FA N
Примерами алгоритмов с количественно-зависимой функцией трудоемкости могут служить алгоритмы для стандартных операций с массивами и
матрицами — умножение матриц, умножение матрицы на вектор и т.д.
б) параметрически-зависимые по трудоемкости алгоритмы
Это алгоритмы, трудоемкость которых определяется не размерностью
входа (как правило, для этой группы размерность входа обычно фиксирована), а конкретными значениями обрабатываемых слов памяти:
FA D
FA d1 ,..., d n
FA P1 ,..., Pm , m n
Примерами алгоритмов с параметрически-зависимой трудоемкостью
являются алгоритмы вычисления стандартных функций путем вычисления
соответствующих степенных рядов с заданной точностью.
в) количественно-параметрические по трудоемкости алгоритмы
Однако в большинстве практических случаев функция трудоемкости зависит как от количества данных на входе, так и от значений входных данных,
в этом случае:
28
FA D
FA D , P1 ,..., Pm
FA N , P1 ,..., Pm .
В качестве примера можно привести алгоритмы численных методов, в
которых параметрически-зависимый внешний цикл по точности включает в
себя количественно-зависимый фрагмент по размерности.
г) порядково-зависимые по трудоемкости алгоритмы
В таких алгоритмах количество операций зависит от порядка расположения исходных объектов. Пусть множество D состоит из элементов

d1 ,..., d N — множество всех упоряd1 ,..., d N , и D N . Определим D



доченных N-ок d1 ,..., d N , отметим, что D n!. Если FA Di FA D j , где
 

Di , D j D то алгоритм называется порядково-зависимым по трудоемкости.
6. При анализе поведения функции трудоемкости алгоритма часто используют принятые в математике асимптотические обозначения, позволяющие показать скорость роста функции. Такая оценка функции трудоемкости
алгоритма называется сложностью алгоритма. В асимптотическом анализе
приняты следующие обозначения:
а) оценка
(тетта)
Пусть f(n) и g(n) — положительные функции положительного аргумента,
тогда: f n
g n , если существуют положительные c1 , c2 , n0 , такие, что
c1 g n
f n
c2 g n , при n n0 . Говорят, что в этом случае функция g(n) яв-
ляется асимптотически точной оценкой функции f(n), так как по определению функция f(n) не отличается от функции g(n) с точностью до постоянного
множителя. Отметим, что из f n
g n следует, что g n
f n .
б) оценка О (О большое)
В отличие от оценки , оценка О требует только, что бы функция f(n) не
превышала g(n) начиная с n n0 , с точностью до постоянного множителя,
т.е. существуют положительные c, n0 , такие, что 0
29
f n
cg n , при n n0 .
Вообще, запись O(g(n)) обозначает класс функций, таких, что все они растут
не быстрее, чем функция g(n) с точностью до постоянного множителя, поэтому иногда говорят, что g(n) мажорирует функцию f(n). Например, для всех
функций: f(n)=1/n, f(n)=12, f(n)=3*n+17, f(n)=n*ln(n), f n
дет справедлива оценка f n
в) оценка
6n 2
24n 77 бу-
O n2 .
(Омега)
В отличие от оценки О, оценка
является оценкой снизу — т.е. определяет класс функций, которые растут не медленнее, чем g(n) с точностью до
постоянного множителя (существуют положительные c, n0 , такие, что
0 cg n
f n , при n n0 ). Например, запись
функций, которые растут не медленнее, чем g n
n ln n
обозначает класс
n ln n , в этот класс попа-
дают все полиномы со степенью большей единицы, равно как и все степенные функции с основанием большим единицы.
7. Для получения функции трудоемкости алгоритма, представленного в
формальной системе введенной абстрактной машины необходимо уточнить
понятия «элементарных» операций, соотнесенных с языком высокого уровня. В качестве таких «элементарных» операций предлагается использовать
следующие:
простое присваивание: a
b (или a : b );
одномерная индексация a[i] : (адрес (a)+i*длина элемента);
арифметические операции: (*, /, -, +);
операции сравнения: a
b;
логические операции: or, and, not.
Команду перехода по адресу не будем учитывать, считая ее связанной с
операцией сравнения в конструкции ветвления.
30
После введения элементарных операций анализ трудоемкости основных алгоритмических конструкций в общем виде сводится к следующим положениям:
а) Конструкция «Следование»
Трудоемкость конструкции есть сумма трудоемкостей
блоков,
следующих
друг
за
другом.
Fследование
f1 ...
fk
, где k — количество блоков.
б) Конструкция «Ветвление»
if(
l
)
then
else
Общая трудоемкость конструкции «Ветвление» требует анализа вероятности выполнения переходов на блоки «Then» и «Else» и определяется выражением
Fветвление
f then p
f else 1 p
в) Конструкция «Цикл»
31
После сведения конструкции к элементарным операциям ее трудоемкость определяется выражением Fцикл 1 3N Nf тела цикла .
8. Примеры анализа простых алгоритмов
Пример 1. Задача суммирования элементов квадратной матрицы.
SumM (A,n;Sum)
Sum:=0
For i:=1 to n
For j:=1 to n
Sum:=Sum+A[i,j]
end for
Return (Sum)
End
Алгоритм выполняет одинаковое количество операций при фиксированном значении n, и следовательно является количественно-зависимым.
Применение методики анализа конструкции «Цикл » дает: FA n =1+1+
2
n(3+1+n(3+4))=7 n +4n+2=
n 2 . Заметим, что здесь под n понимается линей-
2
ная размерность матрицы, в то время как на вход алгоритма подается n
значений.
Пример 2. Задача поиска максимума в массиве.
MaxS (S,n;Max)
Max:=S[1]
For i:=2 to n
if Max<S[i]
32
then Max:=S[i]
end for
return Max
End
Данный алгоритм является количественно-параметрическим, поэтому
для фиксированной размерности исходных данных необходимо проводить
анализ для худшего, лучшего и среднего случая.
Порядок выполнения практического занятия
1. Изучить общие сведения и методику выполнения практического занятия, выполнить ее указания (прежде всего, создать рабочий каталог
для сохранения файлов к практическим занятиям).
2. Получить у преподавателя задание по практическому занятию (описание алгоритма).
3. Представить алгоритм в формальной системе абстрактной машины,
введенной в описании практического занятия.
4. Выполнить анализ трудоемкости алгоритма (аналогично приведенным примерам).
5. Сформулировать результаты анализа трудоемкости алгоритма в
письменном виде.
6. Составить отчет по работе в соответствии с прил. 1.
7. Ответить устно на контрольные вопросы к практическому занятию.
Контрольные вопросы
1. Объясните понятие трудоемкости алгоритма.
33
2. Объясните понятия лучшего, худшего и среднего случаев алгоритмической трудоемкости.
3. В чем заключается классификация алгоритмов по типам трудоемкости?
4. Объясните понятие сложности алгоритма?
5. Какие типы асимптотических оценок сложности алгоритмов существуют?
6. Как выполняется анализ трудоемкости алгоритма?
Библиографический список
1. Алферова З.В. Теория алгоритмов. — М.: «Статистика», 1973. — 165 с.
2. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы. Построение и анализ.
– М.: МЦНМО, 1999. 960 с.
3. Игошин В.И. Математическая логика и теория алгоритмов. Саратов:
Издательство Саратовского ун-та. 1991. 256 с.
4. ГОСТ 19.701-90 - Единая система программной документации. Схемы
алгоритмов, программ, данных и систем. Условные обозначения и правила
выполнения.
34
Приложение 1
Требования к оформлению отчета
Отчет по практическому занятию оформляется в соответствии с ГОСТ
ЕСКД 2.105-95 "Общие требования к текстовым документам" и должен содержать:
1. Титульный лист с указанием темы и номера практического занятия,
номеров учебной группы и бригады, Ф.И.О. студентов и преподавателя.
2. Формулировку цели занятия.
3. Задание на выполнение занятия.
4. Краткий порядок выполнения занятия.
5. Результаты выполнения занятия с комментариями и иллюстрациями.
6. Выводы.
Приложение 2
Типовые задания к практическим занятиям
Занятие №1. Словесное представление алгоритмов
Составить словесное описание алгоритма и представить его в виде текста описания.
Варианты заданий:
35
36
Занятие №2. Графическое представление алгоритмов
Составить словесное описание алгоритма и представить его в виде схемы (блок-схемы).
Варианты заданий:
1.1. Алгоритм Эратосфена (около I века н.э.) отыскания простых чисел в
натуральном ряду:
а) Обозревай натуральные числа в порядке возрастания, найди самое
меньшее не вычеркнутое число, большее единицы. Пусть это p>1. Оно простое. Далее переходи к следующему указанию.
б) Вычеркивай все числа кратные p и переходи к выполнению указания
а) начиная с числа p+1.
1.2. Алгоритм Евклида для нахождения наибольшего общего делителя
двух целых положительных чисел a и b:
а) Обозревай заданные два числа a и b. Переходи к следующему указанию.
б) Сравни обозреваемые числа a=b, a<b, a>b. Переходи к следующему
указанию.
в) Если обозреваемые числа равны, то каждое из них дает искомый результат. Процесс вычислений прекращается. В противном случае переходи к
следующему указанию.
г) Если a<b, то переставь их местами и переходи к следующему указанию.
д) Вычитай второе число из первого и обозревай два числа: вычитаемое
и остаток. Переходи к указанию б).
37
Каковы бы ни были два числа a и b, за конечное число применений а) –
д), всегда получим требуемый результат.
1.3. Арифметические действия сложения, вычитания, умножения и деления над числами в десятичном счислении.
1.4. Извлечение квадратного корня из положительного действительного
числа, заданного в десятичном счислении.
1.5. Греческая мифология повествует о том, как легендарный Тезей отважился проникнуть в подземный лабиринт с тем, чтобы отыскать и убить
чудовищного Минотавра, и благополучно выбрался из лабиринта, пользуясь
клубком ниток, врученным ему Ариадной. Каким же методом пользовался
Тезей, продвигаясь по запутанным коридорам подземелья, что не заблудился?
Представим себе, что имеется конечное число площадок лабиринта
A,B,C,D,…,Q, соединенных между собой коридорами (рис. 1). Каждый коридор соединяет две смежные площадки. От некоторых площадок исходит
только один коридор (тупиковые площадки). Например, схематически лабиринт можно представить в следующем виде:
38
Рис. 1. Схема лабиринта
Площадка X достижима с площадки Y, если существует путь, ведущий от
Y к X через промежуточные коридоры и площадки: Y, X1, X2, …, Xn, X, где Y и
X1, X1 и X2,…, Xn и X смежные площадки.
Так, в нашей схеме площадка G достижима с площадки A, а площадка M
– недостижима.
Тезею следует разыскать Минотавра, если площадка, на которой находится Минотавр, достижима с той площадки, где стоит Ариадна с концом
клубка в руке. Уничтожив Минотавра, Тезею следует возвратиться по кратчайшему пути. Если же Минотавр недостижим, то Тезею следует, обследовав
все достижимые площадки, вернуться к Ариадне.
Укажем один приемлемый алгоритм. Будем считать, что кроме клубка
ниток Тезей запасся куском мела для пометки обследованных площадок и
коридоров.
В процессе поиска Тезею могут встретиться коридоры:
а) ни разу не пройденные (свободные),
б) пройденные один раз (с протянутой по ним нитью),
в) пройденные дважды – туда и обратно (помеченные с двух концов
крестиками).
В случае а) Тезею следует идти вперед, разматывая за собой клубок. Если с данной площадки исходит несколько свободных коридоров, то он должен выбрать ближайший справа от себя коридор. Например, попав первый
раз с площадки C на площадку E, он должен идти по коридору ED.
Если же окажется, что на данной площадке все коридоры меченые (т.е.
либо отмечены крестиком, либо протянута нить), то в этом случае Тезею
следует двигаться в обратном направлении по тому же коридору, по которому он только что пришел. При этом ему следует наматывать клубок и ко39
ридор помечать крестиком. Так, например, попав на площадку B со стороны
D он не найдет свободного коридора и вынужден будет идти по BD, DE и наматывать клубок. Коридоры BD и DE с обоих концов будут помечены крестиком.
Выбор хода на площадке зависит от следующих признаков:
Минотавр. Следует убить его и по коридорам, по которым протянута
нить, вернуться к Ариадне.
Свободный ход. Имеется, по крайней мере, один свободный коридор.
Петля. От данной площадки расходятся, по крайней мере, два коридора, через которые протянута нить.
Отсутствие всех трех предыдущих признаков – тупиковая площадка.
Ариадна. Поиск прекращается.
Итак, процесс поиска Минотавра определяется следующей таблицей.
№ п/п
Признак
Ход
1
Минотавр
Остановка, далее обратный ход
2
Свободный коридор
Разматывание нити
3
Петля
Наматывание нити
4
Тупик
Наматывание нити
5
Ариадна
Прекращение поиска
Через конечное число ходов Тезей обязательно придет к Ариадне, так
как лабиринт конечный. При этом если с площадки, где осталась Ариадна,
40
достижима площадка с Минотавром, то Тезей обязательно разыщет его, если же площадка с Минотавром недостижима, то убедится в этом.
1.6. На плацу выстроены 100 солдат в форме без учета их роста в каре
10 10. Требуется отобрать среди них самого высокого солдата.
Решение.
1 этап. Выбираем самого рослого в каждом ряду.
2 этап. Выбираем самого рослого среди 10 отобранных солдат.
Алгоритм для реализации в обоих этапах:
В каждом ряду i=1,2,…,9.
1) Начиная от j=1 до 9, сравни по росту стоящих рядом двух солдат xj и
xj+1, переходи к указанию 2).
2) Если xj выше чем xj +1 , то пусть они меняются местами, переходи к
указанию 1).
3) Солдат, стоящий крайним справа в ряду j, — самый рослый.
4) Выполни указания 1) и 2) для солдат, стоящих справа в каждом ряду.
5) Солдат, стоящий в дальнем правом углу будет самым рослым.
Занятие №3. Исследование работы машины Поста
Составить программу машины Поста и исследовать ее.
Варианты заданий:
Задача №1
41
Даны два массива меток, которые находятся на некотором расстоянии
друг от друга. Требуется соединить их в один массив. Каретка находится над
крайней левой меткой первого массива.
Решение:
1 удалить 2
2 вправо 3
3 ? 4,2
4 метка 5
5 вправо 6
6 ? 8,7
7 стоп 7
8 влево 9
9 ? 10,8
10 вправо 1
Задача №2
Нахождение суммы любого количества массивов, которые отделены
друг от друга одной ячейкой. Каретка находится над крайней левой меткой
первого массива.
Решение:
1 удалить 2
2 вправо 3
3 ? 4,2
4 метка 5
5 вправо 6
6 ? 10,7
7 влево 8
8 ? 9,7
9 вправо 1
10 стоп 10
Задача №3
42
Дан массив меток. Проверить, делится ли он нацело на 3. Если да, то
слева от него, через одну пустую ячейку поставить метку; если нет, то ничего
не делать. Каретка располагается над первой пустой ячейкой, примыкающей
к массиву слева.
Решение:
1 вправо 2
2 ? 3,4
3 стоп 3
4 вправо 5
5 ? 3,6
6 вправо 7
7 ? 8,1
8 вправо 9
9 метка 3
Задача №4
Дано несколько массивов меток. Удалить четные массивы. Каретка находится где-то над первым массивом.
Решение:
1 вправо 2
2 ? 3,1
3 вправо 4
4 вправо 5
5 вправо 6
6 ? 14,7
7 удалить 8
8 вправо 9
9 ? 10,7
10 вправо 11
11 вправо 12
12 вправо 13
13 ? 14,1
43
14 стоп 14
Задача №5
Дано некоторое число (в виде меток). Найти остаток от деления его на
3. Каретка располагается над первой пустой ячейкой, примыкающей к массиву меток справа.
Решение:
1 влево 2
2 ? 1,3
3 влево 4
4 ? 5,6
5 стоп 5
6 влево 7
7 ? 5,8
8 влево 9
9 ? 5,10
10 вправо 11
11 удалить 12
12 вправо 13
13 удалить 14
14 вправо 15
15 удалить 1
Задача №6
Удвоить данный массив справа от него, через ячейку, и затем стереть
исходный. Каретка находится над крайней левой меткой.
Решение:
1 влево 2
2 ? 3,1
3 вправо 4
4 удалить 5
5 вправо 6
44
6 ? 7,5
7 вправо 8
8 ? 9,7
9 метка 10
10 вправо 11
11 метка 12
12 влево 13
13 ? 14,12
14 влево 15
15 ? 16,1
16 стоп 16
Задача №7
Даны два целых положительных числа. Найти их разность по модулю.
Решение:
1 вправо 2
2 ? 3,1
3 влево 4
4 удалить 5
5 влево 6
6 ? 14,7
7 вправо 8
8 ? 7,9
9 удалить 10
10 вправо 11
11 ? 17,12
12 влево 13
13 ? 12,4
14 вправо 15
15 ? 14,16
16 удалить 17
17 стоп 17
45
Задача №8
Дано несколько массивов. Определить их количество. Каретка находится над крайней левой меткой первого массива.
Решение:
1 влево 2
2 влево 3
3 метка 4
4 вправо 5
5 вправо 6
6 ? 7,5
7 метка 8
8 вправо 9
9 ? 18,10
10 влево 11
11 ? 12,10
12 влево 13
13 ? 14,12
14 метка 15
15 вправо16
16 ? 17,15
17 вправо 6
18 влево 15
19 удалить 20
20 влево 21
21 ? 22,19
22 стоп 22
Задача №9
Найти масив и встать на его начало. Каретка располагается в любом
месте, но не над массивом.
Решение:
46
1 влево 2
2 ? 3,2
3 вправо 4
4 вправо 5
5 ? 6,23
6 влево 7
7 метка 8
8 влево 9
9 ? 10,8
10 влево 11
11 ? 12,20
12 вправо 13
13 метка 14
14 вправо 15
15 ? 16,14
16 вправо 17
17 ? 18,23
18 влево 19
19 метка 8
20 влево 21
21 ? 22,20
22 вправо 23
23 стоп 23
Задача №10
Дан массив из 2N-1 меток. Найти и удалить среднюю. Каретка над второй меткой, если считать справа.
Решение:
1 влево 2
2 ? 3,1
3 вправо 4
4 удалить 5
47
5 вправо 6
6 ? 7,5
7 влево 8
8 удалить 9
9 влево 10
10 ? 11,9
11 метка 12
12 вправо 13
13 удалить 14
14 вправо 15
15 ? 22,16
16 влево 17
17 вправо 18
18 ? 19,17
19 метка 20
20 влево 21
21 удалить 9
22 метка 23
23 стоп 23
Задача №11
Дано N массивов меток. После последнего массива на расстоянии более
трёх пустых ячеек находится одна метка. Массивы разделены тремя пустыми
ячейками. Количество меток в массиве >=2. Если количество меток в массиве
кратно трём, то стереть метки в этом массиве через одну, в противном случае стереть весь массив. Каретка находится над крайней левой меткой первого массива.
Решение:
1 вправо 2
2 ? 7,3
3 вправо 4
4 ? 7,5
48
5 вправо 6
6 ? 13,1
7 влево 8
8 ? 9,7
9 вправо 10
10 удалить 11
11 вправо 12
12 ? 19,10
13 влево 14
14 ? 15,13
15 вправо 28
16 удалить 17
17 вправо 18
18 вправо19
19 ? 20,16
20 вправо 21
21 ? 20,22
22 вправо 23
23 ? 25,24
24 влево 1
25 влево 26
26 удалить 27
27 стоп 27
28 вправо 16
Задача №12
Дан массив меток. Каретка располагается где-то над массивом, но не
над крайними метками. Стереть все метки, кроме крайних, и поставить каретку в исходное положение.
Решение:
1 удалить 2
2 влево 3
49
3 ? 4,2
4 вправо 5
5 вправо 6
6 вправо 7
7 ? 13,8
8 влево 9
9 ? 31,10
10 удалить 11
11 вправо 12
12 вправо 13
13 ? 14,8
14 влево 15
15 удалить 16
16 вправо 17
17 метка 18
18 вправо19
19 вправо 20
20 ? 26,21
21 влево 22
22 удалить 23
23 вправо 24
24 вправо 25
25 ? 26,20
26 влево 27
27 влево 28
28 ? 27,30
29 удалить 30
30 удалить 31
31 стоп 31
Задача №13
Составить программу нахождения разности двух целых неотрицательных чисел a и b. Если a меньше b, то перед разностью через одну пустую
50
ячейку поставить метку. Каретка находится над крайней левой меткой левого числа.
Решение:
1 вправо 2
2 ? 18,3
3 влево 4
4 удалить 5
5 вправо 6
6 ? 7,5
7 вправо 8
8 ? 7,9
9 вправо 10
10 ? 29,11
11 влево 12
12 удалить 13
13 влево 14
14 ? 13,15
15 влево 16
16 ? 17,15
17 вправо 1
18 влево19
19 удалить 20
20 вправо 21
21 ? 20,22
22 удалить 23
23 вправо 24
24 ? 28,25
25 влево 26
26 влево 27
27 метка 28
28 стоп 28
29 влево 30
51
30 удалить 31
31 стоп 31
Задача №14
Произвести умножение двух чисел. Каретка располагается над пустой
ячейкой, которая разделяет данные массивы.
Решение:
1 вправо 2
2 ? 1,3
3 влево 4
4 ? 5,14
5 вправо 6
6 удалить 7
7 вправо 8
8 ? 7,9
9 удалить 10
10 вправо 11
11 ? 12,10
12 метка 13
13 стоп 13
14 вправо 15
15 удалить 16
16 вправо 17
17 ? 16,18
18 удалить 19
19 вправо 20
20 ? 21,19
21 вправо 22
22 ? 23,21
23 метка 24
24 влево 25
25 ? 26,24
52
26 влево 27
27 ? 28,26
28 метка 29
29 вправо 30
30 ? 31,18
31 влево 32
32 ? 1,31
Задача №15
Дан массив из N Меток. Сделать из него массив, в котором будет 2N+1
меток. Если полученный массив делится нацело на 3, то справа от него, через одну пустую ячейку, поставить две метки; если нет - то три метки. Каретка находится над крайней левой меткой.
Решение:
1 удалить 2
2 вправо 3
3 ? 4,2
4 вправо 5
5 ? 6,4
6 метка 7
7 вправо 8
8 метка 9
9 влево 10
10 ? 11,9
11 влево 12
12 ? 13,15
13 вправо 14
14 метка 18
15 влево 16
16 ? 17,15
17 вправо 1
18 вправо 19
53
19 вправо 20
20 вправо 21
21 ? 22,18
22 влево 23
23 ? 24,37
24 влево 25
25 ? 38,26
26 вправо 38
27 метка 28
28 вправо 29
29 метка 30
30 вправо 31
31 метка 36
32 вправо 33
33 метка 34
34 вправо 35
35 метка 36
36 стоп 36
37 вправо 32
38 вправо 27
Занятие №4. Исследование работы машины Тьюринга
Составить программу машины Тьюринга и исследовать ее.
Варианты заданий:
Задача №1
На ленте машины Тьюринга записан массив из 2N меток. Задание:
уменьшить его в два раза.
Обозначения в таблице:
"ri"-указание машине пойти вправо.
54
"le"-указание машине пойти влево.
"pr"-указание машине поставить пробел.
"!"-указание машине остановиться.
"q1, q2, q3..."-переход соответственно в состояние q1, q2, q3 и т. д.)
Решение:
A/Q
q0
q1
q2
*
|
*-ri-q1
|-ri-q1
pr
pr-le-q4 pr-le-q2
q3
q4
*-ri-q0
|-le-q4
pr-le-q3 |-le-q3
pr-le-q4 pr!q4
Задача №2
Дан массив из букв "А" и "В". Нужно сжать массив, удалив все буквы "В",
но оставив буквы "А".
Решение:
A/Q
q0
q1
A
A-le-q0 A-ri-q1
B
B-le-q0 pr-ri-q1
q2
A-le-q3
*
pr
q3
q4
q5
pr-ri-q4 A-le-q5
pr-!-q3
*-ri-q1
pr-le-q2 pr-le-q2 pr-le-q3 pr-ri-q4 A-le-q3
Задача №3
Дана конечная последовательность из символов "+" и "—". Заменить "+"
на "—" на каждом втором месте.
55
Решение:
A/Q
q1
q2
+
+-ri-q0
pr
pr-le-q1 pr-!-q1
q3
+-le-q2 —-le-q1
pr-!-q2
Задача №4
Дана последовательность символов "*". Требуется записать их количество числом десятеричной системы счисления.
Решение:
A/Q
q0
0
0-ri-q4
q1
q2
q3
q4
1-le-q4 0-ri-q4
1
2-li-q4
1-ri-q4
2
3-li-q4
2-ri-q4
3
4-li-q4
3-ri-q4
4
5-li-q4
4-ri-q4
5
6-li-q4
5-ri-q4
6
7-li-q4
6-ri-q4
7
8-li-q4
7-ri-q4
8
9-li-q4
8-ri-q4
0-li-q4
9-ri-q4
9
9-ri-q4
*
*-ri-q0
pr
pr-le-q1 pr-!-q1
pr-le-q2 *-le-q2
pr-le-q3 1-ri-q4 pr-ri-q0
Задача №5
56
Дано слово из букв "a", "b", "c", "d". Сосчитать количество букв "a", записать его слева от данного слова через одну ячейку. Каретка располагается
над крайней левой буквой.
Решение:
A/Q
q0
q1
q2
q3
0
1-ri-q3
0-ri-q3
1
2-ri-q3
1-ri-q3
2
3-ri-q3
2-ri-q3
3
4-ri-q3
3-ri-q3
4
5-ri-q3
4-ri-q3
5
6-ri-q3
5-ri-q3
6
7-ri-q3
6-ri-q3
7
8-ri-q3
7-ri-q3
8
9-ri-q3
8-ri-q3
9
0-le-q2
9-ri-q3
a
*-le-q1
b
b-ri-q0
b-le-q1
c
c-ri-q0
c-le-q1
d
d-ri-q0
d-le-q1
*
*-ri-q0
*-le-q1
pr
pr-le-q4 pr-le-q2
q4
a-le-q4
1-ri-q3
57
pr-riq0
pr-!-q4
Задача №6
Данное число в двоичной системе счисления перевести в число в восьмеричной системе. Каретка располагается над крайней левой цифрой.
Решение:
q0
q1
q2
q3
q4
q5
0
0-ri-q0
1-le-q1
0-le-q2
1-ri-q4
0-ri-q4
pr-ri-q5
1
1-ri-q0
0-le-q2
1-le-q2
2-ri-q4
1-ri-q4
pr-ri-q5
2
3-ri-q4
2-ri-q4
3
4-ri-q4
3-ri-q4
4
5-ri-q4
4-ri-q4
5
6-ri-q4
5-ri-q4
6
7-ri-q4
6-ri-q4
7
0-le-q3
7-ri-q4
pr
pr-ri-q1 pr-ri-q5 pr-le-q3
1-ri-q4 pr-ri-q0
pr-!-q5
Задача №7
Дано число в десятичной системе счисления. Записать его цифры наоборот.
Решение:
q0
q1
q2
q3
q4
0
0-ri-q0
9-le-q1
0-ri-q2
1-le-q4
0-le-q4
1
1-ri-q0
0-ri-q2
1-ri-q2
2-le-q4
1-le-q4
2
2-ri-q0
1-ri-q2
2-ri-q2
3-le-q4
2-le-q4
58
q5
3
3-ri-q0
2-ri-q2
3-ri-q2
4-le-q4
3-le-q4
4
4-ri-q0
3-ri-q2
4-ri-q2
5-le-q4
4-le-q4
5
5-ri-q0
4-ri-q2
5-ri-q2
6-le-q4
5-le-q4
6
6-ri-q0
5-ri-q2
6-ri-q2
7-le-q4
6-le-q4
7
7-ri-q0
6-ri-q2
7-ri-q2
8-le-q4
7-le-q4
8
8-ri-q0
7-ri-q2
8-ri-q2
9-le-q4
8-le-q4
9
9-ri-q0
8-ri-q2
9-ri-q2
0-ri-q3
9-le-q4
pr-ri-q5
pr
pr-le-q1 pr-ri-q5
pr-ri-q3
1-le-q4 pr-le-q1
pr-!-q5
Задача №8
Дано число в десятичной системе счисления и число в троичной системе
счисления. Найти их суммму и ответ записать в десятичной системе счисления (например 576+100). Каретка располагается над крайней правой цифрой
правого числа.
Решение:
q0
q1
q2
q3
q4
0
2-le-q4 0-le-q1
1-ri-q3
1-le-q4 2-le-q4
1
0-le-q1 1-le-q1
2-ri-q3
2-le-q4 0-le-q1
2
1-le-q1 2-le-q1
3-ri-q3
3-le-q4 1-le-q1
3
4-ri-q3
4
5-ri-q3
5
6-ri-q3
6
7-ri-q3
59
q5
pr-ri-q5
7
8-ri-q3
8
9-ri-q3
9
0-le-q2
pr
pr-leq0
+
+-le-q2
pr-!-q5
+-ri-q3 pr-ri-q5
Задача №9
Дано некоторое слово из букв "A" и"B". Оработать его так, чтобы слева
были буквы "A", а справа-"B". Каретка находится над крайней левой буквой.
Решение:
q0
q1
q2
q3
q4
q5
q6
q7
A
A-ri-q0
A-leq1
A-ri-q2
A-ri-q3
A-leq4
A-le-q5
pr-ri-q7
A-ri-q7
B
*-ri-q0
B-leq1
B-ri-q2
B-le-q4
|-ri-q3
pr-leq5
|-le-q5
|-ri-q6
|-ri-q7
*
|-ri-q2
|
|-leq1
|-ri-q2
pr-riq3
B-le-q1
pr
pr-leq1
pr-!-q4 pr-ri-q6
Задача №10
Дано число в десятичной системе счисления. Умножить его на 11.
60
A-le-q4
Решение:
q0
q1
q2
q3
q4
q5
q6
q7
0
0-ri-q0
9-leq1
0-le-q2
1-riq4
0-le-q4
0-leq6
1-ri-q7
0-ri-q7
1
1-ri-q0
0-leq2
1-le-q2
2-riq4
1-le-q4
1-leq6
2-ri-q7
1-ri-q7
2
2-ri-q0
1-ri-q2
2-le-q2
3-riq4
2-le-q4
2-leq6
3-ri-q7
2-ri-q7
3
3-ri-q0
2-ri-q2
3-le-q2
4-riq4
3-le-q4
3-leq6
4-ri-q7
3-ri-q7
4
4-ri-q0
3-ri-q2
4-le-q2
5-riq4
4-le-q4
4-leq6
0-le-q6
4-ri-q7
5
5-ri-q0
4-ri-q2
5-le-q2
6-riq4
5-le-q4
5-leq6
5-ri-q7
5-ri-q7
6
6-ri-q0
5-ri-q2
6-le-q2
7-riq4
6-le-q4
6-leq6
6-ri-q7
6-ri-q7
7
7-ri-q0
6-ri-q2
7-le-q2
8-riq4
7-le-q4
7-leq6
7-ri-q7
7-ri-q7
8
8-ri-q0
7-ri-q2
8-le-q2
9-riq4
8-le-q4
8-leq6
8-ri-q7
8-ri-q7
9
9-ri-q0
8-ri-q2
9-le-q2
0-leq3
9-le-q4
9-leq6
0-le-q6
9-ri-q7 pr-ri-q8
pr
pr-leq1
pr-riq8
pr-le-q3
1-riq4
pr-leq5
61
pr-riq0
q8
pr-!-q8
Задача №11
На ленте машины Тьюринга записан массив из N штук звёздочек ("*").
Задание: если N>5, то вывести N-2; если N=5, то вывести 1; если N<5, то вывести 2N.
Решение:
*
q0
q1
q2
q3
q4
q5
q6
q7
*-ri-q1
*-ri-q2
*-ri-q3
*-ri-q4
*-ri-q14
*-ri-q9
*-ri-q10
pr-riq11
pr-le-q8
pr-le-q7
pr-leq6
pr-le-q5
q 10
q 11
q 12
q 13
q 14
q 15
*-ri-q17
*-leq16
pr
Продолжение
q8
*
q9
*-ri-q12
pr
*-ri-q10
*-ri-q11
*-riq12
*-ri-q13
pr-!q13
pr-le-q15
Продолжение
q 16
*
pr-leq16
pr
pr-!-q16
q 17
q 18
q 19
*-ri-q17 pr-le-q19 pr-le-q20
pr-leq18
62
q 20
*-!-q20
Занятие №5. Анализ трудоемкости алгоритмов
Составить алгоритм в формальной системе абстрактной машины, введенной в описании практического занятия, выполнить анализ трудоемкости
алгоритма.
Варианты заданий:
Задача №1
Задан двумерный массив чисел A i, j , где i=1,2,…,n; j=1,2,…,m, т.е. множество
A
a11, a12 ,..., a1n , a21, a22 ,..., a2n ,..., aij ,..., am1, am2 ,..., amn . Составить
словесное описание алгоритма поиска одинаковых чисел в массиве A. Результат работы алгоритма представить в виде двумерного массива Q i, j ,
содержащего пары: значение числа и количество таких чисел в массиве A.
Задача №2
Составить алгоритм умножения матрицы A
B
bij
n
ci1
n1
по формуле C
A B , где C
aij
cij
m1
m n
на вектор-столбец
— вектор-столбец и
aij b j1 (i=1,2,…,m). Матрица A представлена двумерным массивом
j 1
чисел, а вектор B — одномерным массивом.
Задача №3
Составить алгоритм умножения вектора-строки B
A
aij
m n
по формуле C
B A , где C
cij
1n
bij
1 m
на матрицу
— вектор-строка и
m
b1i aij (j=1,2,…,n). Матрица A представлена двумерным массивом чи-
c1 j
i 1
сел, а вектор B — одномерным массивом.
Задача №4
63
Составить алгоритм умножения матрицы A
ней матрицу B
bij
s n
aij
m s
на сцепленную с
(в этом случае число столбцов матрицы A равно
числу строк матрицы B ) по формуле C
A B , где C
cij
m n
— и
s
ait btj (i=1,2,…,m; j=1,2,…,n). Матрицы A и B представлены двумер-
cij
t 1
ными массивами чисел.
Задача №5
Составить алгоритм транспонирования матрицы A
AT
a ji
n m
aij
m n
по формуле
.
Задача №6
Составить алгоритм, реализующий операцию объединения двух множеств M m1 , m2 ,..., mn и P p1 , p2 ,..., pk по формуле Q M P q ,
причем q M или q
P.
Задача №7
Составить алгоритм, реализующий операцию пересечения двух множеств M m1 , m2 ,..., mn и P p1 , p2 ,..., pk по формуле Q M P q ,
причем q M и q
P.
Задача №8
M
q
Составить алгоритм, реализующий операцию разности двух множеств
m1 , m2 ,..., mn и P p1 , p2 ,..., pk по формуле Q M \ P q , причем
M иq
P.
Задача №9
Задано множество чисел M
m1 , m2 ,..., mn . Составить алгоритм поиска
минимального числа множества M.
64
Задача №10
Задано множество чисел M
m1 , m2 ,..., mn . Составить алгоритм поиска
максимального числа множества M.
Задача №11
Задан массив чисел M
m1 , m2 ,..., mn . Составить алгоритм поиска оди-
наковых чисел в массиве M. Результат работы алгоритма представить в виде
двумерного массива Q i, j , содержащего пары: значение числа и количество таких чисел в массиве M.
Задача №12
Составить алгоритм проверяющий, является ли матрица A
aij
гональной, (для диагональной матрицы выполняется условие aij
всех i
n n
диа-
0 для
j ).
Задача №13
Составить алгоритм проверяющий, является ли матрица A
единичной,
(для
единичной
0, при i j
).
aij
ij
1, при i j
матрицы
выполняется
aij
n n
условие
Задача №14
Составить алгоритм проверяющий, является ли матрица A
aij
n n
верхней треугольной, (для верхней треугольной матрицы выполняется условие aij 0 при i j ).
Задача №15
65
Составить алгоритм проверяющий, является ли матрица A
aij
n n
нижней треугольной, (для нижней треугольной матрицы выполняется условие aij 0 при i j ).
66
Содержание
ВВЕДЕНИЕ .............................................................. 3
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №1. СЛОВЕСНОЕ
ПРЕДСТАВЛЕНИЕ АЛГОРИ ТМОВ....................................... 3
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №2. ГРАФИЧЕСКОЕ
ПРЕДСТАВЛЕНИЕ АЛГОРИ ТМОВ....................................... 5
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №3. ИССЛЕДОВАНИЕ РАБ ОТЫ
МАШИНЫ ПОСТА .......................................................... 8
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №4. ИССЛЕДОВАНИЕ РАБ ОТЫ
МАШИНЫ ТЬЮРИНГА .................................................... 15
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ №5. АНАЛИЗ ТРУДОЕМКОСТИ
АЛГОРИТМОВ .............................................................. 26
БИБЛИОГРАФИЧЕСКИЙ СПИСОК ................................ 34
ПРИЛОЖЕНИЕ 1 ...................................................... 35
ПРИЛОЖЕНИЕ 2 ...................................................... 35
.............................................................................................................................
67
Download