Giáo trình Lý thuyết tính toán - Phan Huy Khánh

Tóm tắt Giáo trình Lý thuyết tính toán - Phan Huy Khánh: ...q3, q4} và P = { q1, 1 → #, R, q2, q2, 1 → # R, q3, q3, 1 → 1, R, q3, q3, # → 1, L, q4 } Nếu qui ước biểu diễn đơn nguyên (unary) của một số nguyên bởi viết liên tiếp n+1 chữ số 1 (số nguyên 0 được biểu diễn bởi một chữ số 1) và các cặp số nguyên biểu diễn theo quy ước này được đặt các...âu wi bị xóa khỏi băng thứ nhất để chép lại lên băng thứ hai. Băng thứ ba được ghi hằng q1_ . Khi kết thúc, máy TC ở cấu hình như sau : − Băng thứ nhất chứa câu f với đầu đọc-ghi nằm phía trái của f. − Băng thứ hai chứa câu wi với đầu đọc-ghi nằm phía trái của wi. − Băng thứ ba chứa câu q1... niệm trực giác với các máy Turing là một khái niệm hình thức. Do đó, ta cần hình thức hoá khái niệm về thủ tục hiệu quả. Nhưng khi đó, ta lại phải giải quyết vấn đề là có sự tương đương giữa phương pháp hình thức hoá đưa ra và khái niệm trực giác hay không ? Lời giải của vấn đề này lại nảy si...

pdf108 trang | Chia sẻ: havih72 | Lượt xem: 329 | Lượt tải: 0download
Nội dung tài liệu Giáo trình Lý thuyết tính toán - Phan Huy Khánh, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
 các bài toán quyết định được thành những bài toán ít 
nhiều phức tạp hơn, không phụ thuộc vào hiện trạng của công nghệ Tin học. 
Có nhiều cách đo độ phức tạp tính toán đã được nghiên cứu, đó là độ phức tạp 
trung bình, độ phức tạp trong trường hợp xấu nhất, v. v... Dưới đây, ta sẽ chỉ xét độ 
phức tạp tính toán trong trường hợp xấu nhất. 
I. Độ phức tạp về thời gian và về bộ nhớ 
Người ta thường đưa vào khái niệm độ phức tạp cho các ngôn ngữ . Độ phức tạp 
của một bài toán là độ phức tạp của ngôn ngữ đặc trưng cho bài toán này. 
Ta xét một máy Turing đơn định có k băng và dừng trên mọi dữ liệu. Xuất phát từ 
một cấu hình ban đầu (1, q1, f), máy Turing có một tính toán dừng ở độ dài m. Ta 
xem rằng tập hợp Ln của tất cả các câu f cùng có một độ dài như nhau là n. Nếu Ln 
khác rỗng, với mỗi số nguyên n, ta cho kết hợp với số nguyên : 
T(n) = Maxf∈Ln { độ dài tính toán nhận biết f } 
Nếu Ln = ∅ (tập hợp trống), ta đặt T (n) = 0. 
Hàm T : N → N vừa định nghĩa xác định độ phức tạp về thời gian (time 
complexity) T(n) của máy Turing k băng (ta quy ước mỗi bước tính toán kéo dài 
trong một khoảng thời gian bằng đơn vị). 
Người ta cũng nói rằng ngôn ngữ được nhận biết bởi máy Turing có một độ phức 
tạp về thời gian nhiều nhất là T (n). 
94 Lý thuyết tính toán 
Tương tự, ta xét một máy Turing off-line đơn định có k băng và dừng với mọi dữ 
liệu. Từ một cấu hình xuất phát (1, q1, f), máy này có một tính toán trên f và dừng. 
Trong quá trình tính toán, máy Turing di chuyển các đầu đọc-ghi của nó, mỗi một đầu 
đọc-ghi đến thăm một số ô phân biệt. 
Bây giờ ta xét tập hợp Ln của tất cả các câu f có cùng một độ dài n. Với mỗi số 
nguyên n, ta cho kết hợp với số nguyên : 
S (n) = Maxf∈Ln 
là số các ô đã được thăm trên các băng làm việc khi tính toán để nhận biết f . 
Nếu Ln = ∅, ta đặt S (n) = 0 
Hàm S : N → N vừa định nghĩa xác định độ phức tạp về bộ nhớ (space 
complexity) S(n) của máy Turing 0ff-line k băng. Người ta nói rằng ngôn ngữ được 
nhận biết bởi máy Turing có một độ phức tạp về bộ nhớ nhiều nhất là S(n). 
Chú ý rằng khi xét độ phức tạp về bộ nhớ, người ta không xét không gian nhớ sử 
dụng trên băng đọc : không gian nhớ này đúng bằng độ dài n của câu cần nhận biết. 
Vì nếu không, người ta sẽ không thể nhận được hàm S(n). 
Sau đây, ký hiệu I (x) là phần nguyên của x, ta viết : 
T (n) = f (n) hàm T (n) được tăng lên max { n+1, I (f (n)) + 1 } 
S (n) = f (n) hàm S (n) được tăng lên max { 1, I (f (n) + 1 } 
Ví dụ 6.1 : 
Cho L = { wwR | w∈ {0, 1}* và wR là câu đảo của w } 
Tồn tại một máy Turing T1 có hai băng nhận biết ngôn ngữ L với chi phí về thời 
gian là T(n) = n + 1. Máy này sao chép lên băng thứ hai các ký tự đã đọc trên băng 
thứ nhất cho đến khi gặp ký tự  rồi kiểm tra sự bằng nhau tương ứng của các ký tự 
tiếp theo trên băng thứ nhất với các ký tự đã ghi trên băng thứ hai nhưng theo chiều 
ngược lại. 
Rõ ràng, thời gian tính toán đúng bằng độ dài của câu cộng thêm một thời gian 
đọc ký tự # để kết thúc. 
Tồn tại một máy Turing T2 có hai băng nhận biết ngôn ngữ L có chi phí về 
bộ nhớ là S (n) = log2 (n). Máy này tính ghi theo hệ nhị phân trên băng thứ hai số các 
ký tự đã đọc trên băng thứ nhất cho đến khi gặp ký tự C, sau đó kiểm tra số ký tự kế 
tiếp ký tự  này trên băng thứ nhất đúng bằng số ký tự vừa ghi trên băng thứ hai bằng 
cách giảm dần từng ký tự. 
Trường hợp thành công, máy kiểm tra từng đôi ký tự giống nhau cho tới một 
khoảng cách i của ký tự # ở mỗi phía, và kiểm tra tất cả các giá trị i cần thiết. Các giá 
trị này liên tiếp được ghi dưới dạng nhị phân trên băng thứ hai. 
Rõ ràng, không gian nhớ sử dụng trên băng thứ hai được tăng thêm một lượng là 
độ dài của câu dạng nhị phân, hay là logarit cơ số 2 của số nguyên này. 
Độ phức tạp tính toán 95 
Như vậy, đối với các máy Turing không đơn định, có thể định nghĩa theo cách 
tương tự độ phức tạp tính toán không đơn định về thời gian và độ phức tạp tính toán 
không đơn định về bộ nhớ. Chỉ cần định nghĩa các hàm T (n) và S (n), cho trường hợp 
Ln ≠ ∅, như sau: 
T (n) = Maxf∈Ln { độ dài của tính toán ngắn nhất để nhận biết f } 
S (n) = Maxf∈Ln { số các ô đã được thăm trên băng khi tính toán 
 một cách tiết kiệm nhất để nhận biết f } 
Rõ ràng, các định nghĩa đã đưa ra trong trường hợp các máy Turing đơn định chỉ 
là trường hợp đặc biệt của các định nghĩa về tính chất không đơn định này. 
II. Các lớp của độ phức tạp 
(Complexity classes) 
Trong mục trước, ta đã định nghĩa độ phức tạp của một ngôn ngữ cho trước. 
Ngược lại, bây giờ ta có thể xem xét họ các ngôn ngữ có một độ phức tạp đã cho. 
Giả sử f là một hàm tăng, ta có các định nghĩa sau : 
Ký hiệu Ý nghĩa 
DSPACE (f (n)) Họ các ngôn ngữ có độ phức tạp về bộ nhớ S (n) = f (n) 
NSPACE (f (n)) Họ các ngôn ngữ có độ phức tạp không đơn định 
về bộ nhớ S (n) = f (n) 
DTIME (f (n)) Họ các ngôn ngữ có độ phức tạp về thời gian T (n) = f (n) 
NTIME (f (n)) Họ các ngôn ngữ có độ phức tạp không đơn định 
về thời gian T (n) = f (n) 
Tất cả các họ trên được gọi là các lớp của độ phức tạp. Từ các định nghĩa trên, ta 
suy ra rằng : 
DSPACE (f (n)) ⊆ NSPACE (f (n)) 
DTIME (f (n)) ⊆ NTIME (f (n)) 
và, nếu f ≤ g, thì: 
DSPACE (f (n)) ⊆ DSPACE (g (n)) 
NSPACE (f (n)) ⊆ NSPACE (g(n)) 
DTIME (f (n)) ⊆ DTIME (g (n)) 
NTIME (f (n)) ⊆ NTIME (g(n)) 
Giả sử L là ngôn ngữ được cho trong ví dụ 6. 1 trước đây, ta có: 
L ∈ DTIME (n) ∩ DSPACE (log2 (n)), 
nhưng ta cũng có : 
 L ∈ DTIME (n2) ∩ NTIME ( n) ∩ DSPACE (n) 
96 Lý thuyết tính toán 
II.1. Hiện tượng nén 
Giả sử T là một máy Turing có độ phức tạp về bộ nhớ là S(n) = f(n), bằng cách sử 
dụng một bảng chữ trong đó, mỗi ký tự biểu diễn k ký tự liên tiếp của bảng chữ của T, 
ta có thể xây dựng một máy Turing T’ nhận biết cùng ngôn ngữ và có cùng độ phức 
tạp về bộ nhớ là f(n)/k. Máy T’ này mã hóa trên bảng chữ mới thông tin ghi trên mỗi 
một băng làm việc (nhớ rằng không kể không gian nhớ dùng để ghi dữ liệu vào). 
Rõ ràng, nhờ phương pháp này, bằng cách sử dụng một thừa số c không đổi, ta có 
thể giảm bớt độ phức tạp về bộ nhớ để nhận biết một ngôn ngữ đã cho. 
Nếu T là một máy Turing off-line có k băng, ta có thể nhận biết cùng một ngôn 
ngữ bằng cách sử dụng một máy Turing off−line chỉ có một băng, sử dụng cùng một 
phương pháp để không sử dụng không gian nhớ nhiều hơn T. Đối với độ phức tạp về 
bộ nhớ, việc ta giảm bớt số lượng băng làm việc không có nghĩa, cho nên, từ nay, ta 
chỉ xét đến các máy Turing off−line có một băng, thậm chí, trong trường hợp S(n) = 
n, ta chỉ xét các máy Turing có một băng mà không thêm gì nữa. 
Ta cũng có thể áp dụng phương pháp nén vừa trình bày trên đây đối với độ phức 
tạp về thời gian. Tuy nhiên phương pháp này không miễn đọc dữ liệu, mà cần một 
thời gian n + 1 để đọc dữ liệu có độ dài n. Như vậy, ta có thể giảm bớt nhờ một thừa 
số không đổi là c ngay khi T(n)/n có khuynh hướng tăng vô hạn. 
Bây giờ ta xem xét hiệu quả của độ phức tạp về thời gian khi giảm bớt số lượng 
các băng làm việc. 
Khi giảm bớt còn một băng, phân tích phương pháp đã trình bày ở chương 3 để 
chuyển từ k băng về một băng, ta chứng minh được : 
 L ∈ DTIME (T (n)) ⇒ L được thừa nhận bởi một máy Turing một băng 
với chi phí thời gian là T2(n). 
Khi cần thực hiện việc sao chéo, ta có thể chuyển từ một băng sang hai băng 
nhằm làm giảm đáng kể số bước tính toán. Ta chứng minh được rằng việc rút gọn còn 
hai băng thay vì chỉ còn một băng làm tối ưu rõ rệt chi phí về thời gian : 
 L ∈ DTIME (T (n)) ⇒ L được thừa nhận bởi một máy Turing có hai băng 
với thời gian T (n).log2(T (n)) 
Tuy nhiên, để trả lời câu hỏi : 
Với chi phí thời gian nhiều hơn (tương ứng : nhiều bộ nhớ hơn) thì người ta có 
nhận biết được thực sự nhiều ngôn ngữ hơn không ? 
ta có mệnh đề sau đây : 
Mệnh đề 6.1 : 
Với mọi hàm đệ quy toàn phần f, tồn tại một ngôn ngữ đệ quy L không thuộc họ 
DTIME (f (n)) (một cách tương ứng : không thuộc họ DSPACE (f (n))). 
Chứng minh : 
Sử dụng kỹ thuật đường chéo cho ngôn ngữ : 
L = { wi | Ti không thừa nhận câu wi sau f (|wi|) bước tính toán } 
Thật vậy, L là một ngôn ngữ đệ quy không thuộc họ DTIME (f (n)). 
Độ phức tạp tính toán 97 
Giữa các phép đo độ phức tạp tính toán khác nhau này, ta có thể thiết lập các mối 
quan hệ. Một số quan hệ dễ dàng nhận được như sau : 
L ∈ DTIME (f (n)) ⇒ L ∈ DSPACE (f (n)) 
Thật vậy, máy Turing thăm một ô tại mỗi bước tính toán. Trường hợp xấu nhất 
xảy ra khi tất cả các ô đều khác nhau. 
L ∈ DSPACE (f (n)) và f (n) = log2 (n) ⇒ L ∈ DTIME (cf (n)) 
Thật vậy, nếu f (n) = log2 (n), tồn tại một hằng c sao cho cf(n) là lớn hơn số các 
cấu hình phân biệt có độ dài tối đa là f (n) của một máy Turing đã cho. 
L ∈ NTIME (f (n)) ⇒ L ∈ DTIME (cf (n)). 
Thật vậy, quan hệ này đến từ việc tăng thêm số cấu hình phân biệt đối với một dữ 
liệu có độ dài n. Thời gian tăng thêm là cf (n). 
Sau đây là một quan hệ được cho bởi định lý Savitch. 
Định lý Savitch WJ : 
L ∈ NSPACE (f (n)) và f (n) = log2 (n) ⇒ L ∈ DSPACE (f2 (n)). 
II.2. Các họ P, NP và P−bộ nhớ (P−space) 
Các lớp của độ phức tạp tính toán sau đây đủ quan trọng để có tên riêng : 
P = U
1i ≥
DTIME (ni), 
NP = U
1i ≥
NTIME (ni). 
Như vậy : 
P là lớp các ngôn ngữ được nhận biết bởi một máy Turing đơn định 
cần một lượng thời gian bậc đa thức, 
NP là lớp các ngôn ngữ được nhận biết bởi một máy Turing 
không đơn định cần một lượng thời gian bậc đa thức. 
Ta đưa vào các lớp P−bộ nhớ (P−space) và NP−bộ nhớ (NP−space) như sau : 
P−bộ nhớ = U
1i ≥
 DSPACE (ni), 
NP−bộ nhớ = U
1i ≥
 NSPACE (ni). 
P−bộ nhớ là lớp các ngôn ngữ được nhận biết bởi một máy Turing 
đơn định cần một lượng bộ nhớ bậc đa thức, 
NP−bộ nhớ là lớp các ngôn ngữ được nhận biết bởi một máy Turing 
không đơn định cần một lượng bộ nhớ bậc đa thức. 
Rõ ràng ta có đẳng thức : 
98 Lý thuyết tính toán 
P−bộ nhớ = NP−bộ nhớ 
Và ta có các bao hàm sau đây : 
DSPACE (log2 (n)) ⊆ P ⊆ NP ⊆ P−bộ nhớ = NP−bộ nhớ. 
Trong thực tế, người ta ước lượng một bài toán là : 
− xử lý được (tractable), nếu bài toán đó thuộc lớp P 
hay giải được (workable) 
− không xử lý được (untractable), nếu bài toán đó không thuộc lớp P. 
hay không giải được (unworkable) 
Vì vậy, ít khi người ta giải quyết những bài toán cần một lượng thời gian và bộ 
nhớ dạng đa thức có bậc lớn hơn 4 vì sẽ làm tăng độ phức tạp tính toán. 
III. Rút gọn đa thức và các bài toán NP−đầy đủ 
III.1. Khái niệm 
Rút gọn đa thức (polynomial reduction) là làm mịn (refinement) khái niệm rút gọn 
số học đã định nghĩa ở chương 5. Ta vẽ lại sơ đồ rút gọn số học như sau : 
Hình 6.1 Rút gọn bài toán A về bài toán B 
Định nghĩa 6.1 
Người ta nói bài toán A được rút gọn kiểu đa thức về bài toán B nếu tồn tại một 
máy Turing dừng cho mọi dữ liệu và thực hiện tính hàm f hết một lượng thời gian đa 
thức (polynomial time). Hàm f được xác định từ tập hợp các biểu diễn dữ liệu của 
bài toán A vào tập hợp các biểu diễn dữ liệu của bài toán B, thỏa mãn : 
w ∈ LA ⇔ f (w) ∈ LB 
Người ta nói rằng máy Turing này đã thực hiện kiểu đa thức (polynomially work) 
việc rút gọn bài toán A về bài toán B. Từ đó, ta có mệnh đề sau : 
Mệnh đề 6.2 : 
Nếu bài toán A được rút gọn kiểu đa thức về bài toán B, thì nếu B là một bài toán 
thuộc lớp P (một cách tương ứng : thuộc lớp NP), thì A cũng là một bài toán thuộc 
lớp P (một cách tương ứng : thuộc NP). 
Người ta cũng nói rằng các lớp P và NP là đóng đối với phép rút gọn đa thức. 
LPA 
S*\LPA
LPB 
S*\LPB
Anh của f từ các 
biểu diễn dữ liệu của 
bài toán A 
Biểu diễn dữ liệu 
của bài toán B 
Biểu diễn dữ 
liệu của bài 
toán A 
f 
f 
Độ phức tạp tính toán 99 
Chứng minh : 
Thật vậy, giả sử T là một máy Turing luôn luôn dừng và nhận biết ngôn ngữ LB 
một lượng thời gian đa thức. Giả sử T’ là một máy Turing thực hiện việc rút gọn hết 
một lượng thời gian đa thức từ bài toán A về bài toán B. Rõ ràng, máy Turing T’ next 
T luôn luôn dừng và nhận biết ngôn ngữ LA một lượng thời gian đa thức. 
Một cách tương tự, ta định nghĩa khái niệm rút gọn sử dụng bộ nhớ logarit. 
Định nghĩa 6.2 : 
Người ta nói bài toán A được rút gọn về bài toán B cần một lượng bộ nhớ logarit 
nếu tồn tại một máy Turing luôn luôn dừng cho mọi dữ liệu và thực hiện tính hàm f 
sử dụng một lượng bộ nhớ theo logarit. Hàm f được xác định từ tập hợp các biểu 
diễn dữ liệu của bài toán A vào tập hợp các biểu diễn dữ liệu của bài toán B, thỏa 
mãn : 
w ∈ LA ⇔ f (w) ∈ LB 
Ta có mệnh đề sau : 
Mệnh đề 6.3 : 
Lớp P đóng đối với phép rút gọn sử dụng bộ nhớ logarit. 
Việc chuyển một chương trình RAM thành một chương trình của một máy Turing 
được thực hiện sao cho thời gian chạy của máy Turing được tính theo số bước tính 
toán, là một đa thức theo thời gian chạy chương trình của máy RAM được tính theo 
số các lệnh (instructions) đã thực hiện. 
Tương tự, việc chuyển một công thức trong một ngôn ngữ bậc cao thành một công 
thức của một máy RAM được thực hiện sao cho thời gian chạy công thức của máy 
RAM được tính theo số các lệnh của RAM đã thực hiện, là một đa thức về thời gian 
chạy công thức trên ngôn ngữ bậc cao, được tính theo số các lệnh đã thực hiện. 
Từ đó, việc định nghĩa các lớp P và NP được dựa trên mô hình các máy Turing 
nhưng không phụ thuộc chính xác vào mô hình này, và để đảm bảo rằng một ngôn 
ngữ là thuộc một trong hai lớp này, chỉ cần đếm số lượng các phép toán một cách đơn 
giản. 
III.2. Các bài toán cổ điển 
Sau đây là sáu bài toán cổ điển trong Tin học. 
1. Bài toán tô màu các đỉnh của một đồ thị 
Dữ liệu : Một đồ thị G = và một số nguyên k. 
Câu hỏi : Ta có thể tô mỗi đỉnh của đồ thị một màu sao cho cứ hai đỉnh của đồ thị 
được nối với nhau bởi một cung thì không được tô cùng màu được chọn 
trong số k màu ? 
2. Bài toán lập kế hoạch làm việc 
Dữ liệu : Cho n việc và một số nguyên k, mỗi việc được đặc trưng bởi bộ ba các 
số nguyên (ti, di, pi), với ti, di, và pi lần lượt biểu diễn thời gian thực 
hiện, thời gian kết thúc và hình phạt ứng với việc thứ i. 
100 Lý thuyết tính toán 
Câu hỏi : Có thể sắp xếp các việc sao cho tổng số các hình phạt là nhỏ hơn hoặc 
bằng k ? Nói cách khác, với mọi hoán vị P của n số nguyên đầu tiên, ta 
kết hợp một số nguyên : 
Pp = 
p(j)
j 1, n
p (j) p(r)
r 1, j
 P t d 
 0
= =
⎧ ⎡ ⎤= >⎣ ⎦⎪⎨⎪=⎩
∑ ∑nãuú
nãúu khäng
và người ta tìm một hoán vị P nếu hoán vị P tồn tại sao cho Pp = k. 
3. Bài toán sắp xếp trong các thùng chứa 
Dữ liệu : Cho số nguyên c (dung lượng của các thùng), n vật đặc trưng bởi các 
kích thước s1, s2, ..., sn với 0 < si ≤ c và một số nguyên k. 
Câu hỏi : Có thể đặt n vật vào nhiều nhất là k thùng chứa được không ? 
4. Bài toán ba-lô (rucksack) 
Dữ liệu : Cho một số nguyên c (kích thước ba-lô) và n vật có các kích thước lần 
lượt s1, s2, ..., sn. 
Câu hỏi : Có thể bỏ đầy hoàn toàn ba-lô bởi một số vật lấy từ n vật đã cho ? 
5. Bài toán thỏa mãn các biểu thức boolean ở dạng chuẩn hội 
Dữ liệu: Một biểu thức boolean ở dạng chuẩn hội. 
Câu hỏi : Có thể gán giá trị nào đó cho các biến làm biểu thức thỏa mãn ? 
6. Bài toán đường đi Hamilton 
Dữ liệu: Một đồ thị G = . 
Câu hỏi : Tồn tại hay không một đường đi Hamilton (đi qua tất cả các đỉnh) trong 
đồ thị đã cho ? 
III.3. Ví dụ về rút gọn kiểu đa thức 
Bây giờ ta xét một ví dụ : hãy rút gọn kiểu đa thức bài toán ba-lô về bài toán sắp 
đặt các việc có hình phạt. 
Giả sử I = (s1, s2, ..., sn; c) là một dữ liệu vào cho bài toán ba-lô. 
- Nếu c 
n 1, j
s j∑
=
< thì câu trả lời là không. 
Khi đó, ta xét bài toán sắp đặt các việc có hình phạt được định nghĩa bởi 
ti = 2, di = pi = 1 và k = 0 với câu trả lời không. 
- Nếu trái lại, c 
n 1, j
s j∑
=
≥ thì câu trả lời là thoả mãn. 
Ta xét bài toán sắp đặt các việc có hình phạt được định nghĩa bởi ti = pi = si và 
di = c với ∀i = 1 .. n, và k = c 
n 1, j
s j∑
=
− 
Bây giờ ta kiếm tra trường hợp cá biệt I của bài toán ba-lô có một lời giải nếu và 
chỉ nếu bài toán sắp đặt các việc có hình phạt mà ta sẽ đưa về cũng có một lời giải : 
Độ phức tạp tính toán 101 
Nếu bài toán ba-lô có một lời giải, khi đó tồn tại một tập hợp con J thuộc khoảng 
{ 1, ..., n } sao cho ∑j∈J sj = c. Ta chọn một hoán vị P sao cho tất cả các việc có chỉ 
số trong J được chọn trước các việc khác. 
Cả || J || việc này đều được làm xong trước ngày kết thúc của chúng, trong khi đó, 
các việc khác được làm xong sau ngày kết thúc, từ đó sinh ra một hình phạt: 
∑J = || J|| + 1, npP (J) = ∑J = || J|| + 1, n sP (J) 
= ∑J = 1, n J ∈J 
= ∑J = 1, n sJ - c = k 
Như vậy, các việc được làm xong với một hình phạt nhỏ hơn hoặcbằng k, giả sử m 
là số nguyên lớn nhất sao cho m việc đầu tiên được làm xong trước ngày kết thúc 
chung của chúng là c. Như vậy, ta có: ∑J -- 1, m tP(J) ≤ c và hình phạt là : ∑J = m + 1, n 
PP(J) ≤ k 
Do ti = Pi = si, ta có 
∑J - 1, m tP(J)z + ∑J - m + 1, n PP(J) = ∑J - 1,n sJ = c + k 
Do đó, cả hai bất đẳng thức đều bằng nhau và các vật có chỉ số P(j) với 
j = 1..m sẽ làm đầy ba-lô. Ta cần kiểm chứng rằng việc rút gọn là theo thời gian đa 
thức, nghĩa là chỉ có một phép tính duy nhất là tính giá trị ∑J - 1, n sJ - c. 
Rõ ràng phép tính này đòi hỏi một thời gian đa thức. Việc xây dựng bài toán sắp 
đặt các việc có hình phạt sẽ là có thời gian hằng nếu số nguyên này âm, có thời gian 
tuyến tính nếu số nguyên này dương. 
Cho đến lúc này, ta chưa biết có bài toán nào trong sáu bài toán trên thuộc vào lớp 
không P. Tuy nhiên, người ta dễ dàng chứng minh được rằng chúng đều thuộc lớp 
NP. 
Ví dụ 6. 2 
Bài toán tô màu các đỉnh của một đồ thị là thuộc lớp NP. 
Thật vậy, máy Turing không đơn định sau đây nhận biết ngôn ngữ kết hợp với bài 
toán này về thời gian tuyến tính (và do vậy, là đa thức) : trong thời gian đầu, máy 
Turing thực hiện tô cho mỗi đỉnh, một cách không đơn định, một màu nào đó trong số 
k màu. 
Sau đó, máy Turing kiểm tra việc tô màu này đã thỏa mãn chưa, nghĩa là kiểm tra 
tại các mút của các cung xem các đỉnh có cùng một tô một màu không ?. 
Bây giờ ta chứng minh rằng thực tế tất cả sáu bài toán trên đều có thể rút gọn kiểu 
đa thức từ bài toán kia. Từ đó, cả sáu bài toán đều thuộc lớp P nếu và chỉ nếu một 
trong chúng thuộc P. Ta có định nghĩa sau đây : 
Định nghĩa 6.3 
Một bài toán là NP-cứng (NP - Comlete) nếu nó ở trong lớp NP. 
Rõ ràng, định nghĩa trên có ích vì tồn tại những bài toán NP-đầy đủ như vậy. 
102 Lý thuyết tính toán 
Định ký Cook - 1971 (Stephen Cook) : 
Bài toán về tính thỏa mãn của các biểu thức boolean dưới dạng chuẩn hội là một 
bài toán NP -đầy đủ. 
Ta không chứng minh định lý này. 
Bổ đề 6. 1 
Cả sáu bài toán trên đây đều là NP-đầy đủ. 
Ta có mệnh đề sau: 
Mệnh đề 6. 4 
P = NP nếu và chỉ nếu tồn tại ngôn ngữ L ∈ P sao cho L là NP-đầy đủ. 
Bài tập 
1. Xét ngôn ngữ L = { wcw’ | w ∈ { a, b }* và w ≠ w’ } 
Chứng minh rằng L ∈ NTIME (n) ∩ DSPACE (log2 (n)). 
2. Chứng minh rằng cả sáu bài toán đã nêu đều có thể rút gọn kiểu đa thức từ bài 
toán này về bài toán kia. 
3. Một đồ thị được gọi là đầy đủ nếu có hai đỉnh bất kỳ được nối với nhau bới một 
cạnh. Đồ thị được gọi là k-đầy đủ nếu tồn tại một đồ thị con có k đỉnh là đầy đủ. 
Bài toán đầy đủ k-đầy đủ như sau: 
Dữ liệu : Một đồ thị G và một số nguyên k 
Câu hỏi : G có phải là k-đầy đủ? 
Chứng minh rằng bài toán đồ thị k-đầy đủ là bài toán NP đầy đủ. 
4. Những bài toán sau đây thuộc lớp NP, thuộc lớp P, thuộc lớp NP-bộ nhớ ? 
Bài toán nào là NP-đầy đủ ? 
a) Dữ liệu : Một câu w biểu diễn một biểu thức Boolean. 
Câu hỏi : Câu w có phải là một hằng đúng (tautology) không ? 
b) Dữ liệu : Một máy Turing T trên bảng chữ { a, b }. 
Câu hỏi : Có tồn tại không một câu w ∈ S* có độ dài n sao cho máy Turing 
 T nhận biết w hết một lượng thời gian nhỏ hơn boặc bằng n ? 
c) Dữ liệu : Một máy Turing trên bảng chữ { a, b }. 
Câu hỏi : Tồn tại hay không một câu có độ dài n sao cho T nhận biết 
 câu này về bộ nhớ nhỏ hơn hoặc bằng n ? 
d) Dữ liệu : Một cặp đồ thị (G, G’). 
Câu hỏi : Đồ thị G’ có đẳng cấu (isomorphic) với một đồ thị con của G hay 
 không ? 

File đính kèm:

  • pdfgiao_trinh_ly_thuyet_tinh_toan_phan_huy_khanh.pdf