Вычислительная техника и прикладная математика
Скачать 0.78 Mb.
|
ISSN 1995-4565. Вестник РГРТУ. № 3 (выпуск 33). Рязань, 2010 39 ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА И ПРИКЛАДНАЯ МАТЕМАТИКА УДК 510.5 А.В. Пруцков ЛИНЕЙНЫЕ НОРМАЛЬНЫЕ АЛГОРИТМЫ Предложена модификация нормальных алгоритмов Маркова, которая заключается в введении возможности последовательного выполнения под- становок. Данная модификация позволила уменьшить количество подста- новок и трудоемкость решения классических задач теории нормальных алгоритмов Маркова. Ключевые слова: алгоритмические модели, нормальные алгоритмы Маркова, обобщения нормальных алгоритмов. Введение. Задача обращения – задача с линейной трудоемкостью. Целью данной работы является разработка модификации нормальных алгоритмов Маркова с числом выполненных подстановок, линейно зависящим от длины слова, что позволит сократить трудоемкость решения задач. Здесь и далее под трудоемкостью в отношении нормальных алго- ритмов Маркова и их модификаций понимается количество выполненных подстановок, необхо- димых для решения задачи. Нормальные алгоритмы Маркова являются одной из алгоритмических моделей [1]. В теории нормальных алгоритмов Маркова рассматри- ваются две классические задачи: задача обращения и задача удвоения. Введем обозначения: n – количество букв алфавита Z={Z 1 , Z 2 , …, Z n }; m – длина обра- щаемой строки (m > 0). Рассмотрим задачу обращения. Пусть в k ячейках находится m пронумерованных шари- ков, при этом k ≥ 2m. Необходимо разместить их в обратном порядке. Для решения задачи необходимо взять предпоследний шарик и положить его за последним шариком (рису- нок 1). Затем взять следующий шарик слева и поместить его в первую пустую ячейку справа от последнего шарика и т. д. 1 2 3 4 Рисунок 1 – Метод решения задачи обращения Очевидно, что для решения задачи необ- ходимо m – 1 операций поднятия и опускания шарика в ячейку, при этом последний шарик остается на месте. Трудоемкость описанного алгоритма является линейной. Решим задачу обращения с помощью программы на алгоритмическом языке Паскаль. Программа включает следующие строки: program p1; const a: string='abc'; b: string=''; var i,n: integer; begin n:=length(a); for i:=1 to n do b:=b+a[n-i+1]; writeln(b); end. Очевидно, что алгоритм обращения строки, лежащий в основе данной программы, также является линейным по трудоемкости. Однако известные нормальные алгоритмы решения задачи обращения являются полино- миальными по трудоемкости. Данное обстоя- тельство можно объяснить недостаточностью средств, предоставляемых теорией нормальных алгоритмов Маркова. Известные модификации нормальных алгоритмов Маркова. Рассмотрим некоторые известные модификации нормальных алгорит- мов Маркова. 40 ISSN 1995-4565. Вестник РГРТУ. № 3 (выпуск 33). Рязань, 2010 Н.М. Нагорный предложил обобщение нор- мальных алгоритмов Маркова (обобщенные нормальные алгоритмы Маркова, обобщения Н.М. Нагорного) [2]. Первое обобщение (тип ) заключается в том, что алгоритм определяется конечным числом схем и на каждом шаге процесса вырабатывается указание того, какая схема должна выполняться на следующем шаге. У второго обобщения (тип ') таких схем бесконечно много, и они порождаются некоторым нормальным алгоритмом. В третьем обобщении (тип '') бесконечны и сами схемы. Подстановка обобщенного нормального алгоритма Маркова имеет следующий вид: P L → P R (I), где P L – левая часть подстановки; P R – правая часть подстановки; I – индекс перехода к другой схеме. Рассмотрим принцип работы схемы типа над словом R. Алгоритм предписывает проверить, встре- чается ли одна из левых частей подстановок первой схемы системы в слове R. Если ни одна из левых частей не встречается в слове R, то алгоритм завершает работу. Если же левая часть одной из подстановок встречается в слове R, то данная подстановка применяется к слову. Если примененная подстановка имела индекс, равный нулю, то алгоритм завершает работу. Если же индекс примененной подстановки отличен от нуля, то происходит переход к схеме, указанной в индексе подстановки. Далее выполнение алгоритма происходит аналогично. Результатом работы алгоритма считается слово R после применения всех подстановок. Ограничим описание обобщенных алгорит- мов Маркова типом . Принципы функцио- нирования алгоритмов типа ' и '' в данной статье не приводятся. Также в работе [2] показано, что для любого обобщения типов , ' и '' может быть построен эквивалентный им нормальный алгоритм Маркова. И.А. Цветков предложил самомодифицируе- мые нормальные алгоритмы [3]. Самомоди- фицируемые нормальные алгоритмы являются обобщением нормального алгоритма Маркова, а также предложенных И.А. Цветковым алгорит- мов Маркова с самопополнением схемы, с самоудаляемыми подстановками, с одноразо- выми пополнениями. Самопополняемые алгоритмы Маркова могут иметь пополняемые подстановки, которые добавляются в схему во время выполнения нормального алгоритма. При пополнении в начало схемы (слева при записи схемы как слова) модификация называется самопополняе- мым слева алгоритмом Маркова. При попол- нении в конец схемы (справа при записи схемы как слова) модификация называется самопо- полняемым справа алгоритмом Маркова. Каждая пополняющая подстановка при применении добавляет в начало схемы или в ее конец одну простую или одну заключительную подстановку. Любая подстановка (простая, заключительная, пополняющая) применяется неограниченное число раз. Количество пополнений не ограни- чено. Пополнения одноуровневые, то есть добав- ляется простая или заключительная, но не пополняющая подстановка. В схеме нормального алгоритма с само- удаляемыми подстановками используются под- становки, которые удаляются из схемы автома- тически после их первого применения. В схеме такого алгоритма есть простые, заключительные и пополняющие подстановки, применяемые неограниченное число раз, а также простые и заключительные подстановки однократного при- менения. Количество пополнений не ограничено. Пополнения одноуровневые. В схеме алгоритма Маркова с одноразовыми пополнениями используются подстановки, кото- рые однократно автоматически добавляют в конец схемы одну простую или одну заклю- чительную подстановку. В схеме такого алго- ритма простые, заключительные и пополняющие подстановки применяются неограниченное число раз, но пополняющая подстановка произ- водит пополнение однократно. Пополнения одноуровневые. На основе анализа перечисленных моди- фикаций выдвинем два требования к пред- лагаемой модификации: 1) модификация должна состоять из одной схемы в отличие от обобщенных нормальных алгоритмов Маркова; 2) схема алгоритма не должна изменяться в отличие от самомодифицируемых алгоритмов Маркова. Линейные нормальные алгоритмы. В алгоритмах существуют три типа вычисли- тельных процессов [4]: линейный, разветвляю- щийся и циклический. Из-за особенности функционирования в нормальных алгоритмах Маркова возможна реализация только двух типов вычислительных процессов: разветвляющегося и циклического. Ветвление в нормальных алгоритмах Мар- кова реализуется с помощью кодирования ситуаций левыми частями подстановок. В зависимости от сложившейся ситуации во время ISSN 1995-4565. Вестник РГРТУ. № 3 (выпуск 33). Рязань, 2010 41 решения задачи выбирается и выполняется соответствующая данной ситуации подстановка. Циклический вычислительный процесс в нормальных алгоритмах Маркова определяется, как правило, двумя подстановками. Первая подстановка определяет тело цикла – подста- новку, выполняющуюся в цикле. Вторая подста- новка в своей левой части содержит условие окончания цикла. Таким образом, первая подстановка выполняется до тех пор, пока не выполнится вторая подстановка. Очевидно, что для решения линейных задач с линейной трудоемкостью необходима возмож- ность реализации линейного вычислительного процесса. Предлагается модификация нормальных алгоритмов Маркова, которая заключается в изменении структуры схемы и порядка выпол- нения подстановок. Данную модификацию назовем линейными нормальными алгоритмами. Схема линейного нормального алгоритма имеет следующий общий вид: P 1 : ) 1 ( 1 ) 1 ( 1 Q P ; ) 1 ( 2 ) 1 ( 2 Q P ; …; ) 1 ( k ) 1 ( k 1 1 Q P [•] P 2 : ) 2 ( 1 ) 2 ( 1 Q P ; ) 2 ( 2 ) 2 ( 2 Q P ; …; ) 2 ( k ) 2 ( k 2 2 Q P [•] … P d : ) d ( 1 ) d ( 1 Q P ; ) d ( 2 ) d ( 2 Q P ; …; ) d ( k ) d ( k d d Q P [•] В схеме обозначения P только с нижним индексом и P и Q с верхним и нижним индекса- ми являются подстроками; k 1 , k 2 , …, k d = 1, 2, … . Каждая строка схемы содержит метку P c нижним индексом и соответствующие данной метке одну или несколько подстановок. Метка строки может не совпадать с левой частью первой подстановки в строке. Алгоритм работает со строкой R следующим образом. Схема просматривается сверху вниз, и из схемы выбирается та строка схемы, метка P которой содержится в строке R. Если метка P найдена, то выполняются последовательно слева направо подстановки, соответствующие метке P, в строке R, то есть каждая подстановка выполняется только один раз. В следующий раз подстановка может быть выполнена только при следующем просмотре схемы. Таким образом, в линейных нормальных алгоритмах подстановки выполняются последовательно и при просмотре сверху вниз. Как и в нормальных алгоритмах Маркова, подстановка заключается в замене в строке R первого вхождения слева подстроки из левой части подстановки на подстроку из правой части подстановки. После того как все подстановки, соответствующие метке P, выпол- нены, схема просматривается вновь, начиная с первой подстановки. Подстановки, помеченные пустым символом , выполняются для любой строки R. Алгоритм заканчивает выполнение в двух случаях: 1) ни одна метка P не встречается в строке R; 2) выполнена заключительная подстановка, заканчивающаяся символом «•». Если алгоритм заканчивает свою работу (прекращает выполнение) со строкой R, то алгоритм считается применимым к строке R. Результатом работы алгоритма является стро- ка R после применения всех подстановок. Если алгоритм никогда не заканчивает свое выполнение (зацикливается) со строкой R, то алгоритм считается неприменимым к строке R и результат работы алгоритма неопределен. Вернемся к задаче обращения. Запишем схему нормального алгоритма обращения с использованием аппарата линейных нормальных алгоритмов. Будем использовать только одну вспомогательную букву. Схема состоит из следующих подстановок. 1) Z i : Z i → ; → +Z i ;i = 1, 2, …, n 2) : → • 3) : → + Указатель устанавливается в конец строки (подстановка 3). Каждый символ строки, который находится слева от указателя , удаляется, а затем добавляется в конец строки (подстановка 1). Таким образом, символы строки удаляются перед указателем и появляются справа от него в обратном порядке. Условием окончания работы алгоритма является отсутст- вие символов слева от указателя (подста- новка 2). При выполнении данного условия указатель удаляется из строки. Пример 1. Рассмотрим работу линейного нормального алгоритма обращения на примере числа 123 по шагам для алфавита Z = {1, 2, 3}. За один шаг может выполняться более одной подстановки. 0. 123 1. 3) : → + 123 2-3. 1) 3: 3 → ; → +3 123 4-5. 1) 2: 2 → ; → +2 132 6-7. 1) 1: 1 → ; → +1 321 8. 2) : → • 321 На последнем шаге алгоритма получено число 321 – обращение числа 123. □ Сравним данные о трудоемкости и о количестве подстановок предложенного алго- ритма обращения, а также обращающего нор- мального алгоритма, предложенного А.А. Мар- ковым и Н.М. Нагорным [1], и обращающего 42 ISSN 1995-4565. Вестник РГРТУ. № 3 (выпуск 33). Рязань, 2010 самопополняемого слева алгоритма, предложен- ного И.А. Цветковым [3] (таблица 1). Использование линейных нормальных алго- ритмов позволило изменить тип алгоритма с полиномиального на линейный, сократив трудо- емкость алгоритма, и уменьшить количество подстановок. Таблица 1 Название алгоритма обращения Трудоемкость Количество подстановок алгоритма Тип алгоритма Нормальный алгоритм обращения А.А. Маркова и Н.М. Нагорного m 2 /2 + 5m/2 + 1 8n 2 + 8n + 15 Полиномиальный Нормальный алгоритм обращения И.А. Цветкова m 2 /2 + 3m/2 + 3 8n 2 + 25 Полиномиальный Линейный нормальный алгоритм обращения 2m + 2 2n + 2 Линейный Сводимость нормальных алгоритмов Маркова к линейным нормальным алгорит- мам. Схему любого нормального алгоритма Маркова можно привести к схеме линейного нормального алгоритма по следующим пра- вилам: - добавить метку к каждой подстановке, причем метка равна левой части подстановки; - если левая часть подстановки пустая, то обозначить метку пустым символом . Таким образом, для нормальных алгоритмов Маркова каждой метке соответствует строка только с одной подстановкой. Пример 2. Приведем нормальный алгоритм удвоения, предложенный в работе [5], к линейному нормальному алгоритму. Исходный нормальный алгоритм удвоения слова алфавита Z = {a, b} включает следующие подстановки. 1) a → aa 2) b → bb 3) aa → aa 4) ab → ba 5) ba → ab 6) bb → bb 7) → 8) → • 9) → + Воспользуемся правилами приведения и получим следующие подстановки схемы линей- ного нормального алгоритма: 1) a: a → aa 2) b: b → bb 3) aa: aa → aa 4) ab: ab → ba 5) ba: ba → ab 6) bb: bb → bb 7) : → 8) : → • 9) : → + □ Возможность сводимости алгоритмов объяс- няется тем, что линейный нормальный алгоритм позволяет выполнять подстановки в том же порядке при просмотре сверху вниз, что и нормальный алгоритм Маркова. Сводимость схемы любого нормального алгоритма Маркова к схеме линейного нормаль- ного алгоритма влечет два следствия: 1) любую задачу, которую можно решить с помощью нормального алгоритма Маркова, можно решить и с помощью линейного нормаль- ного алгоритма; 2) трудоемкость любого линейного нормаль- ного алгоритма будет не хуже трудоемкости нормального алгоритма Маркова, но не наобо- рот. Обратная сводимость от линейных нормаль- ных алгоритмов к нормальным алгоритмам Маркова возможна при выполнении двух условий: 1) в каждой строке схемы находится только одна подстановка; 2) метка строки равна левой части подста- новки строки. Задача удвоения строки. Рассмотрим еще одну классическую задачу теории нормальных алгоритмов Маркова – задачу удвоения, которая заключается в преобразовании слова R в слово RR. Задачу удвоения можно решить и с помощью предложенных линейных нормальных алгоритмов. Для удвоения элементов строки необходимо добавлять последовательно в конец строки копии элементов, имеющихся в строке (рисунок 2). Очевидно, что трудоемкость такого алгоритма будет линейной. 1 2 3 4 1 2 3 4 Рисунок 2 – Метод решения задачи удвоения ISSN 1995-4565. Вестник РГРТУ. № 3 (выпуск 33). Рязань, 2010 43 Схема линейного нормального алгоритма решения задачи удвоения слова алфавита Z = {a, b} будет состоять из следующих подстановок. 1) a: a → a; → a 2) b: b → b; → b 3) : → ; → • 4) : → + В конец строки добавляются указатели и (подстановка 4). Работа алгоритма заключается в перемещении указателя влево и добавлении (копировании) символа перед указателем в конец строки, обозначенный указателем (подстановки 1-2). После того как перед указателем не остается символов, алгоритм заканчивает выполнение (подстановка 3). Пример 3. Рассмотрим работу линейного нормального алгоритма удвоения на примере той же строки bab по шагам. 0. bab 1. 4) : → + bab 2-3. 2) b: b → b; → b babb 4-5. 1) a: a → a; → a babab 6-7. 2) b: b → b; → b babbab 8-9. 3) : → ; → • babbab На девятом шаге алгоритма получена строка babbab – удвоение строки bab. □ Трудоемкость и количество подстановок предложенного линейного алгоритма удвоения, а также нормальных алгоритмов удвоения слова алфавита Z = {a, b}, предложенных в работах А.А. Маркова и Н.М. Нагорного [1] и В.А. Мо- щенского (см. пример 2) [5], представлены в таблице 2. Таблица 2 Название алгоритма удвоения Трудоемкость Количество подстановок алгоритма Тип алгоритма Нормальный алгоритм удвоения А.А. Маркова и Н.М. Нагорного m 2 /2 + 5m/2 + 2 10 Полиномиальный Нормальный алгоритм удвоения В.А. Мощенского m 2 /2 + 3m/2 + 2 9 Полиномиальный Линейный нормальный алгоритм удвоения 2m + 3 7 Линейный Использование линейных нормальных алго- ритмов и в случае задачи удвоения позволило снизить трудоемкость алгоритма, сделав его линейным, а также уменьшить количество подстановок схемы. Сводимость линейных нормальных алго- ритмов к обобщенным нормальным алгорит- мам Маркова. Любой линейный нормальный алгоритм можно свести к схеме типа обобщений Н.М. Нагорного. Сведение алгорит- мов выполняется по следующим правилам. 1. В схему 1 выписываются первые подста- новки каждой строки. 2. Если метке соответствует несколько подстановок, то каждая подстановка, кроме первой, записывается отдельной схемой, состоя- щей из одной подстановки. При этом схемы нумеруются соответствующими индексами, чтобы обеспечить их последовательное выпол- нение. Последняя подстановка, если она не явля- ется заключительной, имеет индекс 1, возвра- щающий управление схеме 1. 3. Если метка и левая часть первой подста- новки не совпадают, то в схему 1 включается незначащая подстановка P → P, где P – метка. Первая подстановка и другие подстановки запи- сываются в отдельные схемы по принципу, опи- санному в правиле 2. Незначащая подстановка передает управление схеме с первой подста- новкой данной строки. 4. Заключительные подстановки имеют индексы 0. Из данных правил следует, что количество схем обобщенного нормального алгоритма N схем зависит от числа строк схемы с более чем одной подстановкой и числа строк схемы, в которых метка отличается от левой части первой подстановки строки, и вычисляется по формуле: N схем = N подст – N стр + N мет + 1, где N подст – количество подстановок в строках схемы, в которых более одной подстановки; N стр – количество строк схемы, в которых более одной подстановки; N мет – количество строк схемы, в которых метка отличается от левой части первой подстановки строки; + 1 – основная схема (схема 1). Пример 4. Сведем предложенный линейный нормальный алгоритм удвоения к обобщенному нормальному алгоритму Маркова. Воспользу- емся правилами сведения и получим следующие схемы. Схема 1: 1) a → a (2) 2) b → b (3) 44 ISSN 1995-4565. Вестник РГРТУ. № 3 (выпуск 33). Рязань, 2010 3) → (4) 4) → + (1) Схема 2: 1) → b (1) Схема 3: 1) → a (1) Схема 4: 1) → (0) Рассчитаем количество подстановок по предложенной формуле. Исходные данные имеют следующие значения: N подст = 6; N стр = 3; N мет = 0. Тогда расчет по формуле даст следующий результат: N схем = 6 – 3 + 0 + 1 = 4, что равно полученному количеству схем. □ Как уже говорилось, в работе [2] показано, что для любого обобщенного нормального алгоритма может быть построен эквивалентный нормальный алгоритм Маркова. При этом любой линейный нормальный алгоритм можно свести к обобщенному нормальному алгоритму. Следова- тельно, для любого линейного нормального алгоритма может быть построен эквивалентный нормальный алгоритм Маркова. В связи с возможностью данной сводимости возникает вопрос: означает ли сводимость линейных нормальных алгоритмов к обобщен- ным нормальным алгоритмам Маркова, что обобщения Н.М. Нагорного также являются и обобщением линейных нормальных алгоритмов? На этот вопрос невозможно однозначно дать положительный ответ, так как затруднительно найти ответ на следующий вопрос. Вопрос заключается в следующем: можно ли свести любой обобщенный алгоритм Маркова к линейному нормальному алгоритму? Если ответ на второй вопрос положительный, то линейные и обобщенные нормальные алгоритмы являлись бы различными подходами к обоб- щению нормальных алгоритмов Маркова. Если ответ был бы отрицательным, то обобщения Н.М. Нагорного есть и обобщения линейных нормальных алгоритмов. Однако, чтобы дать ответ на второй вопрос, пришлось бы перебрать все возможные переходы управления между схемами обобщенных алгоритмов Маркова и представить их линейными нормальными алго- ритмами, что является практически невыпол- нимой задачей. С другой стороны, можно предложить многосхемную конструкцию, каждая схема которой является линейным нормальным алгоритмом, при этом данная многосхемная конструкция работает по тем же принципам, что и обобщения Н.М. Нагорного. В этом случае данная многосхемная конструкция будет обоб- щением обобщенных нормальных алгоритмов Маркова, а также нормальных алгоритмов Маркова и линейных нормальных алгоритмов. |