這幾天讀paper發現2-SAT problem可以在多項式時間內被解出來,
由於SAT和3SAT是NP-complete,很好奇為什麼2SAT例外呢?
就去網路上搜尋,很快的找到了英文的解答。
所謂的2SAT,就是可以寫成C1 and C2 and C3 ... and Cn, where C:clause,
且其size必須是2,例如一clause A∨B就是size為2的clause.
現在,我們定義一個directed graph G=(V,E)
V:對於每一個variable x,取x和~x兩個node
而對於每一個clause A∨B,滿足A∨B,其實就是滿足~A->B(若非A則B)或~B->A(若非B則A),
E:對於每一個clause得到directed edge (~A,B)和(~B,A)
之後,把每一個(strongly)component依照topoligically sort編號,而strongly component內的編號皆編相同號碼。對於variable x,其編號函式為f(x)。
之後,由以下兩個Lemma,我們可以知道satisfying or not.
Lemma 1: formula F,假如有一個variable x,使得f(x)=f(~x),則F是unsatisfiable.
證明:
由f(x)=f(~x),知道x跟~x在同一strongly component,故存在一cycle:(x...~x...x),
當我們嘗試x=true來滿足時,在其path:(x...~x)都必需為true,但~x不為true。(contradiction)
同理x=false時(~x=true),也一樣是contradiction的情形。
Lemma 2: 假如對於在V上所有的x : f(x)!=f(~x),則我們得到satisfying assignment經由設定
x=true if f(x)>f(~x)和x=false if f(x)<f(~x)
證明:
假定(assume)我們要得到矛盾的結果,
則在F中必定有一clause (A ∨B)是false,此時A和B皆為false。
By definition,f(A)<f(~A)和f(B)<f(~B)
而clause (A ∨B)貢獻兩條邊(~A,B)和(~B,A) to E,我們得到f(~A)<=f(B)和f(~B)<=f(A),
結合以上,得到f(A) <f(~A)<=f(B)<f(~B) <=f(A),矛盾。
至於演算法,
首先single pass F得到G的adjacency list,需O(n)。(n為clause數)
因此,這個graph有邊2n個和至多4n個的點。
對於每一個variable x,建一list L point到graph的x和~x.
而計算strongly component和那圖的topological order需O(n)
(至於是什麼方法,我也不清楚),
之後,single pass L經由以上兩lemma的判斷,可知是否satisfying.
故The 2SAT problem for a formula F with n clauses can be solved in time O(n).
2008年3月2日 星期日
訂閱:
張貼留言 (Atom)
Codewars: The Baum-Sweet sequence
這題列在7 kyu,我覺得有點難度,應該有6 kyu的程度了。 這題有數學題的感覺,我因為害怕TLE,加上我有感冒, 因此是直接問ChatGPT 4o怎麼解決, 沒想到一開始,ChatGPT是提供TLE的方法, 我再問ChatGPT要如何加快, 才給我夠快的方法, 看了ChatG...
-
之前安裝photoshop CS2常常不能破解, 今天總算安裝成功, 原來是忘了執行"crack.exe"。 詳細step as follows: 1.安裝photoshop cs2,在安裝過程中,必須"一直按下一步", 不能改目錄位置,也...
-
今天中午,跟老姐一起看一公升的眼淚DVD, 後來老媽也加入來看, 看完之後,覺得還不錯, 劇中維持日劇一貫的風格,場景不多, 音樂非常優美,出場的人物不多, 主要圍繞在亞也、亞也他媽媽和醫生、同學間, 一公升的眼淚,是在1986年出的,現在也有中譯版了, 有興趣的網友可以去 博客...
-
不曉得是Pygame本身的缺陷或bug,Pygame程式執行一段時間,必需要呼叫event一下,否則程式會變成沒有回應的情況,而程式畫面也會暫時停止更新。解決方法,就是確定程式沒互動時,get一下event,但也不是隨時都可以get event,因為當有event要處理時,例如...
沒有留言:
張貼留言