Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Матвеев&Матвеева. Теория Алгоритмов.pdf
Скачиваний:
72
Добавлен:
02.06.2015
Размер:
319.81 Кб
Скачать

5

1. Логические схемы алгоритмов

Формальный язык для описания алгоритмов (ЛСА) был первоначально ориентирован на задачи оптимизации программ для ЭВМ, а в последствии оказался удобным и для оптимизации микропрограмм. Задачи этих классов широко распространены как в области проектирования средств вычислительной техники, так и при построении систем автоматического управления, связи и многих других.

Реализация алгоритма есть последовательное выполнение команд ЭВМ, каждая из которых в свою очередь является последовательностью элементарных действий-микрокоманд, выполняемых за один машинный такт.

Функцию задания алгоритма А.А.Ляпунов [1] предложил записывать определенным способом, а именно в виде конечной строки, состоящей из символов элементарных действий А i , где i изменяется от 1 до n (n – целое положительное число), логических функций αp (p =1,m) и специальных символов начала и конца стрелок с индексом, где индекс также целое положительное число.

Символы A1,A2,…,An он предложил называть операторами, а символы α1, α2,...-логическими условиями. Логическое условие ( ЛУ) - это такая функция, которая может принимать лишь два значения – 0 или 1. Оказалось, что с помощью введенных понятий возможно формально описать любой алгоритм, используя

терминологию логики. Действительно, допустим символ α (х =х ) означает, что

1 1 2

α1=1, если равенство истинно и α1=0 в противном случае.

Рассмотрим некоторый алгоритм как определенную последовательность операторов.

U=A1 α1 ­ 1 A2 α2 ­ 2 A3 α3 ­ 3¯ 2A10 α10 ­ 3…Ak

(1.1)

Будем считать, что ЛУ, за исключением α2 ,равны единице, а α2 =0. Тогда выражение (1.1) можно переписать в виде

U =A1 A2 α2 ­ 2 A3 ¯ 2A10 …Ak

(1.2)

так как действия стрелок трактуются следующим образом: после выполнения оператора A1проверяется его ЛУ α1; если α1=1, то выполняется следующий оператор, т.е. А2,а если α1=0 , то необходимо в строке отыскать конец стрелки ¯ 1 и выполнить стоящее справа от неё элементарное выражение. Так как все ЛУ, кроме α2 ,равны 1,то это и позволяет нам перейти от выражения (1.1) к выражению (1.2).

Определение

Логической схемой алгоритма (ЛСА) будем называть конечную строку, состоящую из символов операторов А12,…,Аn, логических условий со стрелками α1 ­ 1, α2 ­ 2 ,… αm ­ m и концов стрелок ¯ 1 , ¯ 2,… ¯ m такую, что для каждого начала стрелки c индексом i найдётся один и только один конец

стрелки с тем же индексом.

6

Из этого определения следует, что несколько начал стрелок могут иметь одинаковые индексы, но все они привязаны к единственному концу стрелки с этим индексом.

Примечание

Определение ЛСА относится к классу детерминированных алгоритмов, так как в классе стохастических алгоритмов переходов от оператора Ai может быть более одного.

Каждый отдельный оператор или логическое условие назовём “элементарным выражением”, а фрагмент строки из элементарных выражений со стрелками, где для каждого индекса i имеется не более одного начала стрелки и одного конца с индексом i – “выражением”.

Из ранее приведённых рассуждений вполне понятно, что в любой ЛСА порядок выполнения операторов определяется состоянием всех ЛУ. Будем для определённости считать, что ЛУ могут изменять своё состояние, но только во время выполнения некоторого оператора.

Таким образом, описание алгоритма в общем виде в терминах ЛСА может быть представлено:

U = U (A1,…,An; p1,…,pm) ,

(1.3)

здесь Ai (i = 0, n) - множество операторов,

