
- •Министерство образования и науки Украины
- •О.Н. Паулин
- •Приложение г Сравнение методов сортировки массивов
- •1. Содержание и порядок выполнения курсовой работы
- •1.1. Общие положения
- •Разработка эффективных алгоритмов.
- •1.2. Задания на разработку
- •Образец заполнения
- •Образец титульного листа
- •1.3. Рекомендации к выполнению курсовой работы
- •2. Примеры выполнения курсовой работы
- •2.I. Разработка эффективных алгоритмов
- •2.2. Построение машины Тьюринга
- •2.2.1. Вычисления на машине Тьюринга
- •Словесное описание алгоритма
- •Пример 2.3.
- •2.2.2. Примеры построения машин Тьюринга
- •В алгоритме имеются две операции выбора:
2. Примеры выполнения курсовой работы
2.I. Разработка эффективных алгоритмов
Пример 2.1.
Постановка задачи. Необходимо ввести таблицу покрытий, а также номера строк таблицы. Алгоритм должен определить, являются ли эти строки покрытием.
Математическое описание задачи и методов ее решения
Здесь необходимо описать математическую постановку задачи о покрытии и привести названия методов для ее решения с их краткой характеристикой.
Словесное описание алгоритма
1. Ввод числа строк (m) и числа столбцов (n) таблицы покрытия.
2. Ввод таблицы покрытия.
3. Ввод номеров строк таблицы покрытия.
-
Рассчитываем суммы элементов (S) по столбцам таблицы (в суммы включаются только проверяемые строки), начиная с первого до последнего (n-го), либо пока не встретится сумма, равная 0.
5. Если все рассчитанные суммы ненулевые, значит, проверяемые строки являются покрытием. В противном случае - не являются.
Разумеется, это не единственный метод для решения задачи. Поэтому имеет смысл сравнить несколько предлагаемых Вами способов.
Выбор структур данных и его обоснование
Из анализа задачи и её данных видно, что алгоритм должен работать с таблицей покрытия и с некоторыми переменными, которые представлены ниже (все переменные - целого типа):
m - количество строк таблицы покрытия;
n - количество столбцов таблицы покрытия;
kol - количество строк, проверяемых на покрытие;
n_str - промежуточная переменная для хранения номера строки;
i - переменная цикла.
10
|
0 |
1 |
. . . |
. . . |
. . . |
qi |
х х х |
0 R qj |
. . . |
. . . |
. . . |
qj |
0 L qj |
- |
. . . |
. . . |
. . . |
Рис. 2.7. Пример перехода в недетерминированную область
-
Циклическое зависание имеет место в случае, который может быть представлен следующими фрагментами ФС и графа перехода (рис. 2.8). Например, исходная конфигурация qi ...1 0 ... приводит к циклу qi - qj - qi - qj ...
Отметим, что цепочка зависающего цикла может состоять из любого количества состояний.
|
0 |
1 |
|
. . . |
|
qi |
х х х |
1 R qj |
|
. . . |
|
qj |
0 Lqi |
x x x |
|
. . . |
|

