Задача NP-трудна для где - конечный язык, содержащий следующие слова:L=A∗L = A*AA
- х 111 х 000х 111 , ,х 000
- у 100 , у 010 , у 001 ,Y100Y010Y001
- 00 c 11 , 01 c 10 , 10 c 01 и 11 c 0000 с 1101 с 1010c0111c00
Сокращение связано с проблемой Ориентация графика, которая, как известно, является NP-трудной (см. Https://link.springer.com/article/10.1007/s00454-017-9884-9 ). В этой задаче нам дан 3-регулярный неориентированный граф, в котором каждая вершина помечена либо " { 1 } ", либо " { 0 , 3 } ". Цель состоит в том, чтобы направить ребра графа таким образом, чтобы конечная точка каждой вершины находилась в наборе, обозначающем эту вершину.{1}{0,3}
Сокращение должно принимать в качестве входных данных экземпляр Graph Orientation и выводить список троек в качестве выходных данных. В этом сокращении тройки, которые мы выводим, всегда будут удовлетворять определенным ограничениям. Эти ограничения перечислены ниже, и мы будем ссылаться на список троек как действительный, если и только если они удовлетворяют этим ограничениям:
- Символам x , y и c задаются только интервалы, содержащие ровно один индекс. Другими словами, всякий раз, когда эти символы размещаются, они размещаются в определенных местах.xyc
- Для каждой тройки ( i , l , r ), присутствующей в случае с i ∈ { 0 , 1 } , тройка ( 1 - i , l , r ) также присутствует.(i,l,r)i∈{0,1}(1−i,l,r)
- Если ( α , l , r ) и ( α ′ , l ′ , r ′ ) являются тройками, присутствующими в данном случае, то либо l < l ′ ≤ r ′ < r , либо l ′ < l ≤ r < r ′ , либо { α , α ′ } = { 0 , 1 } с l = l(α,l,r)(α′,l′,r′)l<l′≤r′<rl′<l≤r<r′{α,α′}={0,1}′ < R = r ′ .l=l′<r=r′
- Если ( α , л , г ) является тройной , то число троек ( α ' , л ' , г ' ) с л ≤ L ' ≤ R ' ≤ г ровно г - л + 1 .(α,l,r)(α′,l′,r′)l≤l′≤r′≤rr−l+1
Обратите внимание на следующую лемму, доказанную в конце этого поста.
Лемму: для действительного списка троек, символы х , у , и с должны быть помещены точно так , как указано троек, и для любой пары троек ( 0 , л , г ) и ( 1 , л , г ) , то два символа для этой тройки должны быть помещены в индексы l и r .xyc(0,l,r)(1,l,r)lr
Тогда идея сокращения заключается в следующем.
Мы используем пары троек ( 0 , l , r ) и ( 1 , l , r ) для представления ребер. Ребро проходит между конечными точками по индексу l и по индексу r . Предполагая, что мы создаем действительный список троек, символы из этих двух троек должны быть размещены в l и r , поэтому мы можем рассматривать порядок, в котором они располагаются, как указание направления края. Здесь 1 - «голова» края, а 0 - «хвост». Другими словами, если 1 находится в т(0,l,r)(1,l,r)lrlr101rтогда край указывает от l до r, и если 1 помещен в l, то край указывает от r до l .lr1lrl
Чтобы представить вершины, мы помещаем символ x или y в индекс и используем следующие три символа в качестве конечных точек трех ребер, которые касаются вершины. Обратите внимание , что если мы размещаем х , все три ребра на вершине должны указывать в том же направлении (все в вершину или все из вершины) просто из строк, которые в конечном языке A . Такие вершины имеют степень 0 или 3 , поэтому мы ставим x точно для вершин, помеченных { 0 , 3 } . Если мы разместим уxyxA03x{0,3}y, Ровно один из трех ребер в вершине должны указывать в том же направлении , из - за строки в A . Такие вершины имеют степень 1 , поэтому мы ставим y точно для вершин, помеченных { 1 } .A1y{1}
В некотором смысле, мы сделали. В частности, должно быть ясно соответствие между решением этого экземпляра и решением экземпляра Graph Orientation. К сожалению, список производимых нами троек может оказаться недействительным, поэтому описанные «ребра» могут работать не так, как задумано. В частности, список троек может быть недействительным, поскольку условие, что интервалы из троек должны всегда содержать друг друга, может не соблюдаться: интервалы от двух ребер могут перекрываться, если один из них не содержит другой.
Чтобы бороться с этим, мы добавим еще немного инфраструктуры. В частности, мы добавляем «вершины кроссовера». Пересекающаяся вершина - это вершина степени 4 , ребра которой спарены так, что в каждой паре одно ребро должно указывать на вершину пересечения, а другое - наружу. Другими словами, пересеченная вершина будет вести себя так же, как и два «пересекающихся» ребра. Мы представляем пересеченную вершину, помещая символ c в некоторый индекс i . Затем обратите внимание, что язык A ограничивает символы в i - 1 и i + 2 противоположными (один 0 и один 1 ) и символы в i - 24ciAi−1i+201i−2и я + 1, чтобы быть противоположным. Таким образом, если мы используем эти индексы в качестве конечных точек для четырех ребер в вершине кроссовера, поведение будет точно таким, как описано: четыре ребра попарно попарно, и среди каждой пары один указывает и один указывает.i+1
Как мы на самом деле размещаем эти кроссоверы? Хорошо, предположим, у нас есть два интервала ( l , r ) и ( l ′ , r ′ ), которые перекрываются. WLOG, l < l ′ < r < r ′ . Мы добавляем символ пересечения в середину (между l ′ и r ). (Допустим, что все это время мы разбрасывали все так, чтобы всегда было достаточно места, и в конце мы удалим все неиспользуемые места.) Пусть индекс символа кроссовера будет i . Затем мы заменим четыре тройки ( 0(l,r)(l′,r′)l<l′<r<r′l′ri, l , r ) , ( 1 , l , r ) , ( 0 , l ′ , r ′ ) и ( 1 , l ′ , r ′ ) с восемью тройками по две каждая (одна с символом 0 и одна с символом 1 ) для следующих четырех интервалов ( l , i - 1 ) , ( i + 2 , r )(0,l,r)(1,l,r)(0,l′,r′)(1,l′,r′)01(l,i−1)(i+2,r), ( l ′ , i - 2 ) , ( i + 1 , r ′ ) . Обратите внимание, что интервалы больше не пересекаются в плохой форме! (После этого изменения, если два интервала перекрываются, один находится строго внутри другого.) Кроме того, ребро от l до r заменяется ребром от l до вершины кроссовера, за которым следует ребро оттуда до r ; эти два ребра спарены в вершине пересечения таким образом, что один направлен внутрь, а другой направлен; другими словами, два ребра вместе ведут себя так же, как один ребро, которое они заменяют.(l′,i−2)(i+1,r′)lrlr
В некотором смысле, помещая в эту пересеченную вершину «некрещенные» два ребра (чьи интервалы перекрывались). Легко видеть, что добавление пересеченной вершины не может вызвать пересечение дополнительных ребер. Таким образом, мы можем пересечь каждую пару пересекающихся ребер, вставив достаточное количество пересеченных вершин. Конечный результат по-прежнему соответствует экземпляру Graph Orientation, но теперь список троек действителен (теперь все свойства легко проверить, когда мы «пересекаем» любые пересекающиеся ребра), поэтому применяется лемма, ребра должны вести себя как описано и соответствие на самом деле является эквивалентностью. Другими словами, это сокращение является правильным.
доказательство леммы
Лемму: для действительного списка троек, символы х , у , и с должны быть помещены точно так , как указано троек, и для любой пары троек ( 0 , л , г ) и ( 1 , л , г ) , то два символа для этой тройки должны быть помещены в индексы l и r .xyc(0,l,r)(1,l,r)lr
доказательство:
Поступаем по индукции на тройки по длине интервала. В частности, наше утверждение таково: для любого k, если некоторая тройка имеет длину интервала k, символ в этой тройке должен быть размещен, как описано в лемме.kk
Базовый случай: для k = 0 тройка должна помещать символ x , y или c в один индекс внутри интервала. Это именно так, как описано в лемме.k=0xyc
Индуктивный случай: предположим, что утверждение верно для любого k, меньшего некоторого k ′ . Теперь рассмотрим некоторую тройку с длиной интервала k ′ . Тогда эта тройка должна иметь вид ( i , l , r ) с r = l + k ′ - 1 и i ∈ { 0 , 1 } . Тройка ( 1 - i , l , r ) также должна присутствовать. Количество троек ( αkk′k′(i,l,r)r=l+k′−1i∈{0,1}(1−i,l,r)′ , L ′ , r ′ ) с l ≤ l ′ ≤ r ′ ≤ r в точности равно r - l + 1 = k ′ . Эти тройки включают в себя тройки ( 0 , l , r ) и ( 1 , l , r ), а также k ′ - 2 других тройки вида ( α ′ , l ′(α′,l′,r′)l≤l′≤r′≤rr−l+1=k′(0,l,r)(1,l,r)k′−2, r ' ) с l < l ′ ≤ r ′ < r . Эти другие троек все имеют длину интервала меньшечем к ' , поэтому все они должны размещать свои символыкак указано в лемме. Единственный способ сделать это, если эти тройки размещают символы в каждом индексе, начиная с индекса l + 1 и заканчивая индексом r + 1 . Таким образом, наши две тройки ( 0 , l , r ) и ( 1 , l , r )(α′,l′,r′)l<l′≤r′<rk′l+1r+1(0,l,r)(1,l,r)должны поместить свои символы в индексы l и r , как описано в лемме, завершающей индуктивный случай.lr
По индукции лемма верна.