pj ( j = (1, к) -множество логических переменных, входящих в функции

αt (p1,p2,…,pm).

Всевозможные наборы состояний логических переменных p1, …,pm обозначим

1, 2,…, m, m+1,…

(1.4)

Тогда процесс реализации ЛСА для произвольной последовательности наборов (1.4) определяется следующим образом :

1. Выбираем начальный набор независимых логических переменных 1. 2 . Анализируем самое левое элементарное выражение ЛСА: если это ЛУ,

то может быть два продолжения: при рi =1 переходим к анализу следующего элементарного выражения, а при рi = 0 переходим к анализу элементарного выражения, стоящего справа от конца стрелки с индексом i. При выполнении оператора совершается переход от набора 1 к s , где S – индекс выполняемого оператора.

Строка операторов, полученная в результате описанных действий, является значением ЛСА для заданной последовательности наборов (1.4)

Введём обозначения:

U - алгоритм произвольного вида, заданный в терминах ЛСА; B={А12,…,Аn}- конечное множество операторов заданной ЛСА;

Ф={p1,p2,..,pm} – конечное множество ЛУ (или независимых логических переменных) заданной ЛСА.

В работе Ю.Н.Янова[2] введено понятие “распределения сдвигов оператора”, смысл которого заключается в следующем. Оператор во время выполнения может изменить состояние некоторых или всех ЛУ, поэтому каждому оператору может быть поставлено в соответствие подмножество Аi – Фi Í Ф.

7

Отсюда следует, что распределение сдвигов оператора может быть трёх видов: 1.Универсальное, когда Фi={p1,p2,..,pm} и оператор Аi может изменить

состояния всех ЛУ, т.е. Фi = Ф.

2.Пустое, когда Фi={} , а оператор Аi при своём выполнении не влияет на состояния ЛУ.

3.Нормальное, когда Фi Í Ф.

Последовательность наборов логических переменных будем называть “допустимой” для реализации ЛСА в виде А1,А2,…Аm,Am+1… ,если всякий набор m+1 либо совпадает с набором m ,либо отличается от последнего значениями тех логических переменных, которые определены заданным распределением сдвигов оператора Аm .

Весьма важным понятием в алгоритмической системе ЛСА является понятие “равносильности”. Будем говорить, что ЛСА U 1 и U 2 равносильны при заданном распределении сдвигов и писать U 1= U 2, если для всякой заданной последовательности наборов логических переменных, которая допустима для ЛСА U 1 и

U 2, значения (реализации) этих ЛСА совпадают. Разумеется, что ЛСА U 1 и U 2 содержат одинаковые наборы операторов.

Это понятие не является эффективным для практического получения равносильных ЛСА, особенно в случае сложных алгоритмов, так как требует громоздкого перебора всевозможных вариантов. Но из него вытекают возможности вывода ряда формул, позволяющих трансформировать данную ЛСА U 1 в U 2, равносильную U 1.

Пример 1.1

Дана ЛСА

U =A0 ¯ 2A1p1 ­ 1p2 ­ 2 ¯ 3A2p2 ­ 2ω ­ 3 ¯ 1p3 ­ 4p2 ­ 2ω ­ 3 ¯ 4A3p1 ­ 5p3 ­ 4p2 ­ 2ω ­ 3 ¯ 5 Ak (1.6)

где A0,Ak – операторы начальной и конечной установки алгоритма; Ai (i =1,3) - операторы реализации алгоритма;

pj ( j =1,3) - логические переменные, принимающие значения 0 или 1 согласно распределению сдвигов;

ω ­ S =0 – логическое условие , тождественно равное нулю, что равносильно безусловному переходу по индексу S;

Учитывая несовпадающие варианты наборов ЛУ, возможно получить несколько видов реализации алгоритма:

1=p1

p2

 

p3

U 1= A0A1(A2A2A2…A2…);

2=p1

p2

 

 

 

 

U 2= U 1;

p3

3=p1

 

 

 

 

 

 

p3

U 3=A0(A1A1A1…A1…);

p2

4= p1

 

 

 

 

 

p3

U 4= U 3;

p2

5=

 

 

 

 

p2 p3

U 5= A0(A1A2A1A2…A1A2…);

p1

6=

 

 

 

p2

 

 

U 6= U 5;

p1

p3

7=

 

 

 

 

p3

U 7= U 3;

p1

p2

 

 

 

 

 

 

 

8

8=

 

 

 

 

 

 

U 8=A0A1A3AK.

p1

p2

p3

Пример 1.2

 

Дана ЛСА U =A0p2 ­ 1p3 ­ 2 ¯ 1A2A3 ¯ 2A4A5AK

Повторим процесс реализации ЛСА при всевозможных наборах ЛУ.

1= p2

 

 

p3

U 1= A0A2A3A4A5AK;

2= p2

 

 

 

 

 

U 2= A0A4A5AK;

 

p3

3=

 

 

 

 

p3

U 3= A0A2A3A4A5AK= U ’;

p2

8=

 

 

 

 

U 4= A0A2A3A4A5AK= U ’.

p2

p3

Анализ примеров 1.1 и 1.2 показывает, что при некоторых наборах ЛУ реализации ЛСА могут совпадать, а некоторые наборы ЛУ приводят к бесконечному повторению фрагментов ЛСА, что означает отсутствие реализации алгоритма при таких значениях логических переменных.

9

2. Матричные схемы алгоритмов

Ещё одним формальным языком для описания алгоритмов является система, представленная на языке матрицы, в которой элементы есть логические функции, связывающие операторы между собой [2]. При этом запись зависимости порядка выполнения операторов оказывается более простой и наглядной.

 

A1

 

A2

...

Aj

...

An

Aк

 

 

 

A

éa

a

 

...

a

0 j

...

a

0n

a

0к

ù

 

0

ê 01

 

02

 

 

 

 

 

ú

 

A1

êa11

a12

...

a1 j

...

a1n

a1к ú

(2.1)

U = M

ê ... ... ... ...

... ...

... ú

A

êai1

ai 2

...

aij

...

ain

a

ú

 

i

ê

 

 

 

 

 

 

 

 

 

 

ú

 

M

ê ... ... ... ...

... ...

...

ú

 

An

ê

an2

 

anj

 

ann

a

ú

 

êan1

...

...

ú

 

 

ë

 

 

 

 

 

 

 

 

 

 

û

 

где

A0 , Ak – операторы начальной и конечной установки алгоритма,

 

Ai

(i =

 

 

) – операторы реализации алгоритма,

 

1, n

 

aij

(i =

 

; j =

 

) – логические функции связи между операторами, каждая

 

0, n

1, к

из которых может принимать три значения:

1)aij = 0 , что означает отсутствие связи между операторами Ai и Aj ;

