시간이 아니라 메모리를 자원으로 셀 때, 결정성과 비결정성의 격차는 한 변의 제곱이라는 작은 값으로 좁혀진다.
시간 복잡도에서 우리는 "단계 수"를 자원으로 셌다. 그러나 컴퓨터의 한계가 시간만은 아니다. 어떤 알고리즘은 빠르게 끝나지만 메모리를 게걸스럽게 먹어 치우고, 또 어떤 알고리즘은 느리지만 작은 노트만으로도 충분하다. 이번 강의에서는 자원의 축을 메모리로 바꾸어 본다.
여기서 한 가지 약속이 필요하다. 메모리를 측정한다고 해서 입력 w 자체를 다시 셀 수는 없다 — 입력만으로 이미 n 비트가 든다. 우리가 진짜 관심 있는 것은 기계가 추가로 끼적이는 노트의 양이다. 그래서 공간 복잡도용 튜링 기계는 보통 입력 테이프(읽기 전용)와 작업 테이프(읽기/쓰기)를 분리한 모델을 사용한다.
입력 자체는 셈에서 빠지므로 SPACE(log n)처럼 입력보다 작은 공간 클래스를 정의하는 일도 가능하다. 본 강의에서는 다항 공간만 다루지만, 그런 정의의 미세함이 가능한 까닭은 이 분리된 모델 덕분이라는 점을 머리 한구석에 둬두자.
두 자원은 서로를 묶는 두 가지 자명한 부등식을 가진다. 첫 번째는 거의 정의에 가깝다.
두 번째는 약간의 사색을 요구한다. 공간을 적게 쓰는 기계가 시간을 얼마까지 쓸 수 있는가? 답은 "의외로 많지만 그 한계가 깔끔하다"이다.
두 관찰을 묶으면 다음 다이어그램이 자연스럽다.
P ⊆ NP ⊆ PSPACE ⊆ EXPTIME
맨 왼쪽은 자명, 두 번째는 NP의 다항 검증자가 인증서와 함께 다항 시간에 굴러가니 다항 공간만 쓴다는 데서 나온다 — 또는 모든 가능 인증서를 한 통의 다항 길이 변수에 저장하면서 차례로 시도해도 다항 공간이 충분하다. 마지막 PSPACE ⊆ EXPTIME은 관찰 2의 직접 따름이다.
흥미로운 점은 이 사슬 어디에서도 진짜 분리가 알려져 있지 않다는 것이다. P ≠ PSPACE인지, NP ≠ PSPACE인지, 어느 쪽도 풀리지 않은 채 책상 위에 놓여 있다.
NP에 SAT가 있다면 PSPACE에는 그 양화 버전이 있다. SAT는 "어떤 할당이 식을 만족시키는가"를 묻지만, 진짜 게임은 변수마다 ∀와 ∃가 번갈아 붙을 때 시작된다.
φ = Q1 x1 Q2 x2 … Qk xk ψ(x1, …, xk)
여기서 각 Qi는 ∀ 또는 ∃이고 ψ는 양화자 없는 부울 식이다. 자유 변수가 없으므로 φ는 그 자체로 참 또는 거짓이다. TQBF는 참인 전 양화 부울 식들의 집합이다.
TQBF가 PSPACE에 속한다는 사실을 보이는 자연스러운 방법은 양화자 한 개씩을 손으로 까보는 재귀이다.
실은 TQBF는 PSPACE-완전이다 — 그 사실의 증명은 쿡-레빈의 변형이지만 이 강의의 메인 메뉴는 따로 있다.
시간 영역에서 P와 NP의 차이가 얼마나 큰지는 아무도 모른다. 그런데 공간 영역에서는 사정이 다르다. 1970년 월터 사비치가 "비결정 공간을 결정 공간으로 옮길 때 잃는 것은 한 변을 제곱할 만큼뿐"임을 보였다.
증명의 무대는 임의의 NTM N과 그 안에서 일어나는 구성 그래프(configuration graph)다. 입력 w가 주어졌을 때 N의 구성은 (상태, 작업 테이프 내용, 두 헤드 위치)로, 작업 공간이 s 칸이면 가능한 구성은 2O(s)개. N이 w를 수락한다는 것은 시작 구성 cstart에서 어떤 수락 구성 caccept로 이르는 경로가 N의 한 단계 관계 안에서 존재한다는 뜻이다.
핵심은 "도달 가능성"을 분할 정복으로 풀어내는 다음 술어다.
CANYIELD는 다음 재귀로 계산된다.
CANYIELD(c1, c2, t):
if t = 1 : return ( c1 = c2 또는 c1 ⊢ c2 in N )
for each 가능한 중간 구성 m :
if CANYIELD(c1, m, ⌈t/2⌉) AND CANYIELD(m, c2, ⌊t/2⌋) :
return YES
return NO
핵심 트릭은 두 재귀 호출을 차례로 하고 그 사이에 작업 공간을 재활용하는 것이다 — 깊이는 단지 log2 t에 비례하고, 한 레벨이 차지하는 변수는 c1, c2, m의 세 구성이다. 각 구성은 s 칸을 차지하므로 한 레벨당 O(s) 공간.
O(s) × O(s) = O(s2).
바깥쪽 caccept 순환은 카운터 하나로 돌리고 매번 같은 작업 공간을 재활용하므로 추가 비용이 없다.
주목할 만한 점 두 가지. 첫째, 시간으로 같은 일을 시도했다면 결과는 끔찍했을 것이다 — 우리는 t를 t/2씩 쪼개도 두 호출 모두를 수행하므로 시간상 곱이 절약되지 않는다. 그러나 공간은 재사용 가능한 자원이라 이 분할 정복이 의미를 갖는다. 둘째, 우리가 다룬 t가 2O(s)이라 깊이가 O(s)였다는 점이다. 시간으로 설정한 t였다면 깊이가 너무 작아 별 도움이 안 됐을 것이다.
이 결과를 시간 영역의 미해결 문제 P =? NP와 비교해 보면 약간의 위안과 동시에 약간의 좌절감을 느끼게 된다. 메모리 자원에서는 결정성과 비결정성이 한 변을 제곱하는 일로 거리가 메워진다 — 그런데 시간에서는 그조차도 우리가 모른다.
오늘의 수확을 헤아려 두자. 공간 클래스 SPACE(s)와 NSPACE(s)를 입력 테이프와 작업 테이프를 분리한 모델 위에서 정의하고, 그 정의로부터 PSPACE와 NPSPACE를 얻었다. 시간/공간의 두 자명한 부등식은 P ⊆ NP ⊆ PSPACE ⊆ EXPTIME이라는 사슬을 빚어냈고, 이 사슬 어느 곳에서도 진짜 진부분 관계가 알려져 있지 않다는 사실을 확인했다.
그 다음 PSPACE의 대표적 시민 TQBF를 만났다. 이 문제는 양화자 게임에서 ∃ 측의 필승 여부를 묻는 것과 다름없고, 양화자 한 겹씩 까는 재귀로 다항 공간에 결정 가능했다. 마지막으로 사비치 정리는 도달 가능성을 분할 정복으로 다루어, 비결정 공간 s를 결정 공간 s2로 시뮬레이션할 수 있음을 보였다 — 결과적으로 PSPACE = NPSPACE.
다음 강의에서는 이 PSPACE 안에서 가장 어려운 자리에 앉은 문제들 — PSPACE-완전 문제들 — 의 모습을 본격적으로 들여다본다. TQBF가 그 자리의 첫 거주민이고, 그로부터 환원되는 게임 이론적 결정 문제들이 줄을 잇는다. 시간이 흘러도 메모리는 잊지 않는다는 사실을 가장 적나라하게 보여 주는 클래스가 PSPACE다.