Теорема Иммермана — различия между версиями
Akhi (обсуждение | вклад) |
Akhi (обсуждение | вклад) |
||
| Строка 22: | Строка 22: | ||
то есть <tex><G, s, t> \in \text{STNONCON}</tex>. | то есть <tex><G, s, t> \in \text{STNONCON}</tex>. | ||
| − | '''Лемма''': Можно построить алгоритм, который | + | '''Лемма''': Можно построить недетерминированный алгоритм, который будет принимать верно заданное <tex>r_i</tex> и при этом будет перечислять все вершины из <tex>R_i</tex> на логарифмической памяти. |
| − | |||
| − | |||
<code> | <code> | ||
| Строка 33: | Строка 31: | ||
counter++ | counter++ | ||
yield return v //''выдаем вершину, до которой угадали путь'' | yield return v //''выдаем вершину, до которой угадали путь'' | ||
| − | ''if'' counter ≥ r_i ''then'' //''нашли r_i вершин, | + | ''if'' counter ≥ r_i ''then'' //''нашли r_i вершин, принимаем и завершаем работу'' |
ACCEPT | ACCEPT | ||
| − | REJECT //''не нашли r_i вершин'' | + | REJECT //''не нашли r_i вершин, отклоняем'' |
</code> | </code> | ||
| − | <tex>Enum</tex> перебирает все вершины на логарифмической памяти и пытается угадать путь до этой вершины из <tex>s</tex>. Для | + | <tex>Enum</tex> перебирает все вершины на логарифмической памяти и пытается угадать путь до этой вершины из <tex>s</tex>. |
| + | Под угадыванием пути подразумевается последовательность недетерминированных выборов следующей вершины пути. Для работы необходимо <tex>O(\log |G|)</tex> памяти, так как необходимо лишь хранить текущую | ||
| + | и следующую угадываемую вершины угадываемого пути. | ||
| + | <tex>Enum</tex> является недетерминированым алгоритмом и если существует порядок исполнения, чтобы достичь ACCEPT, то он достигается. | ||
Теперь имея <tex>Enum</tex>, можно индуктивно находить <tex>r_i</tex>. Очевидно, что <tex>r_0 = 1</tex>, так как <tex>R_0</tex> содержит единственную вершину <tex>s</tex>. Пусть известно значение <tex>r_i</tex>. Напишем программу, которая на логарифмической памяти будет находить <tex>r_{i + 1}</tex>. | Теперь имея <tex>Enum</tex>, можно индуктивно находить <tex>r_i</tex>. Очевидно, что <tex>r_0 = 1</tex>, так как <tex>R_0</tex> содержит единственную вершину <tex>s</tex>. Пусть известно значение <tex>r_i</tex>. Напишем программу, которая на логарифмической памяти будет находить <tex>r_{i + 1}</tex>. | ||
| Строка 72: | Строка 73: | ||
Данный алгоритм использует <tex>O(\log |G|)</tex> памяти, так как для хранения <tex>r_n</tex> и <tex>i</tex> необходимо <tex>2\log |G|</tex>, а для вызываемых Next и Enum необходимо <tex>O(\log |G|)</tex> памяти. | Данный алгоритм использует <tex>O(\log |G|)</tex> памяти, так как для хранения <tex>r_n</tex> и <tex>i</tex> необходимо <tex>2\log |G|</tex>, а для вызываемых Next и Enum необходимо <tex>O(\log |G|)</tex> памяти. | ||
| − | Таким образом показано, что STNONCON ∈ NL. | + | Таким образом показано, что STNONCON ∈ NL. Поскольку STNONCON ∈ coNLC, то получаем, что любую задачу из coNLC можно свести к задаче из NL, а значит coNL<tex>\subset</tex>NL. |
| + | Из соображений симметрии NL<tex>\subset</tex>coNL, а значит NL = coNL. | ||
Версия 16:26, 15 апреля 2010
Теорема Иммермана
Утверждение теоремы
NL = coNL
Доказательство
Решим задачу STNONCON на логарифмической памяти и покажем, что STNONCON ∈ NL.
- нет пути из в в графе
Чтобы показать, что STNONCON входит в NL, можно придумать недетерминированый алгоритм, использующий памяти, который проверяет достижима ли вершина из .
Чтобы показать правильность работы алгоритма необходимо показать:
- В случае недостижимости из недетерминированые выборы приводят алгоритм к единице.
- Если достижима из , то вне зависимости от недетерминированых выбором, совершаемых алгоритмом, результат ноль.
Определим = {: существует путь из в длиной }. Другими словами это множество всех вершин, достижимых из не более чем за шагов. Обозначим за . Заметим, что если , где = , то не существует путь в в графе , то есть .
Лемма: Можно построить недетерминированный алгоритм, который будет принимать верно заданное и при этом будет перечислять все вершины из на логарифмической памяти.
Enum(s, i, r_i, G)
counter := 0 //количество уже найденных и выведенных элементов
for v = 1 .. n do //перебираем все вершины графа
continue or find path //недетерминировано выбираем переходить к следующей вершине или угадываем путь до данной
counter++
yield return v //выдаем вершину, до которой угадали путь
if counter ≥ r_i then //нашли r_i вершин, принимаем и завершаем работу
ACCEPT
REJECT //не нашли r_i вершин, отклоняем
перебирает все вершины на логарифмической памяти и пытается угадать путь до этой вершины из . Под угадыванием пути подразумевается последовательность недетерминированных выборов следующей вершины пути. Для работы необходимо памяти, так как необходимо лишь хранить текущую и следующую угадываемую вершины угадываемого пути. является недетерминированым алгоритмом и если существует порядок исполнения, чтобы достичь ACCEPT, то он достигается.
Теперь имея , можно индуктивно находить . Очевидно, что , так как содержит единственную вершину . Пусть известно значение . Напишем программу, которая на логарифмической памяти будет находить .
Next(s, i, r_i, G) r := 1 // хотя бы один, так как for v = 1 .. n; do //перебираем все вершины графа, кроме s -- это кандидаты на попадание в for u : (u,v)∈E do //перебираем все ребра, входящие в v Enum(s, i, r_i, G) //перечисляем все вершины из if u in output then //если u одна из них, то r++ //увеличиваем количество найденных вершин и переходим к рассмотрению следующего кандидата break write r
Данный алгоритм изначально учитывает , а затем перебирает всех возможных кандидатов на попадание в . Для каждого из них перебираются все ребра, в него входящие. Затем перечисляются все вершины из и, если начало нашего ребра было перечислено, то . Алгоритм использует памяти, так необходимо хранить лишь , , и еще поочередно значения полученные в результате вызова .
Теперь можно написать алгоритм, который будет недетерминировано решать задачу на логарифмической памяти. Он будет состоять из двух частей: вычисление и перечисление всех вершин из . Вычисление происходит путем вызова Next , при этом каждый раз в качестве подставляется новое полученное значение.
NONCON(G, s, t) := 1 // for i = 0..n-2 do //Вычисляем := Next(s, i, , G) Enum(s, n - 1, , G) //Перечисляем вершины из if t in output then //Если t была перечислена то t достижима и выдаем REJECT, иначе ACCEPT REJECT else ACCEPT
Данный алгоритм использует памяти, так как для хранения и необходимо , а для вызываемых Next и Enum необходимо памяти.
Таким образом показано, что STNONCON ∈ NL. Поскольку STNONCON ∈ coNLC, то получаем, что любую задачу из coNLC можно свести к задаче из NL, а значит coNLNL. Из соображений симметрии NLcoNL, а значит NL = coNL.