2)aij =1, что означает непосредственное следование оператора Aj за оператором Ai ;

3)aij при некоторых наборах ЛУ равна 0, а при других – 1.

Будем говорить, что множество логических функций каждой строки является «нормальным», если отвечает требованиям:

1)

ортогональности: aij ×ais º 0 ( j ¹ s) ,

2)

j =к

полноты: Ú aij º1 .

 

j =1

Символ i означает номер строки, а символы j, s – номера столбцов.В дальнейшем будем рассматривать матрицы только с нормальными строками.

Определение

Матричной схемой алгоритма (МСА) будем называть квадратную матрицу, в которой строки соответствуют операторам A0 , A1,..., An , столбцы – операторам

A1 , A2 ,..., Aк , а элементы – логические функции связи между операторами алгоритма.

Процесс выполнения МСА U может быть описан следующим образом. Дана допустимая последовательность ЛУ D1, D2 ,..., Dm , Dm+1,... На первом шаге анализируются элементы a0 j ( j = 1, к) , соответствующие строке оператора A0 . Вследствие

10

нормальности строки в ней найдётся одна и только одна логическая функция

a0 j = 1, например a0s . Поэтому после оператора A0 нужно выписать оператор As и т.д. Предположим, реализовано m шагов и последним был выписан оператор