Рис. 2.8. Пример циклического зависания
-
Зацикливание в работе МТ с уходом головки в “бесконечность”.
Этот случай показан на рис. 2.9. Пусть исходная конфигурация МТ такова: qi ... 0 1 1 1 1 0 0 0 0 ... . Тогда после прохождения ряда единиц машина переходит в состояние qj, и далее её головка бесконечно движется вправо, обозревая лишь пустые ячейки.
27
Таблица 2.7
М3 |
0 |
1 |
q1 |
R q2 |
R q1 |
q2 |
R q2 |
R q3 |
q3 |
L q4 |
L q7 |
q4 |
- |
0 L q5 |
q5 |
L q5 |
L q6 |
q6 |
R ! |
L q6 |
q7 |
- |
0 L q8 |
q8 |
L q8 |
0 L q9 |
q9 |
R 10 |
R q2 |
q10 |
# q6 |
- |
Рассмотрим типичные аварийные ситуации.
-
Останов машины до достижения состояния покоя. Этот случай представлен на рис.2.6 фрагментами ФС и графа состояний (“ххх” означает, что содержимое ячейки в данной ситуации безразлично).
|
0 |
1 |
. . . |
. . . |
. . . |
qi |
0 S qi |
ххх |
. . . |
. . . |
. . . |
Рис. 2.6. Пример нештатного останова
-
Переход в недетерминированную область. Пусть конфигурация МТ в некоторый момент имеет вид: qi ... 0 1 1 0 ..., а фрагмент ФС, относящийся к этому моменту, такой, какой приведен на рис. 2.7. Тогда на следующем такте машина перейдёт в состояние qj, которое не определено, поскольку текущая ячейка не пуста.
26
Таблица покрытия - это двумерная матрица. Ее целесообразно представить в виде двумерного массива - A(m, n). D - одномерный массив для хранения номеров проверяемых строк матрицы покрытия. Для хранения номеров выбран массив, поскольку количество строк, хотя и неизвестно заранее, ограничено количеством строк матрицы покрытия (m).
Схема алгоритма
Схема алгоритма строится в соответствии с технологией проектирования «сверху вниз» [5], по которой вначале изображается схема алгоритма в общем виде, а затем она всё более детализируется вплоть до простых операторных вершин. В окончательном варианте, который будет представлен на графическом листе, следует привести основную схему, которая может включать в себя несколько процедур (функций), а также привести сами процедуры (функции). Для данного примера схема алгоритма представлена на рис. 2.1.
О
писание
схемы алгоритма.
Этот
раздел нужен, если в
схеме
алгоритма нет комментариев либо они
слишком кратки.
Алгоритм работает следующим образом. Сначала вводятся исходные данные (блоки 1, 2; в комментариях определено назначение данных), затем организуется цикл записи номеров строк, проверяемых на покрытие, в массив D (блоки 3-6). В блоке 7 вызывается функция POKR(D, kol, A, n), вычисляется её значение, которое затем присваивается условию usl; в соответствии со значением условия (проверка осуществляется в блоке 8) выдаются сообщения ‘да’ либо ’нет’ (блоки 9 и 10).
11
Подпрограммы и функции.
В данном случае используется процедура INS(NEL, LIST, POS) и функция POKR(D, kol, A, n). Процедура INS(NEL LIST, POS) предназначена для вставки нового элемента NEL в список LIST в позицию POS; для реализации этой процедуры может быть использован односвязный список. Функция POKR - более сложная, и потому она описана подробнее.
Словесное описание алгоритма, используемого в функции
Ф
ункция
POKR(D, kol,
A, n)
определяет, являются ли строки матрицы
А, номера которых заданы в списке D,
покрытием. Здесь kol
– количество элементов в массиве D, n
– количество столбцов матрицы A. Функция
возвращает 1, если заданные строки
матрицы A образуют покрытие, 0 - в противном
случае. Для функции POKR(D, kol,
A, n)
используется алгоритм, описанный в
пункте 4 словесного описания алгоритма
для решения всей задачи.
Описание локальных переменных (все - целые):
S - переменная для накопления суммы (целая);
i, j - переменные для организации циклов;
k - переменная для выбора номера строки из списка D.
Схема алгоритма для функции POKR представлена на рис. 2.2.
12
25
Таблица 2.5
Т |
Q |
Ситуация на ленте |
0 |
Q1 |
... 0 1 0 0 0 ... |
1 |
q1 |
... 0 1 0 0 0 ... |
2 |
q2 |
... 0 1 0 0 0 ... |
3 |
q3 |
... 0 0 0 0 0 ... |
4 |
q4 |
... 0 0 0 0 0 ... |
5 |
q5 |
... 0 0 0 1 0 ... |
6 |
q6 |
... 0 0 0 1 0 ... |
7 |
q7 |
... 0 1 0 1 0 ... |
8 |
! |
... 0 1 0 1 0 ... |
Таблица 2.6
-
Т
Q
Ситуация на ленте
0
q1
... 0 1 1 1 0 0 0 0 0 ...
1-3
q1
... 1 1 1 0 0...
4
q2
... 1 1 0 ...
5
q3
... 0 0 0 ...
6
q4
... 0 0 0 ...
7
q5
... 0 0 1 ...
8
q6
... 1 0 0 ...
9
q7
... 1 1 1 ...
10, 11
q3
... 0 1 0 1 ...
12, 13
q4
... 0 1 0 0 ...
14, 15
q5
... 1 0 1 1 ...
16, 17
q6
... 1 0 1 0 ...
18
q7
... 0 1 1 ...
19
q3
... 0 1 1 ...
...
...
. . .
31
!
... 0 1 1 1 0 1 1 1 0 ...
24
Описание схемы алгоритма функции. Функция POKR(D, kol, A, n) определяет, являются ли строки матрицы А, номера которых заданы в списке D, покрытием. Здесь kol - количество элементов в массиве D, n - количество столбцов матрицы A. Функция возвращает 1, если заданные строки матрицы A образуют покрытие, 0 - в противном случае.
Алгоритм работает следующим образом. При вызове в основном алгоритме функции POKR(D, kol, A, n) в неё передаются параметры D, kol, A, n; затем организуется внешний цикл (блоки 2-8) прохода по всем столбцам матрицы A и внутренний цикл (блоки 3-6) расчёта суммы S по i-му столбцу для заданных строк, проверяемых на покрытие. В качестве признака отсутствия покрытия используется значение суммы S=0, поскольку если в некотором столбце на всех позициях, соответствующих рассматриваемым строкам, будут нули, то этого достаточно, чтобы констатировать отсутствие покрытия (в этом случае можно не проверять остальные столбцы). Вычисление S производится в блоке 5 для выбранной из массива D (блок 4) строки с номером k. В блоке 7 проверяется условие S=0 и в зависимости от его значения принимается решение о том, какое значение функции возвращается в основной алгоритм (блоки 9 и 10), где они присваиваются переменной usl. Отметим, что если цикл прохода по столбцам полностью завершился, значит, ни одна сумма по столбцам не равна 0, что означает, что заданные строки являются решением задачи о покрытии.
Контрольные примеры решения задачи с помощью алгоритма.
П
Таблица 2.1 A 1 2 3 4 5
A1 1
1
1 A2 1 1
1
A3
1 1 A4 1 1
а) являются ли строки А1, А3 решением задачи о покрытии;
б) являются ли строки А1, А3, А4 решением задачи о покрытии.
13
Пошаговое решение:
а) i=1, S=2;
i=2, S=0; выход из функции POKR, возвращается 0, выдаётся сообщение «нет».
б) i=1, S=2;
i=2, S=1;
i=3, S=2;
i=4, S=1;
i=5, S=2;
выход из функции POKR, возвращается 1, выдаётся сообщение «да».
Степень детализации как проходимых алгоритмом ветвей, так и значений переменных, должна быть достаточной для понимания и проверки правильности алгоритма. Так, в нашем случае было опущено слежение за переменной внутреннего цикла по j и сам цикл, так как. это достаточно очевидно.