Теорема Иммермана — различия между версиями
Akhi (обсуждение | вклад) |
Akhi (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
=== Утверждение теоремы === | === Утверждение теоремы === | ||
− | '''NL''' = ''' | + | '''NL''' = '''co-NL''' |
=== Доказательство === | === Доказательство === | ||
Строка 20: | Строка 20: | ||
Другими словами это множество всех вершин, достижимых из <tex>s</tex> не более чем за <tex>i</tex> шагов. | Другими словами это множество всех вершин, достижимых из <tex>s</tex> не более чем за <tex>i</tex> шагов. | ||
Обозначим <tex>|R_i|</tex> за <tex>r_i</tex>. | Обозначим <tex>|R_i|</tex> за <tex>r_i</tex>. | ||
− | Заметим, что если <tex>t \notin R_{n-1}</tex>, где <tex>n = |V|</tex>, то не существует путь <tex>s</tex> в <tex>t</tex> в графе <tex>G</tex>, то есть <tex><G, s, t></tex> ∈ '''STNONCON'''. | + | Заметим, что если <tex>t \notin R_{n-1}</tex>, где <tex>n = |V|</tex>, то не существует путь <tex>s</tex> в <tex>t</tex> в графе <tex>G</tex>, то есть <tex><G, s, t></tex>&nbs;∈&nbs;'''STNONCON'''. |
'''Лемма''': Можно построить недетерминированный алгоритм, который будет допускать <tex>r_i</tex> и при этом будет перечислять все вершины из <tex>R_i</tex> на <tex>O(\log |G|)</tex> памяти. | '''Лемма''': Можно построить недетерминированный алгоритм, который будет допускать <tex>r_i</tex> и при этом будет перечислять все вершины из <tex>R_i</tex> на <tex>O(\log |G|)</tex> памяти. | ||
Строка 51: | Строка 51: | ||
'''for''' v = 1..n; v ≠ s '''do''' //''перебираем все вершины графа, кроме s — это кандидаты на попадание в R<sub>i+1</sub>'' | '''for''' v = 1..n; v ≠ s '''do''' //''перебираем все вершины графа, кроме s — это кандидаты на попадание в R<sub>i+1</sub>'' | ||
'''for''' u : (u,v) ∈ E '''do''' //''перебираем все ребра, входящие в v'' | '''for''' u : (u,v) ∈ E '''do''' //''перебираем все ребра, входящие в v'' | ||
− | + | '''if''' u '''in''' Enum(s, i, r<sub>i</sub>, G) '''then''' //''перечисляем все вершины из R<sub>i</sub>, если u одна из них, то v ∈ R<sub>i+1</sub>'' | |
− | '''if''' u '''in''' Enum(s, i, r<sub>i</sub>, G) '''then''' //''если u одна из них, то v ∈ R<sub>i+1</sub>'' | ||
r++ //''увеличиваем количество найденных вершин и переходим к рассмотрению следующего кандидата'' | r++ //''увеличиваем количество найденных вершин и переходим к рассмотрению следующего кандидата'' | ||
'''break''' | '''break''' | ||
Строка 65: | Строка 64: | ||
Теперь напишем алгоритм, который будет недетерминированно решать задачу '''STNONCON''' на логарифмической памяти. | Теперь напишем алгоритм, который будет недетерминированно решать задачу '''STNONCON''' на логарифмической памяти. | ||
Он будет состоять из двух частей: вычисление <tex>r_{n-1}</tex> и перечисление всех вершин из <tex>R_{n - 1}</tex>. | Он будет состоять из двух частей: вычисление <tex>r_{n-1}</tex> и перечисление всех вершин из <tex>R_{n - 1}</tex>. | ||
− | Вычисление <tex>r_{n-1}</tex> происходит путем вызова <code>Next</code> <tex>n - 1</tex> раз, при этом каждый раз в качестве <tex>r_i</tex> подставляется новое полученное значение. | + | Вычисление <tex>r_{n-1}</tex> происходит путем вызова <code>Next</code> (<tex>n - 1</tex>) раз, при этом каждый раз в качестве <tex>r_i</tex> подставляется новое полученное значение. |
<code> | <code> | ||
NONCON(G, s, t) | NONCON(G, s, t) | ||
r<sub>n</sub> := 1 //''r<sub>0</sub> = 1'' | r<sub>n</sub> := 1 //''r<sub>0</sub> = 1'' | ||
− | '''for''' i = 0..(n - 2) '''do''' //'' | + | '''for''' i = 0..(n - 2) '''do''' //''вычисляем r<sub>n-1</sub>'' |
r<sub>n</sub> := Next(s, i, r<sub>n</sub>, G) | r<sub>n</sub> := Next(s, i, r<sub>n</sub>, G) | ||
− | + | '''if''' t in Enum(s, n - 1, r<sub>n</sub>, G) '''then''' //''перечисляем вершины из R<sub>n-1</sub>, если t была перечислена, то t достижима и выдаем REJECT, иначе ACCEPT'' | |
− | '''if''' t in Enum(s, n - 1, r<sub>n</sub>, G) '''then''' //'' | ||
'''REJECT''' | '''REJECT''' | ||
'''else''' | '''else''' | ||
Строка 83: | Строка 81: | ||
Таким образом показано, что '''STNONCON''' ∈ '''NL'''. | Таким образом показано, что '''STNONCON''' ∈ '''NL'''. | ||
− | Поскольку '''STNONCON''' ∈ ''' | + | Поскольку '''STNONCON''' ∈ '''co-NLC''', то получаем, что любую задачу из '''co-NL''' можно свести к задаче из '''NL''', а значит '''co-NL''' ⊂ '''NL'''. |
− | Из соображений симметрии '''NL''' ⊂ ''' | + | Из соображений симметрии '''NL''' ⊂ '''co-NL''', а значит '''NL''' = '''co-NL'''. |
Версия 18:49, 15 апреля 2010
Теорема Иммермана
Утверждение теоремы
NL = co-NL
Доказательство
Решим задачу STNONCON (s-t non connectivity) на логарифмической памяти и покажем, что STNONCON ∈ NL.
- нет пути из в в графе
Чтобы показать, что STNONCON входит в NL, придумаем недетерминированый алгоритм, использующий
памяти, который проверяет достижима ли вершина из .Чтобы показать правильность работы алгоритма требуется:
- В случае недостижимости из недетерминированные выборы приводят алгоритм к допуску.
- Если достижима из , то вне зависимости от недетерминированных выборов, совершаемых алгоритмом, алгоритм не приходит к допуску.
Определим
= { существует путь из в длиной ≤ }. Другими словами это множество всех вершин, достижимых из не более чем за шагов. Обозначим за . Заметим, что если , где , то не существует путь в в графе , то есть &nbs;∈&nbs;STNONCON.Лемма: Можно построить недетерминированный алгоритм, который будет допускать
и при этом будет перечислять все вершины из на памяти.
Enum(s, i, ri, G) counter := 0 //количество уже найденных и выведенных элементов for v = 1..n do //перебираем все вершины графа continue or find path //недетерминированно угадываем путь из s до v или переходим к следующей вершине counter++ yield return v //выдаем вершину, до которой угадали путь if counter ≥ ri then //нашли ri вершин, допускаем завершаем работу ACCEPT REJECT //не нашли ri вершин, не допускаем
Enum
перебирает все вершины на логарифмической памяти и пытается угадать путь до этой вершины из .
Под угадыванием пути подразумевается последовательность недетерминированных выборов следующей вершины пути из в .
Для угадывания пути необходимо памяти, так как необходимо лишь хранить текущую и следующую угадываемую вершины угадываемого пути.
Enum
является недетерминированым алгоритмом, и если существует порядок его исполнения достигающий ACCEPT
, то происходит допуск.
Теперь имея Enum
, можно индуктивно находить .
Очевидно, что , так как содержит единственную вершину — .
Пусть известно значение .
Напишем программу, которая на логарифмической памяти будет находить .
Next(s, i, ri, G) r := 1 //ri+1 хотя бы один, так как s ∈ Ri+1 for v = 1..n; v ≠ s do //перебираем все вершины графа, кроме s — это кандидаты на попадание в Ri+1 for u : (u,v) ∈ E do //перебираем все ребра, входящие в v if u in Enum(s, i, ri, G) then //перечисляем все вершины из Ri, если u одна из них, то v ∈ Ri+1 r++ //увеличиваем количество найденных вершин и переходим к рассмотрению следующего кандидата break return r
Данный алгоритм изначально учитывает Enum
.
Теперь напишем алгоритм, который будет недетерминированно решать задачу STNONCON на логарифмической памяти.
Он будет состоять из двух частей: вычисление Next
( ) раз, при этом каждый раз в качестве подставляется новое полученное значение.
NONCON(G, s, t) rn := 1 //r0 = 1 for i = 0..(n - 2) do //вычисляем rn-1 rn := Next(s, i, rn, G) if t in Enum(s, n - 1, rn, G) then //перечисляем вершины из Rn-1, если t была перечислена, то t достижима и выдаем REJECT, иначе ACCEPT REJECT else ACCEPT
Данный алгоритм использует Next
и Enum
необходимо памяти.
Таким образом показано, что STNONCON ∈ NL. Поскольку STNONCON ∈ co-NLC, то получаем, что любую задачу из co-NL можно свести к задаче из NL, а значит co-NL ⊂ NL. Из соображений симметрии NL ⊂ co-NL, а значит NL = co-NL.