Ai

. Затем на (m+1)-м шаге требуется проанализировать элемент im -ой строки

 

m

при наборе ЛУ Dm+1 , выписать оператор Am+1 . Процесс заканчивается после выписывания оператора Aк . Таким образом, получено значение МСА в виде строчки операторов A0 A1...Am Am+1...Aк .

Определение

Последовательность наборов логических переменных D1, D2 ,..., Dm , Dm+1,... назовём допустимой для МСА U при распределении сдвигов Ai - Fi , если для этой последовательности найдётся такое значение МСА A0 A1...Am Am+1...Ak , что набор

Dm+1 отличается от набора Dm лишь значением логических переменных из подмножества Fm Í F .

Будем называть МСА U 1 и ЛСА U 2 равносильными при данном распределении сдвигов, если для любой допустимой последовательности ЛУ их значения совпадают.

Нетрудно показать, что если задана ЛСА U 2, то построить равносильную ей МСА U 1 можно следующим образом. В матрице каждая строка есть множество переходов от оператора Ai к Aj , где i,j – номера строк и столбцов. Каждый переход характеризуется последовательностью проверяемых ЛУ, представленных в виде конъюнкции логических функций aij1aij2 ...aijs , при этом некоторые функции могут быть просто логическими переменными. Переходов от Ai к Aj может оказаться несколько, тогда элемент матрицы aij строится в виде дизъюнкции конъюнкций для каждого перехода. В случае, когда справа от Ai стоит Aj , то aij = 1, а aij = 0 означает невозможность перехода от Ai к Aj .

11

Пример 2.1

Дана ЛСА U 2 = A0 A1 p1 ­1 p2 ­2 p3 ­3 A2 A3 ¯3 A4 A5 ¯1 A6 ¯2 Aк .

С учётом вышесказанного построим равносильную ей МСА:

A0

 

A1

A2

 

 

A3

 

A4

 

 

A5

A6

Aк

 

é

1

0

 

 

0

0

 

 

0

0

0

 

ù

A

ê

0

p

 

 

p

 

0

p

 

 

 

 

0

 

 

p p

 

ú

p

2

3

p

2

p

3

p

2

1

ê

 

1

 

 

 

1

 

 

 

1

1

ú

A2

ê

0

0

 

 

1

0

 

 

0

0

0

 

ú

U 1 = A

ê

0

0

 

 

0

1

 

 

0

0

0

 

ú

3

ê

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ú

A4

ê

0

0

 

 

0

0

 

 

1

0

0

 

ú

ê

 

 

 

 

 

ú

A5

ê

0

0

 

 

0

0

 

 

0

1

0

 

ú

A6

ê

0

0

 

 

0

0

 

 

0

0

1

 

ú

ë

 

 

 

 

 

û

В работе [2] приводится алгоритм перехода от МСА U 1 к равносильной ЛСА U 2. Для заданной в общем виде МСА (2.1) равносильная ЛСА будет выглядеть следующим образом:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A a

01

­01 a

02

 

­02 ...a

0n

­0n a

0к

­0к ¯01

¯11 ... ¯n1 A

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

U =

 

­11

 

 

­12

...

 

 

­1к ¯02 ¯12 ... ¯n 2 A2 ...

a11

a12

a1к

 

 

 

­n1

 

 

­n

2 ...

 

 

 

 

­nк ¯0k ¯1к ... ¯

A

 

a

n1

a

n2

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

к

Приведённый алгоритм перехода от МСА к ЛСА тривиален, однако его основной недостаток в том, что он даёт избыточную ЛСА по числу ЛУ. Далее будет предложен другой алгоритм, который приводит к получению близкой к оптимальной ЛСА.