Giáo trình Lý thuyết tính toán

I. Các đối tượng được xử lý trong Tin học

Trong Tin học, các đối tượng (objects) được xử lý thông thường là những

phần tử thuộc vào những tập hợp vô hạn đếm được. Những phần tử này luôn luôn

được biểu diễn (represented) dưới một dạng nào đó.

Chẳng hạn trong ngôn ngữ tự nhiên, số nguyên 1999 được biểu diễn trong hệ

đếm cơ số 10 (hệ thập phân) gồm một dãy bốn chữ số thập phân thuộc bảng chữ

số {0, 1, ., 9}. Việc xử lý (thực hiện các phép toán số học thông thường) đối với

các số nguyên được tiến hành trên cách biểu diễn cơ số 10 này.

Ví dụ : Phép cộng hai số 1999 + 1 = 2000.

Người ta giả thiết rằng các đối tượng được xử lý là những câu (word, hay

sentence) được xây dựng trên một bảng chữ (alphabet) hữu hạn, được xem như là

sự biểu diễn của đối tượng trong một bản chất khác.

Định nghĩa 1.1 :

Một bảng chữ S là một tập hợp hữu hạn các chữ (letters), hay là các ký tự

(symbols, hay characters).

Số lượng các ký tự, còn gọi là bản số (cardinality) hay lực lượng của S, được

ký hiệu ||S||, hay |S|, nếu không sợ nhầm lẫn.

Một câu, hay một từ, trên bảng chữ S đã cho là một dãy hữu hạn các ký tự của

bảng chữ S được viết liên tiếp nhau.

Độ dài (length) của một câu (trên bảng chữ S đã cho) là số lượng các ký tự có

mặt trong câu. Câu rỗng (empty word), được ký hiệu là e (ω hoặc e, hoặc l), là

câu có độ dài không, tức không chứa ký tự nào.

Ghép (concatenation) của hai câu là đặt kế tiếp hai câu đã cho (trên cùng

dòng) để nhận được một câu mới. Bằng cách ghép liên tục như vậy cho mọi ký

tự, mọi câu của S, ta nhận được một tập hợp chứa mọi câu có thể trên S, ký hiệu

S*. Người ta nói S*là một cấu trúc đồng đẳng (nonoide), mà phần tử trung hòa

(neutral element) chính là câu rỗng.

Cho trước một bảng chữ S, người ta định nghĩa một quan hệ có thứ tự toàn

phần (total order) trên S* như sau : cho một thứ tự tùy ý trên các ký tự của S,

người ta sắp xếp các câu theo một thứ tự phân cấp (hierechical order), đầu tiên là

theo độ dài câu, sau đó theo thứ tự từ vựng (lexicography), hay thứ tự ABC.

Giáo trình Lý thuyết tính toán trang 1

Trang 1

Giáo trình Lý thuyết tính toán trang 2

Trang 2

Giáo trình Lý thuyết tính toán trang 3

Trang 3

Giáo trình Lý thuyết tính toán trang 4

Trang 4

Giáo trình Lý thuyết tính toán trang 5

Trang 5

Giáo trình Lý thuyết tính toán trang 6

Trang 6

Giáo trình Lý thuyết tính toán trang 7

Trang 7

Giáo trình Lý thuyết tính toán trang 8

Trang 8

Giáo trình Lý thuyết tính toán trang 9

Trang 9

Giáo trình Lý thuyết tính toán trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 108 trang xuanhieu 14200
Bạn đang xem 10 trang mẫu của tài liệu "Giáo trình Lý thuyết tính toán", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Lý thuyết tính toán

Giáo trình Lý thuyết tính toán
(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.pdf