Linear 3SAT: версия 3SAT в линейном времени

Рассмотрим экземпляр 3SAT со следующим особым свойством локальности. Предположим, что в булевой формуле есть n переменных, и что они пронумерованы 1,2,3....n таким образом, что каждое предложение включает переменные, номера которых находятся в пределах +-10 друг от друга. Приведите линейный алгоритм решения такого случая 3SAT.

Я не мог решить проблему, но моя интуиция подсказывает, что если бы мы могли отобразить проблему на графике, то она могла бы быть решена, но не могла бы пойти намного дальше.


person Hirak Sarkar    schedule 18.04.2012    source источник


Ответы (2)


Это относительно простая задача динамического программирования. Я опишу решение, не обращая внимания на довольно простые проблемы индексации вокруг любой границы.

После m-го шага у нас есть набор возможных значений переменных (m-10, m-9, ..., m+10), которые до сих пор могли быть решениями, каждое из которых связано с набором значений для всех предыдущих переменных. что приводит к решениям уравнений 1..m.

Для m+1-го шага мы берем каждый член этого набора возможных решений, игнорируем m-10-е значение и рассматриваем каждую возможность для m+11-го значения. Если m+1-е уравнение истинно, мы добавляем его к следующему набору решений, указывая на нашу историю, только если этот шаблон решения еще не был добавлен.

Это подготавливает нас к m+2-му шагу.

Требуется n шагов, на каждом из которых может быть рассмотрено около 2 миллионов возможных случаев, так что это линейно.

(Забавная задача. Измените этот алгоритм так, чтобы он не просто находил решение, а подсчитывал количество возможных решений.)

person btilly    schedule 18.04.2012
comment
это то, что каждый шаг мы должны попробовать с 20 переменными, что, в свою очередь, означает 2 ^ 20 возможных случаев, чтобы попробовать !!! я прав ? - person Hirak Sarkar; 18.04.2012
comment
Как описано, на самом деле это 2 ^ 21 (не забывайте 0). хотя вы можете игнорировать m-10-е значение, чтобы вернуть его к 2 ^ 20. Это большая константа, но она является константой и, следовательно, не меняет большого O алгоритма. - person btilly; 19.04.2012

Я думаю, что вы можете просто использовать брутфорс в полигоне. Разделите список предложений на две части. Исчерпывающий поиск по переменным, которые находятся по обе стороны от разделения. Их не более 30, так что 2 ^ 30 = O (1) настроек, которые нужно попробовать. Как только эти переменные установлены, вы можете рекурсивно решать обе стороны, каждая из которых является независимым экземпляром SAT с n/2 переменными.

person Keith Randall    schedule 18.04.2012
comment
Не могли бы вы уточнить, почему переменная с постоянным числом присутствует с обеих сторон разделения. - person Hirak Sarkar; 18.04.2012
comment
предположим, что у нас есть что-то вроде (x1 + x2'+ x3) | (x1' + x2 + x3) (x4'+ x5 + x6) | (х4 + х5' + х6) ...................................... .......... (x30 + x31' + x32) | (x30 + x31 + x32') Тогда каждая сторона раскола имеет более 30 переменных правильно !!! - person Hirak Sarkar; 18.04.2012
comment
Я имею в виду, что существует не более 30 переменных, которые появляются на обеих сторонах разделения. - person Keith Randall; 18.04.2012
comment
Предположим, я пытаюсь создать экземпляр задачи с более чем 30 переменными, которые появляются с обеих сторон разделения. Предположим, что левая сторона ‹br/› (x1 + x2'+ x3) | (x1' + x2 + x3) ‹br/› (x4'+ x5 + x6) | (x4 + x5' + x6) ‹br/› .......................... ‹br /› ........ .................. ‹br /› (x30 + x31' + x32) | (x30 + x31 + x32') ‹br/› Таким образом, каждая сторона разделения имеет более 30 общих переменных, которые также подчиняются условию, наложенному на пункты .., может быть, я не понимаю вашу точку зрения, пожалуйста, укажите на мою ошибку в понимание. С Уважением - person Hirak Sarkar; 19.04.2012
comment
Я не знаю, почему линия разрыва не работает, что я пытался написать, есть ли | разделительная линия. Таким образом, обе стороны содержат всего 60 предложений, мы можем увеличить их до любого числа. - person Hirak Sarkar; 19.04.2012
comment
Если разделить его ровно посередине (между (x13'+x14+x15) и (x16+x17'+x18)), то между двумя сторонами нет общих переменных. В левой части есть только переменные x1-x15, а в правой части только переменные x16-x30. - person Keith Randall; 19.04.2012
comment
Должен ли я сортировать их по индексу - person Hirak Sarkar; 19.04.2012
comment
Хорошо, я понял, мы можем поддерживать хэш-таблицу, в которой будет записана максимальная индексированная переменная предложения, затем мы можем разделить и выполнить действия в соответствии с индексом, верно? - person Hirak Sarkar; 19.04.2012