Классы L, NL, coNL. NL-полнота задачи о достижимости
Определение: |
Класс | — множество языков, разрешимых на детерминированной машине Тьюринга с использованием дополнительной памяти для входа длиной . .
Определение: |
Класс | — множество языков, разрешимых на недетерминированной машине Тьюринга с использованием дополнительной памяти для входа длиной . .
Теорема: |
Доказательство: |
|
NL-полнота
Определение: |
Задача | в графе G есть путь из s в t — задача существования пути между двумя заданными вершинами в данном графе.
Теорема: |
Задача существования пути между двумя заданными вершинами в данном графе NL-полна относительно . -сведения |
Доказательство: |
Докажем, что . Для доказательства необходимо предъявить алгоритм для недетерминированной машины Тьюринга, который использует конечное число переменных, каждая из которых занимает памяти, где — размер входа, и за время порядка решает эту задачу.Алгоритм:
Таким образом в каждый момент алгоритму достаточно хранить текущую вершину, количество посещенных вершин, финальную вершину и некоторое число вспомогательных переменных, для совершения переходов. Все эти переменные принимают значения не более, чем максимальный номер вершины, то есть как раз занимают памяти.Теперь докажем, что любая задача из класса сводится к задаче с использованием не более чем логарифмической памяти.Необходимо по данной задаче из построить тройку , решение задачи для которой будет эквивалентно решению данной задачи.Любая машина Тьюринга, которая принимает некоторый язык из , использует не более чем логарифмическое количество ячеек на рабочей ленте, и таким образом возможных мгновенных описаний этой машины Тьюринга . Каждому возможному мгновенному описанию машины Тьюринга будет соответствовать некоторая вершина в , а каждому переходу из этого описания в другое (которых в недетерминированной машине Тьюринга конечное число) — ребро в графе . За вершину принимается вершина, соответствующая начальному состоянию машины, а из каждой вершины, соответствующей некоторому допускающему состоянию, добавляется переход в выделенную вершину .Очевидно, что для любого слова из языка Такое построение графа , то есть принимаемого данной машиной Тьюринга, будет существовать путь из в в построенном графе . А если для некоторого слова не из в существует путь из в , то он соответствует некоторой корректной последовательности переходов в изначальной машине, таким образом слово должно было приниматься этой недетерминированной машиной. по данной машине Тьюринга можно выполнить с использованием конечного числа переменных, которые будут перебирать всевозможные мгновенные состояния машины (их , потому переменная, перебирающая его занимает памяти), переходов из него и проверки возможности перехода. |
Теорема Иммермана
Определение: |
Задача несуществования пути между двумя заданными вершинами в данном графе | в графе G нет пути из s в t
Теорема: |
Доказательство: |
Очевидно, что язык является дополнением языка . Чтобы показать, что , придумаем недетерминированый алгоритм, использующий памяти, который проверяет, достижима ли вершина из .Определим = { существует путь из в длиной }. Другими словами это множество всех вершин, достижимых из не более чем за шагов.Введем обозначение . Если , где , то не существует путь из в в графе , то есть . Можно построить недетерминированный алгоритм, который будет допускать (то есть определять, существует ли путь из в такой длины) и при этом будет перечислять все вершины из на памяти (это будет доказано ниже).Таким образом показано, что Из соображений симметрии . Поскольку , то аналогичным образом . Получаем, что любую задачу из можно свести к задаче из , а значит . , а значит . |
Лемма: |
Можно построить недетерминированный алгоритм, который будет допускать и при этом будет перечислять все вершины из на памяти. |
Доказательство: |
Можно построить недетерминированный алгоритм, который будет допускать и при этом будет перечислять все вершины из на памяти.Enum() 0 //количество уже найденных и выведенных элементов for do //перебираем все вершины графа continue or find path //недетерминированно угадываем путь из s до v или переходим к следующей вершине ++ return //выдаем вершину, до которой угадали путь if ( ) //нашли вершин, допускаем, завершаем работу accept reject //не нашли вершин, не допускаем Enum перебирает все вершины на логарифмической памяти и пытается угадать путь до этой вершины из . Под угадыванием пути подразумевается последовательность недетерминированных выборов следующей вершины пути из в . Для угадывания пути необходимо памяти, так как необходимо лишь хранить текущую и следующую угадываемую вершины угадываемого пути. Enum является недетерминированым алгоритмом, и если существует порядок его исполнения достигающий accept, то происходит допуск.Теперь, имея Enum, можно по индукции находить . Очевидно, что , так как содержит единственную вершину — . Пусть известно значение . Напишем программу, которая на логарифмической памяти будет находить .
Next() // хотя бы один, так как for ; do //перебираем все вершины графа, кроме — это кандидаты на попадание в for do //перебираем все ребра, входящие в if ( in Enum( )) //перечисляем все вершины из , если одна из них, то ++ //увеличиваем количество найденных вершин и переходим к рассмотрению следующего кандидата break return
Теперь напишем алгоритм, который будет недетерминированно решать задачу на логарифмической памяти. Он будет состоять из двух частей: вычисление и перечисление всех вершин из . Вычисление происходит путем вызова Next раз, при этом каждый раз в качестве подставляется новое полученное значение.
NCONN(Данный алгоритм использует ) // for do //вычисляем Next( ) if ( in Enum( )) //перечисляем вершины из , если была перечислена, то достижима и выдаем reject, иначе accept reject else accept памяти, так как для хранения и необходимо , и для вызываемых Next и Enum необходимо памяти. |