Tải bản đầy đủ (.doc) (45 trang)

Tiểu luận môn học THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN NP-Completeness

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (531.28 KB, 45 trang )

PHẦN I- TỔNG QUAN
Phần lớn các thuật toán chúng ta đã học là các thuật toán thời gian đa thức
(polynomial-time algorithms) : các dữ liệu vào có kích cỡ n, trường hợp xấu
nhất thời gian chạy là O(n
k
) với một số hằng số k . Đương nhiên điều kỳ diệu khi
mà tất cả các bài toán có thể giải được bằng thời gian đa thức. Câu trả lời là
không. Chẳng hạn, đó là các bài toán, như “bài toán Halting“ nổi tiếng của
Turing, không thể giải được bằng bất kỳ máy tính nào, không vấn đề gì về việc
mất thời gian đã cung ứng. Cũng có các bài toán có thể giải được nhưng không
phải với thời gian O(n
k
) với bất kỳ hằng số k. Tóm lại, chúng ta nghỉ rằng các bài
toán có thể giải được bằng các thuật toán thời gian đa thức là dễ vận dụng và các
bài toán đòi hỏi thời gian siêu đa thức là khó vận dụng.
Chủ đề của chương này là một lớp các bài toán thú vị được gọi là các bài
toán “NP-đầy đủ (NP-complete)". Thuật toán không đa thức vẫn chưa được
khám phá cho một bài toán NP-đầy đủ, không có một bài toán NP-đầy đủ nào có
thể chứng minh rằng thuật toán không đa thức có thể tồn tại đối với bất kỳ bài
toán nào. P ≠ NP ? , hầu hết sự lúng túng mở ra nghiên cứu các bài toán bằng
khoa học máy tính lý thuyết đã đưa ra vào năm 1971.
Một khía cạnh khó khăn riêng của các bài toán NP-đầy đủ là xem chúng
giống như các bào toán mà có các thuật toán đa thức thời gian. Trong mỗi cặp
của bài toán, một là có thể giải được bằng thời gian đa thức và mặc khác là NP-
đầy đủ, nhưng sự khác nhau không đáng kể giữa các bài toán xuất hiện trong :
* Các đường đi đơn dài nhất và ngắn nhất (Shortest vs. longest simple
paths) : chúng ta thấy rằng, chúng ta có thể tìm thấy các đường đi ngắn nhất từ
một nguồn đơn trong một đồ thị có hướng G = (V, E) với thời gian O(V E). Kết
thúc đường đi đơn dài nhất giữ hai đỉnh là khó.
* Vòng Hamilton và Euler (Euler tour vs. hamiltonian cycle) : An
vòng Euler của một kết nối của đồ thị có hướng G = (V, E) là một vòng đi


ngang qua mỗi đỉnh của G chính xác một lần, mặc dù nó có thể thăm một đỉnh
hơn một lần. Chúng ta có thể tìm thấy các cạnh của vòng Euler với thời gian
O(E). Một vòng Hamilton của một đồ thị có hướng G = (V, E) là một vòng đơn
mà chứa mỗi đỉnh trong V. Xác định khi một đồ thị có hướng có một vòng
Hamilton là NP-đầy đủ.
* Thỏa được 2-CNF và 3-CNF (2-CNF satisfiability vs. 3-CNF
satisfiability) : Một công thức boolean bao gồm các biến mà các giá trị là 0 hoặc
1; boolean liên kết như ∧ (AND), ∨ (OR), and ¬ (NOT); and parentheses. Một
công thức boolean là thỏa được nếu có một vài chỉ định của các giá trị 0 và 1 đến
các biến của nó mà do nó định gía đến 1. Chúng ta sẽ định nghĩa các thuật ngữ
hình thức hơn sau chương này, nhưng không hình thức, một công thức boolean
là trong k conjunctive normal form, hoặc k-CNF, nếu nó là AND của các mệnh
đề OR của chính xác k các biến hoặc các phủ định của chúng. Ví dụ, một công
___________________
NP-đầy đủ 1
thức boolean (x
1
∨ ¬x
2
) ∧(¬x
1
∨ x
3
) ∧ (¬x
2
∨¬x
3
) là trong 2-CNF. (Nó có chỉ
định thỏa được x
1

= 1, x
2
= 0, x
3
= 1). Đó là một thuật toán thời gian đa thức để
xác định khi một công thức 2-CNF thỏa được, nhưng như chúng ta sẽ thấy ở
chương này, sự xác định khi một công thức 3-CNF thỏa mãn là NP-đầy đủ.
Các lớp P, NP và NP-đầy đủ :
Qua chương này, chúng ta sẽ đề cập đến 3 lớp bài toán : P, NP và NPC,
lớp cuối cùng là các bài toán NP-đầy đủ. Chúng ta mô tả các thông tin này và sẽ
định nghĩa chúng một cách hình thức như sau :
* Lớp P chứa các bài toán có thể giải được bằng thời gian đa thức. Đặc
biệt hơn, chúng là các bài toán có thể giải được với thời gian O(n
k
) với một số
hằng số k, mà n là kích cỡ đặt vào của bào toán.
* Lớp NP chứa các bài toán có thể “xác minh (verifiable)" bằng thời gian
đa thức. v
|V|
> Nghĩa là nếu chúng ta đưa ra một "certificate" của một giải pháp,
thì chúng ta có thể xác minh rằng “certificate” đó là đúng với thời gian đa thức
với kích cỡ đặt vào của bài toán. Chẳng hạn, trong bài toán vòng Hamilton, cho
một đồ thị có hướng G = (V, E), một certificate có thể là một chuỗi <v
1
, v
2
, v
3
, ,
của các cạnh |V|. Dễ dàng kiểm tra bằng thời gian đa thức mà (v

i
, v
i+1
) ∈E với i =
1, 2, 3, , |V| - 1 và (v
|V|
, v
1
) ∈E. Một ví dụ khác, đối với thỏa được 3-CNF, một
certificate có thể sẽ là một chỉ định của các giá trị đến các biến. Chúng ta có thể
dễ dàng kiểm tra bằng thời gian đa thức mà chỉ định này thỏa được công thức
boolean. Bất kỳ bài toán nào thỏa được trong P thì cũng thỏa được trong NP, nếu
khi một bài toán thỏa được trong P thì có thể giải được nó trong thời gian đa thức
ngay cả khi không bị đưa ra một certificate. Chúng ta sẽ chính thức hóa khái
niệm này sau chương này, nhưng bây giờ chúng ta có thể tin rằng P ⊆ NP. Câu
hỏi đặt ra là liệu có hay không có P là một tập con thích hợp của NP. Thật tình,
một bài toán nằm trong lớp NPC và chúng ta đề cập đến nó như là NP-đầy đủ -
nếu nó nằm trong NP và nó như là “khó” như đối với bất kỳ bài toán nào trong
NP. Chúng ta sẽ định nghĩa một cách hình thức nó có nghĩa sẽ khó như bất kỳ
bài toán nào trong NP trong chương này. Trong khi đó, chúng ta sẽ phát biểu mà
không chứng minh nếu bất kỳ bài toán NP-đầy đủ có thể giải được bằng thời
gian đa thức thì mỗi bài toán NP-đầy đủ có một thuật toán thời gian đa thức.
Phân lớn các nhà khoa học máy tính lý thuyết tin rằng các bài toán NP-đầy đủ đó
là khó vận dụng, khi đưa ra nhiều bài toán NP-đầy đủ mà đã nghiên cứu cho đến
nay- không có một nghiên cứu nào khám phá được một giải pháp thời gian đa
thức- nó sẽ làm kinh ngạc thật sự nếu tất cả chúng có thể giải được bằng thời
gian đa thức. Tuy nhiên, đưa ra nổ lực còn quá xa để chứng minh rằng các bài
toán NP-đầy đủ là khó vận dụng- không có một kết luận lôgic- chúng ta không
thể loại trừ khả năng mà các bài bài toán NP-đầy đủ trong thực tế là có thể giải
được bằng thời gian đa thức. Để trở thành một người thiết kế thuật toán giỏi, bạn

phải hiểu các nguyên lý cơ bản của lý thuyết NP-đầy đủ. Nếu bạn có thể thiết lập
___________________
NP-đầy đủ 2
một bài toán như NP-đầy đủ, bạn đưa ra bằng chứng tốt cho tính khó vận dụng
của nó. Như một kỹ sư, bạn sẽ sử dụng tốt hơn thời gian của bạn cho việc phát
triển một thuật toán xấp xỉ hoặc việc giải quyết một trường hợp đặc biệt dễ vận
dụng khá hơn việc tìm kiếm cho một thuật toán nhanh mà giải quyết bài toán
một cách chính xác. Hơn nữa, nhiều bài toán hấp dẫn nhường như không khó
hơn việc phân loại, nghiên cứu đồ thị hoặc mạng máy tính chảy vào trong NP-
đầy đủ. Vì thế, nó quan trọng trở nên quen với lớp các bài toán đặc biệt này.

Khái quát các bài toán NP-đầy đủ :
Các phương pháp kỹ thuật chúng ta sử dụng để biểu diễn một bài toán
riêng biệt là NP-đầy đủ khác với các phương pháp kỹ thuật đã sử dụng qua hầu
hết cuốn sách này để thiết kế và phân tích các thuật toán. Có một lý do cơ bản
cho sự khác biệt này là : trong cách biểu diễn một bài toán sẽ là NP-đầy đủ,
chúng ta làm một phát biểu về cách nó là khó không theo cách dễ. Chúng ta
không cố gắng chứng tỏ tình trạng của một thuật toán hiệu quả, nhưng cố gắng
hơn rằng thuật toán không hiệu quả là tồn tại như nhau. Chúng ta dựa vào 3 khái
niệm chính để biểu diễn một bài toán sẽ là NP-đầy đủ :
* Các bài toán quyết định và các bài toán tối ưu :
Nhiều bài toán thú vị là các bài toán tối ưu (optimization problems), bằng
cách mỗi giải pháp khả thi có một giá trị phù hợp và chúng ta mong ước tìm một
giải pháp khả thi với giá trị tốt nhất. Chẳng hạn, trong một bài toán mà chúng ta
gọi đường đi ngắn nhất (SHORTEST-PATH), chúng ta cho một đồ thị vô hướng
G và các đỉnh u và v, chúng ta mong ước tìm đương đi từ u đến v mà sử dụng các
cạnh ít nhất. NP-đầy đủ áp dụng trực tiếp không tối ưu hóa các bài toán. Tuy
nhiên, để các bài toán quyết định, câu trả lời là đơn giản "có" hoặc "không". Mặc
dù biểu diễn cho thấy rằng một bài toán là NP-đầy đủ giới hạn chúng ta đến lĩnh
vực của các bài toán quyết định, đó là một mối quan hệ thuận tiện giữa các bài

toán tối ưu và các bài toán quyết định. Chúng ta thường có thể gieo một bài toán
tối ưu như một bài toán bài toán quyết định liên kết bởi một giới hạn trên giá trị
sẽ bị tối ưu. Ví dụ, đối với đường đi ngắn nhất (SHORTEST-PATH), một bài
toán quyết định liên kết mà chúng ta gọi ĐƯỜNG ĐI (PATH), là khi, cho một
đồ thị có hướng G, các đỉnh u và v, và một số nguyên k, một đường đi tồn tại từ
u đến v bao gồm tất cả k cạnh. Mối quan hệ giữa một bài toán tối ưu và bài toán
quyết định liên kết của nó làm việc trong sự ủng hộ của chúng ta khi chúng ta cố
gắng chỉ ra rằng bài toán tối ưu là “khó”. Bởi vì bài toán quyết định là dùng
trong một bối cảnh “dễ” hoặc ít nhất “không khó". Như một ví dụ đặc biệt,
chúng ta có thể giải quyết ĐƯỜNG ĐI (PATH) bằng cách giải quyết ĐƯỜNG
ĐI NGẮN NHẤT(SHORTEST-PATH) và sau đó so sánh số các cạnh trong
đường đi ngắn nhất tìm thấy đến giá trị của bài toán quyết định tham số k. Nói
cách khác, nếu một bài toán tối ưu là dễ, bài toán quyết định liên kết nó cũng là
dễ. Bắt đầu bằng một phương pháp mà có nhiều liên quan đến NP-đầy đủ, nếu
chúng ta có thể cung cấp bằng chứng mà một bài toán quyết định là khó, chúng
___________________
NP-đầy đủ 3
ta cũng cung cấp bằng chứng mà bài toán tối ưu liên kết nó là khó. Vì thế, ngay
cả khi nó giới hạn sự chú ý đến các bài toán quyết định, lý thuyết của NP-đầy đủ
thường liên quan đến nhiều các bài toán tối ưu.
* Các phép rút gọn (Reductions) :
Khái niệm trên cho thấy rằng một bài toán là không khó hoặc không dễ
hơn các ứng dụng khác thậm chí khi cả hai bài toán là các bài toán quyết định.
Chúng ta dẫn thuận tiện của ý kiến này tại phần lớn mỗi chứng minh NP-đầy đủ,
như sau : Chúng ta hãy xem như là một bài toán quyết định A, mà chúng ta sẽ
giải quyết trong thời gian đa thức. Chúng ta gọi dữ liệu vào đến một bài toán
riêng biệt một trường hợp của vấn đề đó; chẳng hạn, trong ĐƯỜNG ĐI (PATH),
một instance có thể là một đồ thị đặc biệt G, các cạnh đặc biệt u và v của G và
một số nguyên đặc biệt k. Bây giờ cho rằng đó là một bài toán quyết định khác
biệt B, mà chúng ta sẵn sàng biết cách để giải quyết bằng thời gian đa thức. Cuối

cùng , cho rằng chúng ta có một thủ tục mà biến đổi mất kỳ instance
α
của A vào
một số instance
β
của B theo các tính chất sau :
1. Sự biến đổi theo thời gian đa thức.
2. Các trả lời là như nhau. Đó là, trả lời cho
α
is "có" khi và chỉ khi trả lời
cho
β
cũng là "có."
Hình 1. Dùng một thuật toán rút gọn thời gian đa thức để giải quyết một bài toán quyết định A trong thời gian đa
thức, cho một thuật toán quyết định thời gian đa thức đối với bài toán B khác. Bằng thời gian đa thức, chúng ta biến đổi một
trường hợp
α
của A vào một
β
của B, chúng ta giải quyết B bằng thời gian đa thức và sử dụng trả lời đối với
β
như trả lời đối
với
α
.
Chúng ta gọi một thủ tục như thế là một thuật toán rút gọn (reduction
algorithm) thời gian đa thức và, như hình 1., biểu diễn nó cung cấp cho chúng
ta một cách để giải quyết bài toán A bằng thời gian đa thức :
a. Cho một instance
α

của bài toán A, sử dụng một thuật toán rút gọn thời
gian đa thức để biến đổi nó đến một instance
β
của bài toán B.
b. Chạy thuật toán quyết định thời gian đa thức cho B trong instance
β
.
c. Sử dụng trả lời cho
β
như trả lời cho
α
.
Theo mỗi bước mất thời gian đa thức , tất cả ba bước cùng thực hiện, vì
thể chúng ta có một cách để quyết định trên
α
trong thời gian đa thức. Nói cách
khác, bằng việc rút gọn giải quyết bài toán A để giải quyết bài toán B, chúng ta
sử dụng tính “dễ thuyết phục (easiness)" của B để chứng minh tính đễ thuyết
___________________
NP-đầy đủ 4
phục của A. Sự lấy lại mà NP-đầy đủ là cách biểu diễn một bài toán khó hơn một
bài toán dễ, chúng ta sử dụng các phép rút gọn thời gian đa thức trong cách trái
ngược để biểu diễn một bài toán là NP-đầy đủ. Chúng ta hãy lấy ý tưởng một
bước xa hơn và biểu diễn cách chúng ta có thể sử dụng các phép rút gọn thời
gian đa thức để biểu diễn rằng không một thuật toán thời gian đa thức có thể tồn
tại cho một bài toán đặc biệt B. Cho rằng chúng ta có một bài toán quyết định A
mà chúng ta luôn biết rằng thuật toán thời gian không đa thức có thể tồn tại. Bây
giờ chúng ta có thể sử dụng một chứng minh đơn giản bởi sự trái ngược để chỉ ra
rằng thuật toán thời gian không đa thức có thể tồn tại cho B. Mặc khác cho rằng,
B có một thuật toán thời gian đa thức. Sau đó, sử dụng phương pháp biểu diễn ở

hình 1, chúng ta sẽ có một cách để giải quyết bài toán A bằng thời gian đa thức,
mà các trái ngược của chúng ta đều được chấp nhận là đúng mà có thuật toán
thời gian không đa thức cho A. Đối với NP-đầy đủ, chúng ta không thể thừa nhận
rằng hoàn toàn có một thuật toán thời gian không đa thức cho A. Phương pháp
chứng minh là tương tự, tuy nhiên, trong đó chúng ta chứng minh rằng bài toán
B là NP-đầy đủ trên sự tuyệt đối mà bài toán A cũng là NP-đầy đủ.
Một bài toán NP-đầy đủ đầu tiên (A first NP-complete problem) :
Vì kỹ thuật rút gọn dựa trên một bài toán có sẵn biết NP-đầy đủ để chứng
minh một bài toán NP-đầy đủ khác, chúng ta cần một bài toán NP-đầy đủ đầu
tiên. Bài toán đó chúng ta sẽ sử dụng là bài toán thỏa được mạch (circuit-
satisfiability problem), mà chúng ta đã cho một mạch kết nối giá trị (boolean
combinational circuit) gồm có các cổng VÀ (AND), HOẶC (OR) và cổng PHỦ
ĐỊNH (NOT), chúng ta ước khi mà có bất kỳ tập giá trị các dữ liệu vào đến mạch
này mà các lý do các dữ liệu ra của nó là 1. Chúng ta sẽ chứng minh rằng bài
toán đầu tiên này là NP-đầy đủ trong phần III.
___________________
NP-đầy đủ 5
PHẦN II- ĐỀ CƯƠNG
Chương này chúng ta nghiên cứu các khía cạnh của NP-đầy đủ dựa vào sự
phân tích các thuật toán. Gồm 5 phần :
1) Chúng ta chú ý đến khái niệm của “bài toán (problem)” và định nghĩa độ
phức tạp lớp P của thời gian đa thức có thể giải được các bài toán. Chúng ta cũng
xem xét các khái niệm này có phù hợp với khung (framework) của lý thuyết
ngôn ngữ hình thức (formal) hay không ?.
2) Định nghĩa lớp NP của các bài toán thỏa được mà các giải pháp có thể
thực hiện bằng thời gian đa thức. Từ đó đặt ra câu hỏi P ≠ NP không ?.
3) Biểu diễn các quan hệ giữa các bài toán có thể nghiên cứu qua thời gian
đa thức “các phép rút gọn”. Nó định nghĩa NP-đầy đủ và phát thảo một chứng cứ
mà một bài toán được gọi là NP-đầy đủ “ thỏa được mạch” (“circuit
satisfiability“). Tìm một bài toán NP-đầy đủ.

4) Biểu diễn các bài toán khác có thể chứng minh NP-đầy đủ đơn giản bằng
phương pháp luận của các phép rút gọn. Phương pháp luận này đã được minh
hoạ bằng cách biểu diễn hai bài toán thoả được công thức là NP-đầy đủ.
5) Sự đa dạng của các bài toán chỉ ra NP-đầy đủ.
1. THỜI GIAN ĐA THỨC (POLYNOMIAL TIME) :
Chúng ta bắt đầu nghiên cứu NP-đầy đủ bằng khái niệm của thời gian đa
thức có thể giải quyết được các bài toán. Nhìn chung các bài toán này đã đề cập
là dễ vận dụng đối với Triết học chứ không phải Toán học, bởi các lý do. Chúng
ta có thể đưa ra 3 tranh luận phụ :
- Thứ nhất, mặc dù đó là lý do để đề cập một bài toán yêu cầu thời gian
θ(n
100
) là khó , đó là một số bài toán thực tiễn mà yêu cầu thời gian theo thứ tự
như một đa thức bậc cao. Thời gian đa thức có thể tính các bài toán đã được bắt
gặp trong thực tiễn hoàn toàn tiêu biểu đòi hỏi mất ít thời gian cho một bài toán
là đã được khám phá ra hơn hiệu quả các thuật toán thường cho phép. Thậm chí
nếu hiện tại thuật toán cho một bài toán có thời gian chạy tốt hơn sẽ sớm được
tìm ra.
- Thứ hai, đối với nhiều mô hình lý do của sự tính toán, một bài toán có
thể đã được giải quyết bằng thời gian đa thức trong một mô hình này có thể được
giải quyết bằng thời gian đa thức trong một mô hình khác. Ví dụ, lớp các bài
toán thỏa được trong thời gian đa thức bằng dãy số ngẫu nhiên truy cập máy đã
được sử dụng qua hầu hết trong cuốn sách này là giống lớp các bài toán có thể
giải quyết trong thời gian đa thức trên máy Turing trừu tượng. Nó cũng giống
lớp bài toán có thể giải quyết bằng thời gian đa thức trong một máy tính song
song khi số các quá trình tăng đa thức với kích cỡ đặt vào.
___________________
NP-đầy đủ 6
- Thứ ba, lớp thời gian đa thức có thể giải quyết các bài toán có các thuộc
tính đóng, vì các đa thức đã đóng dưới phép cộng, phép nhân và phép hợp. Ví

dụ, nếu lấy(đầu ra) ra một thuật toán thời gian đa thức dẫn vào một thuật toán
thời gian đa thức khác, thuật toán đa hợp này là đa thức. Nếu một thời gian đa
thức khác tạo một hằng số gọi đến thời gian đa thức các thủ tục con, thời gian
chạy của thuật toán đa hợp là đa thức.
1.1. Các bài toán trừu tượng (Abstract problems) :
Để hiểu lớp thời gian đa thức có thể giải quyết các bài toán, trước hết chúng
ta phải có một khái niệm hình thức của một “bài toán” là gì? Chúng ta định nghĩa
một bài toán trừu tượng Q là một quan hệ nhị phân trên một tập I của bài toán
các trường hợp (instance) và một tập S các giải pháp của bài toán.
Chẳng hạn, một trường hợp đối với đường đi ngắn nhất là một bộ ba chứa 1
đồ thị và 2 đỉnh. Một giải pháp là một dãy các đỉnh trong đồ thị, có thể biểu thị
dãy rỗng mà không tồn tại đường đi. Bài toán đường đi ngắn nhất chính nó là
quan hệ phù hợp với mỗi trường hợp của một đồ thị kết nối 2 đỉnh. Vì các đường
đi ngắn nhất này là không nhất thiết phải duy nhất, một bài toán trường hợp đã
cho có thể có hơn một giải pháp.
Phát biểu có hệ thống này của một bài toán trừu tượng là quá bình thường
đến nỗi đã qui định cho các mục đích của chúng ta. Như trên, lý thuyết NP-đầy
đủ giới hạn sự chú ý đến các bài bài toán thỏa được : có một giải pháp có/
không. Trong trường hợp này, chúng ta có thể thấy một bài toán trừu tượng thỏa
được như một hàm mà các ánh xạ trường hợp từ tập I đến giải pháp tập {0,1}.
Ví dụ, một bài toán thỏa được liên quan đến đường đi ngắn nhất (SHORTEST-
PATH) là bài toán đường đi mà chúng ta thấy trước đây. Nếu i= <G, u, v, k> là
một trường hợp bài toán đường đi thỏa được, sau đó PATH (i) = 1 (yes) nếu một
đường đi ngắn nhất từ u đến v có tại hầu hết k cạnh và ngược lại PATH (i) = 0
(no). Nhiều bài toán trừu tượng không thỏa được các bài toán nhưng tối ưu hơn
các bài toán, mà một vài giá trị đều phải nhỏ nhất hoặc lớn nhất. Tuy nhiên, như
chúng ta thấy ở trên, điều đó thường là một bài toán đơn giản để viết lại một bài
toán tối ưu như một bài toán thỏa được là không khó hơn.
1.2. Các mã hóa (encodings) :
Nếu một chương trình máy tính giải quyết một bài toán trừu tượng, bài toán

các trường hợp phải được trình bày bằng một cách mà chương trình dễ hiểu. Một
mã hóa của một tập S của các đối tượng trừu tượng là một ánh xạ e từ S đến tập
của các chuỗi nhị phân. Ví dụ, chúng ta làm quen với mã hóa các số tự nhiên N =
{0,1,2,3,4, } như các chuỗi { 0,1,10,11,100, }. Sử dụng mã hóa này, e(17) =
10001. Bất cứ một ai có thể nhìn vào máy tính đại diện bởi các ký tự trên bàn
phím là quen với bảng mã ASCII hoặc EBCDIC. Trong bảng mã ASCII, mã hóa
của A là 1000001. Thậm chí một đối tượng ghép có thể được mã hóa như một
chuỗi nhị phân bằng cách kết nối các đại diện của các bộ phận cấu tạo của nó.
___________________
NP-đầy đủ 7
Các hình đa giác, các đồ thị, các hàm, các cặp có thứ tự, các chương trình- Tất cả
có thể mã hóa như các chuỗi nhị phân.
Vì thế, một thuật toán máy tính mà “giải quyết” một vài bài toán trừu tượng
thỏa được thực sự lấy một mã hóa của một bài toán trường hợp như dữ liệu vào.
Chúng ta gọi một bài toán mà tập trường hợp là tập của các chuỗi nhị phân một
bài toán cụ thể. Chúng ta nói rằng một thuật toán giải quyết một bài toán cụ thể
với thời gian O(T(n)) nếu khi đó nó đã qui định một bài toán trường hợp i của
độ dài n = |i|, thuật toán này có thể kéo dài giải pháp với thời gian O(T(n)). Một
bài toán cụ thể có thể giải quyết thời gian đa thức, vì thế, nếu tồn tại một thuật
toán để giải quyết nó với thời gian O(n
k
) cho một vài hằng số k.
Bây giờ chúng ta có thể định nghĩa hình thức độ phức tạp lớp P như tập
các bài toán thỏa được cụ thể là có thể giải quyết được thời gian đa thức.
Chúng ta có thể sử dụng mã hóa để ánh xạ các bài toán trừu tượng đến các
bài toán cụ thể. Đưa ra một một bài toán trừu tượng thỏa được Q ánh xạ một
trường hợp tập I đến {0,1}, một mã hóa e: I → {0,1}* có thể được dùng để đem
lại một quan hệ bài toán thỏa được cụ thể, mà chúng ta biểu thị bởi e(Q). Nếu
giải quyết một bài toán trừu tượng trường hợp i thuộc I là Q(i) ∈ {0,1}, sau đó
giải quyết đến bài toán thỏa được cụ thể trường hợp e(i) ∈{0,1}* cũng là Q(i).

Như một bài toán chuyên môn, có thể một số chuỗi nhị phân đại diện bài toán
trừu tượng trường hợp không có nghĩa. Để thuận tiện, chúng ta sẽ thừa nhận rằng
bất kỳ chuỗi nào đã ánh xạ tùy ý đến 0. Vì thế, bài toán cụ thể kéo dài các giải
pháp như bài toán trừu tượng trên các trường hợp chuỗi nhị phân mà đại diện các
mã hóa của các trường hợp bài toán trừu tượng.
Chúng ta hãy mở rộng định nghĩa của thời gian đa thức có thể giải quyết
được từ các bài toán cụ thể đến các bài toán trừu tượng bằng cách sử dụng các
mã hóa như cầu nối nhưng chúng ta sẽ định nghĩa độc lập bất kỳ mã hóa riêng
biệt. Đó là, khả năng giải quyết một bài toán không nên phụ thuộc vào cách mã
hóa bài toán. Một cách đáng tiếc, nó phụ thuộc khá nhiều vào việc mã hóa.
Chẳng hạn, cho rằng một số nguyên k đã được cung cấp như đặt dữ liệu vào một
thuật toán và cho rằng thời gian chạy của thuật toán là θ(k). Nếu số nguyên k đã
đưa ra in unary một chuỗi k 1’s- sau đó thời gian chạy của thuật toán là O(n)
bằng độ dài n đặt vào, là thời gian đa thức. Tuy nhiên nếu chúng ta sử dụng nhị
phân đại diện của số nguyên k, sau đó đặt vào độ dài là n=[lg k ] + 1. Trong
trường hợp này, thời gian chạy của thuật toán là θ(k) = θ(2
n
), là số mũ tại kích cỡ
của dữ liệu vào. Vì thế, sự phụ thuộc vào việc mã hóa, thuật toán chạy hoặc bằng
thời gian đa thức hoặc bằng thời gian siêu đa thức.
Việc mã hóa của một bài toán trừu tượng là khá quan trọng để chúng ta hiểu
thời gian đa thức. Chúng ta thực sự không thể nói về việc giải quyết một bài toán
trừu tượng mà không chỉ rõ một mã hóa đầu tiên. Việc mã hóa thực sự của một
bài toán tạo ra một vài sự khác biệt đối với bài toán mà có thể đã giải quyết bằng
thời gian đa thức. Chẳng hạn, đại diện các số nguyên trong đường đáy 3 thay vì
___________________
NP-đầy đủ 8
nhị phân không ảnh hưởng khi một bài toán có thể giải quyết bằng thời gian đa
thức, vì một số nguyên đã được trình bày trong đường đáy 3 có thể chuyển đến
một số nguyên đã được trình bày trong đường đáy 2 bằng thời gian đa thức.

Chúng ta nói rằng một hàm số f : {0, 1}* → {0, 1}* là có thể tính thời gian
đa thức nếu nó tồn tại một thuật toán thời gian đa thức A mà, cho bất kỳ dữ liệu
vào x∈{0, 1}*, kéo dài như đưa ra f(x) . Đối với một số tập I của bài toán các
trường hợp, chúng ta nói rằng 2 mã hóa e
1
và e
2
là đa thức quan hệ với nhau nếu
chúng tồn tại 2 hàm có thể tính toán được đa thức thời gian f
12
và f
21
như đối với
bất kỳ i ∈ I , chúng ta có f
12
(e
1
(i)) = e
2
(i) và f
21
(e
2
(i)) = e
1
(i). Đó là, mã hóa e
2
(i)
có thể đã tính từ việc mã hóa e
1

(i) bằng một thuật toán thời gian đa thức và
ngược lại. Nếu hai mã hóa e
1
và e
2
của một bài toán trừu tượng là đa thức quan
hệ, thì bài toán đó là thời gian đa thức có thể giải quyết hoặc không là độc lập
việc mã hóa chúng ta dùng như theo các biểu diễn bổ đề.
Bổ đề 1 : Lấy Q là một bài toán trừu tượng thỏa được trên một trường hợp tập I,
cho e
1
và e
2
là đa thức quan hệ mã hóa trên I. Thì, e
1
(Q)∈P khi và chỉ khi
e
2
(Q)∈P.
Chứng minh :
Chúng ta chỉ cần chứng tỏ hướng tiếp tới, khi lùi lại là đối xứng. Vì thế, cho
rằng, e
1
(Q) có thể đã giải quyết với thời gian O(n
k
) cho một vài hằng số k . Hơn
nữa, cho rằng đối với bất kỳ bài toán trường hợp i, việc mã hóa e
1
(i) có thể đã
được tính từ việc mã hóa e

2
(i) với thời gian O(n
c
) đối với một vài hằng số c, tại
n=|e
2
(i)|. Để giải quyết bài toán e
2
(Q), trên dữ liệu vào e
2
(i), đầu tiên chúng ta
tính e
1
(i) và sau đó chạy thuật toán cho e
2
(Q) trên e
2
(i). Mất thời gian bao lâu để
chạy thuật toán đó? Thảo luận của các mã hóa mất thời gian O(n
c
) và vì thế |
e
1
(i)| = O(n
c
), khi đưa ra một dãy tính không thể dài hơn thời gian chạy của nó.
Giải quyết bài toán trên e
1
(i) mất thời gian O(|e
1

(i)|
k
) = O(n
ck
), là đa thức khi cả c
và k là các hằng số.
Vì thế, khi một bài toán trừu tượng có các trường hợp của nó đã mã hóa
bằng nhị phân hoặc đường đáy 3 không ảnh hưởng đến “độ phức tạp” của nó, đó
là khi nó là thời gian đa thức có thể giải quyết hoặc không, nhưng nếu các trường
hợp đã mã hóa trong, độ phức tạp của nó có thể thay đổi. Để có thể nghịch đảo
một kiểu mã hóa độc lập, tổng quát hoá chúng ta sẽ thừa nhận bài toán này các
trường hợp đã mã hóa bằng bất cứ lý do nào, kiểu ngắn gọn, đặc biệt trừ khi
chúng ta nói cách khác. Để thực hành, chúng ta sẽ thừa nhận mã hóa của một số
nguyên này là đa thức quan hệ với nó mã hóa như một liệt kê các thành phần của
nó, đã mã hóa trong các đôi và đã phân cách bởi dấu phẩy (dấu ngoặc kép).
(ASCII là một giản đồ mã hóa). Với một “chuẩn” mã hóa bằng tay, chúng ta có
thể lấy được từ lý do mã hóa của các đối tượng toán học, các đồ thị và các công
thức. Để biểu thị chuẩn mã hóa của một đối tượng, chúng ta sẽ mã hóa đối tượng
đó bằng góc các đôi. Vì thế, <G> biểu thị chuẩn mã hóa của một đồ thị G.
___________________
NP-đầy đủ 9
Về sau chúng ta hoàn toàn dùng một mã hóa là đa thức đã quan hệ với
chuẩn mã hóa này, chúng ta có thể nói một cách hướng về các bài toán trừu
tượng không tham chiếu đến bất kỳ mã hóa riêng biệt nào, biết rằng việc chọn
mã hóa không ảnh hưởng đến bài toán trừu tượng là thời gian đa thức có thể giải
quyết được. Tóm lại, từ nay về sau, chúng ta sẽ thừa nhận tất cả bài toán các
trường hợp là các chuỗi nhị phân đã mã hóa dùng chuẩn mã hóa, trừ khi chúng ta
định rõ ràng điều trái ngược. Chúng ta sẽ không chú ý sự khác biệt này giữa các
bài toán trừu tượng và cụ thể. Người đọc nên xem các bài toán mà xuất hiện
trong thực tiễn, tuy nhiên, bằng một chuẩn mã hóa là không rõ ràng và việc mã

hóa là khác nhau.
1.3. Một khung ngôn ngữ hình thức (A formal-language frameword) :
Một trong những khía cạnh thuận tiện tiêu điểm dựa trên các bài toán thỏa
được là làm cho nó dễ sử dụng máy móc của lý thuyết ngôn ngữ hình thức. Điều
quan trọng tại điểm này để xem lại một số các định nghĩa từ lý thuyết đó. Một
bảng chữ cái Σ là một tập hạn chế các biểu tượng. Một ngôn ngữ L c với Σ là
tập các chuỗi bất kỳ được tạo bởi các biểu tượng từ Σ. Ví dụ, nếu Σ = {0, 1}, tập
L = {10, 11, 101, 111, 1011, 1101, 10001, } là ngôn ngữ của các đại diện nhị
phân của các số hàng đầu. Chúng ta biểu thị chuỗi rỗng bởi ε và ngôn ngữ rỗng
bởi ∅. Ngôn ngữ của tất cả các chuỗi qua Σ là biểu thị Σ*. Chẳng hạn, nếu Σ =
{0, 1}, sau đó Σ* = {ε, 0, 1, 00, 01, 10, 11, 000, } là tập tất cả các chuỗi nhị
phân. Mỗi ngôn ngữ L qua Σ là một tập con của Σ*.
Có một thay đổi của các thao tác trên các ngôn ngữ. Các thao tác tập lý
thuyết, như sự hợp và giao, theo hướng hoàn toàn từ các định nghĩa tập lý thuyết.
* Chúng ta định nghĩa phần bù của L bởi
L
= Σ* - L.
* Nối của hai ngôn ngữ L
1
và L
2
là ngôn ngữ : L = {x
1
x
2
: x
1
∈L
1
và x

2
∈L
2
}.
* Closure hoặc Kleene star của một ngôn ngữ L là ngôn ngữ :
L* = {ε} ∪ L ∪ L
2
∪ L
3
∪ , mà L
k
là ngôn ngữ đã được chứa bởi liên
kết L đến chính nó với k thời gian.
Từ điểm quan sát của ngôn ngữ lý thuyết, tập các trường hợp đối với bất kỳ
các bài toán thỏa được Q là tập đơn giản Σ*, mà Σ = {0, 1}. Khi Q được mô tả
trọn vẹn bởi bài toán các trường hợp này mà kết quả một 1(yes) trả lời, chúng ta
có thể xem Q như một ngôn ngữ L qua Σ = {0, 1}, mà : L = {x ∈ Σ*

: Q (x) = 1

}.
Chẳng hạn, bài toán thỏa được PATH có ngôn ngữ tương ứng :
PATH = {<G, u, v, k> : G = (V, E) là một đồ thị có hướng,
u, v ∈ V,
k

0 là một số nguyên và tồn tại một đường đi từ u đến v trong G
đang chứa tại hầu hết các cạnh k }.
Khung ngôn ngữ hình thức cho phép chúng ta diễn đạt mối quan hệ giữa
các bài toán thỏa được và các thuật toán mà giải quyết chúng súc tích. Chúng ta

nói rằng một thuật toán A chấp nhận một chuỗi x ∈ {0,1}* nếu đặt vào x , thuật
___________________
NP-đầy đủ 10
toán đưa ra A(x) là 1. Ngôn ngữ đã chấp nhận bởi một thuật toán A là tập các
chuỗi L = {x ∈ {0,1}* : A(x) = 1}, đó là tập các chuỗi mà thuật toán đó chấp
nhận. Một thuật toán A loại bỏ một chuỗi x nếu A(x) = 0.
Thậm chí nếu ngôn ngữ L là đã chấp nhận bởi một thuật toán A, thuật toán
này sẽ không cần thiết loại bỏ một chuỗi x ∉ L đã cung cấp như dữ liệu vào. Ví
dụ, thuật toán này có thể lặp viễn viễn. Một ngôn ngữ L đã thỏa được bởi một
thuật toán A nếu mỗi chuỗi nhị phân trong L đã chấp nhận bởi A và mỗi chuỗi
nhị phân không phải trong L là đã loại bỏ bởi A. Một ngôn ngữ L đã chấp nhận
trong thời gian đa thức bởi một thuật toán A nếu nó đã chấp nhận bởi A và nếu
thêm vào đó một hằng số k như đối với bất kỳ độ dài - n chuỗi x ∈ L, thuật toán
A chấp nhận x bằng thời gian. Một ngôn ngữ L đã thỏa được bằng thời gian đa
thức bởi một thuật toán A nếu có một hằng số k như đối với bất kỳ độ dài - n
chuỗi x ∈ {0,1}* , thuật toán này hoàn toàn thỏa được khi x ∈ L bằng thời gian
O(n
k
). Vì thế, để chấp nhận một ngôn ngữ, một thuật toán chỉ cần quan tâm đến
các chuỗi trong L, nhưng để thỏa được một ngôn ngữ cần phải chấp nhận hoàn
toàn hoặc loại bỏ mỗi chuỗi trong {0,1}* .
Ví dụ, ngôn ngữ đường đi có thể đã chấp nhận bằng thời gian đa thức. Một
thời gian đa thức đang chấp nhận thuật toán kiểm chứng mà G mã hóa một đồ
thị vô hướng, kiểm chứng mà u và v là các kiểm chứng trong G, dùng breadth-
first nghiên cứu để tính một đường đi ngắn nhất từ u đến v trong G và sau đó so
sánh số các cạnh trên đường đi ngắn nhất được chứa k. Nếu G mã hóa một đồ thị
vô hướng và đường đi từ u đến v tại hầu hết các cạnh k, thuật toán này đưa ra 1
và halts. Trái lại, thuật toán này chạy vĩnh viễn. Thuật toán này không thỏa được
đường đi, tuy nhiên, khi nó không cho dữ liệu ra 0 dứt khoát cho các trường hợp
mà một đường đi ngắn nhất có hơn k cạnh. Một thuật toán thỏa được đường đi

phải loại bỏ dứt khoát các chuỗi nhị phân mà không phụ thuộc vào đường đi. Đối
với một thuật toán thỏa được là dễ thiết kế : thay vì chạy vĩnh viễn khi không có
một đường đi từ u đến v tại hầu hết k cạnh, nó đưa ra 0 và halts. Đối với các bài
toán khác, chẳng hạn như bài toán Turing’s Halting, tồn tại một thuật toán đang
chấp nhận nhưng không tồn tại thuật toán quyết định .
Chúng ta có thể định nghĩa một cách hình thức một lớp phức tạp như một
tập các ngôn ngữ, số hội viên mà đã được xác định bởi một độ đo phức tạp,
chẳng hạn thời gian chạy của một thuật toán xác định khi cho một chuỗi x thuộc
ngôn ngữ L. Định nghĩa thực sự của một lớp phức tạp là một cái gì đó hơn kỹ
thuật - độc giả đã quan tâm đến bởi Hartmanis và Steams.
Sử dụng khung ngôn ngữ lý thuyết này, chúng ta có thể cung cấp một định
nghĩa khác của lớp phức tạp P :
P = {L ⊆ {0,1}* : có tồn tại một thuật toán A mà quyết định L bởi thời gian
đa thức}.
Sự thật, P cũng là lớp các ngôn ngữ mà có thể đã được chấp nhận bởi thời
gian đa thức.
___________________
NP-đầy đủ 11
Định lý 2 : P = {L : L đã chấp nhận bởi một thuật toán thời gian đa thức}.
Chứng minh :
Khi lớp các ngôn ngữ đã quyết định bởi các thuật toán thời gian đa thức là
một tập con lớp ngôn ngữ đã chấp nhận bởi các thuật toán thời gian đa thức,
chúng ta chỉ cần thấy rằng nếu L đã chấp nhận bởi một thuật toán thời gian đa
thức, đó là quyết định bởi một thuật toán thời gian đa thức. Lấy L là ngôn ngữ đã
chấp nhận bởi một số thuật toán thời gian đa thức A. Chúng ta sẽ sử dụng một
lớp luận cứ “sự mô phỏng” đến cấu trúc khác của thuật toán thời gian đa thức A’
mà quyết định L. Bởi vì A chấp nhận L với thời gian O(n
k
) đối với một vài hằng
số k, cũng tồn tại một hằng số c như A chấp nhận L tại hầu hết các bước T = cn

k
.
Đặt bất kỳ chuỗi x, thuật toán A’ mô phỏng hành động của A đối với thời gian T
. Mã hóa thời gian T , thuật toán A’ kiểm tra hoạt động của A. Nếu A chấp nhận
x , sau đó A’ chấp nhận x bằng cách đặt vào a 1. Nếu A không chấp nhận x, thì A’
loai bỏ x bằng cách đặt vào a 0. Trên hết của A’ mô phỏng A không tăng thời
gian chạy bởi hơn một yếu tố đa thức và vì thế A’ là một thuật toán thời gian đa
thức mà quyết định L.
Chú ý rằng chứng tỏ định lý 2. là không có tính cách xây dựng. Đối với một
ngôn ngữ L∈ P, chúng ta thực sự không thể biết một giới hạn trên một thời gian
chạy cho thuật toán A mà chấp nhận L . Tuy nhiên, chúng ta biết rằng như một
giới hạn tồn tại, rằng một thuật toán A’ tồn tại có thể kiểm tra giới hạn, ngay khi
chúng ta không thể tìm thấy thuật toán A’ một cách dễ dàng.
Bài tập:
1. Định nghĩa bài toán tối ưu đường đi có độ dài lớn nhất (LONGEST-PATH-
LENGTH) như quan hệ phù hợp với mỗi trường hợp của một đồ thị vô hướng và
2 đỉnh với số các cạnh trong một đường đi đơn dài nhất giữa 2 đỉnh. Định nghĩa
bài toán thỏa được LONGEST-PATH = {<G, u, v, k> : G = (V, E) là một đồ thị
vô hướng, u, v ∈ V, k ≥ 0 là một số nguyên và có tồn tại một đường đi đơn từ u
đến v trong G chứa ít nhất k cạnh}. Cho thấy rằng bài toán tối ưu LONGEST-
PATH-LENGTH có thể được giải quyết bằng thời gian đa thức khi và chỉ khi
LONGEST-PATH ∈ P.
2. Cho một định nghĩa hình thức đối với bài toán tìm vòng đơn dài nhất trong
một đồ thị vô hướng. Cho một quan hệ quyết định bài toán. Cho ngôn ngữ tương
ứng để quyết định bài toán.
3. Cho một mã hóa hình thức của các đồ thị có hướng như các chuỗi nhị phân
dùng một ma trận-liền kề đại diện. Như sử dụng một danh sách-liền kề đại diện.
Biện luận rằng hai đại diện là quan hệ hoàn toàn đa thức.
4. Thuật toán qui hoạch động đối với 0-1 bài toán ba lô đã yêu cầu trong bài tập
16.2-2 là một thuật toán thời gian đa thức phải không? Giải thích.

5. Chỉ ra một thuật toán thời gian đa thức trái ngược làm tại hầu hết một hằng số
của các các lệnh đến thời gian đa thức thủ tục con chạy với thời gian đa thức
___________________
NP-đầy đủ 12
nhưng một số các lệnh đa thức thủ tục con có thể kết quả trong một thuật toán
thời gian-theo luật số mũ ( exponential-time).
6. Chỉ ra lớp P, xem như một tập các ngôn ngữ là mã hóa dưới phép hợp, phép
giao, phép nối, phép phần bù và Kleene star. Nếu L
1
, L
2
∈ P, thì L
1
∪L
2
∈ P,
2. SỰ XÁC MINH THỜI GIAN ĐA THỨC ( POLYNOMIAL-TIME
VERIFICATION) :
Bây giờì chúng ta nhìn vào các thuật toán mà “chứng minh” số hội viên
trong các ngôn ngữ. chẳng hạn, cho rằng để một trường hợp <G, u, v, k> của bài
toán quyết định đường đi, chúng ta cũng cho một đường đi p từ u đến v. Chúng
ta có thể dễ dàng kiểm tra bất cứ khi nào độ dài của p tại hầu hết k và nếu chúng
ta có thể xem p như một “chứng nhận” mà trường hợp quả thực phụ thuộc vào
đường đi. Sau đó, đường đi thuộc P- trên thực thế, đường đi có thể giải quyết tại
thời gian tuyến tính- và vì thế việc chứng minh số hội viên từ một chứng nhận
mất nhiều thời gian giải quyết bài toán phức tạp. Bây giờ chúng ta sẽ ví dụ một
bài toán mà chúng ta biết thời gian đa thức không quyết định thuật toán, cho một
chứng nhận, chứng minh là dễ dàng.
2.1. Các vòng Hamilton (Hamiltonian cycles) :
Bài toán tìm kiếm một vòng Hamilton trong một đồ thị vô hướng đã được

học hơn một trăm năm qua. Thông thường, một vòng Hamilton của một đồ thị vô
hướng G = (V, E) là một vòng đơn chứa mỗi đỉnh trong V . Một đồ thị chứa một
vòng Hamilton là nói đến người theo những nguyên tắc của Hamilton; Trái lại, là
nói đến người không theo những nguyên tắc của Hamilton. Bondy và Murty trích
dẫn một bức thư bởi W. R. Hamilton mô tả một trò chơi toán học trên khối mười
hai mặt (Hình 2.(a)) trong đó một người chơi phải hoàn toàn dẫn đến từ một
vòng chứa tất cả các đỉnh. Khối mười hai mặt này là Hamilton và (Hình 2.(a))
chỉ ra một vòng Hamilton. Không phải tất cả các đồ thị là Hamilton, tuy nhiên, ví
dụ (Hình (b)) chỉ một đồ thị chia đôi với một số lẻ các đỉnh. Bài tập 2 yêu cầu
bạn chỉ ra rằng tất cả các đồ thị là không Hamilton.
Chúng ta có thể định nghĩa bài toán vòng Hamilton, “Một đồ thị G có một
vòng Hamilton không?” như một ngôn ngữ hình thức :
HAM-CYCLE = {<G> : G là một đồ thị Hamilton}.
Một thuật toán có thể quyết định ngôn ngữ HAM-CYCLE như thế nào ?
Cho một trường hợp bài toán <G>, một quyết định thuật toán có thể liệt kê tất cả
các phép hoán vị của các đỉnh của G và sau đó kiểm tra mỗi phép hoán vị để thấy
nếu nó là một đường đi Hamilton. Thời gian chạy của thuật toán này là gì? Nếu
chúng ta dùng mã hóa “hợp lý” của một đồ thị như ma trận liền kề của nó, số m
của các đỉnh trong đồ thị là Ω
n
, mà n = |<G>| là độ dài mã hóa của G. Đó là m!
các phép hoán vị của các đỉnh có thể thực hiện và vì thế thời gian chạy là Ω(m!)
= Ω
n
!) = Ω(2
n
), mà không O(n
k
) đối với hằng số k. Vì thế, thuật toán ngây
___________________

NP-đầy đủ 13
thơ này không chạy với thời gian đa thức. Sự thật, bài toán vòng Hamilton là
NP-đầy đủ, như chúng ta sẽ chứng tỏ trong phần V.
Hình 2 (a) một đồ thị đại diện các đỉnh, các cạnh và các mặt của một khối mười hai mặt, với một vòng Hamilton biểu
diễn bởi các cạnh đã bôi đen. (b) Một đồ thị chia đôi với một số lẻ các đỉnh. Như bất kỳ đò thị là không Hamilton.

2.2. Các thuật toán xác minh (Verification algorithms) :
Xem nhẹ một bài toán dễ hơn. Cho rằng, một người bạn nói với bạn rằng
cho một đồ thị G là Hamilton và sau đó chứng tỏ bằng cách đưa bạn các đỉnh
theo thứ tự dọc vòng Hamilton. Chắc chắn nó sẽ dễ dàng để xác minh bằng
chứng : đơn giản rằng xác minh vòng đã cung cấp là Hamilton bằng cách kiểm
tra khi nó là phép hoán vị của các đỉnh của V và khi đó mỗi liên tiếp các cạnh
dọc theo vòng thực sự tồn tại trong đồ thị. Thuật toán xác minh này có thể đã
thực hiện một cách chắc chắn để chạy với thời gian O(n
2
); với n là độ dài mã hóa
của G. Vì thế, một chứng tỏ rằng một vòng Hamilton tồn tại trong một đồ thị có
thể đã xác minh trong thời gian đa thức.
Chúng ta định nghĩa một thuật toán xác minh như bị một thuật toán hai đối
số (two-argument) A, mà một đối số là một chuỗi x đặt vào bình thường và một
đối số khác là một chuỗi nhị phân y được gọi là một chứng nhận. Một thuật toán
hai đối số A là :
L= { x∈{0, 1}* : có tồn tại y∈{0, 1}* như là A(x,y) = 1 }.
Bằng trực giác, một thuật toán A xác minh một ngôn ngữ L nếu cho bất kỳ
chuỗi x ∈ L, có một chứng nhận y mà A có thể dùng để chứng tỏ rằng x ∈ L.
Hơn nữa, cho bất kỳ chuỗi x ∉ L, không có chứng nhận chứng tỏ rằng x ∈ L .
Chẳng hạn, trong bài toán vòng Hamiton, chứng nhận là liệt kê các đỉnh trong
một số vòng Hamilton. Nếu một đồ thị là Hamilton, vòng Hamilton của chính nó
cung cấp đủ thông tin để xác minh sự kiện này.
Ngược lại, nếu một đồ thị không phải là Hamilton, không có liệt kê các đỉnh

mà có thể đùa cợt thuật toán xác minh vào việc tin rằng đồ thị là Hamilton, khi
thuật toán xác minh kiểm tra một cách cẩn thận đã đưa ra “vòng” là chắc chắn.
2.3. Độ phức tạp lớp NP (The complexity class NP) :
Độ phức tạp lớp NP là lớp các ngôn ngữ có thể đã xác minh bởi một thuật
toán thời gian đa thức. Chính xác hơn, một ngôn ngữ L phụ thuộc vào NP nếu và
___________________
NP-đầy đủ 14
chỉ nếu có tồn tại một thuật toán thời gian đa thức hai dữ liệu vào (two-input) A
và hằng số c như :
L= { x∈{0, 1}* : có tồn tại một chứng nhận y với | y | = 0 (| x
c
|) như là
A(x,y)=1 }.
Chúng ta nói rằng thuật toán A xác minh ngôn ngữ L bằng thời gian đa thức.
Từ thảo luận trên bài toán vòng Hamilton, nó cho phép HAM-CYCLE ∈
NP. (Nó luôn tốt để biết rằng một tập quan trọng là không rỗng).
Hơn nữa, nếu L ∈ P, thì L ∈ NP, khi đó nếu có một thuật toán thời gian đa
thức để quyết định L, thuật toán đó có thể chuyển đổi một cách dễ dàng đến một
thuật toán xác minh mà đơn giản bỏ qua bất kỳ chứng nhận và chấp nhận một
cách chính xác các chuỗi các dữ liệu vào của nó xác định trong L . Vì thế, P ⊆
NP.
Không biết khi nào mà P = NP, nhưng hầu hết các nhà nghiên cứu tin rằng
P và NP là không cùng lớp với nhau. Bằng trực giác, lớp P chứa các bài toán có
thể đã giải quyết một cách nhanh chóng. Bạn có thể đã học từ kinh nghiệm mà
nó thường khó để giải quyết một bài toán từ hỗn tạp hơn để xác minh một giải
pháp được đại diện một cách rõ ràng, đặc biệt khi làm việc dưới thời gian ràng
buộc. Tóm lại, các nhà khoa học máy tính lý thuyết tin rằng sự tương đồng này
mở rộng các lớp P và NP và như thế NP gồm các ngôn ngữ không có trong P.
Có nhiều chứng cớ thuyết phục mà P ≠ NP - tồn tại các ngôn ngữ mà “NP-
đầy đủ”. Chúng ta sẽ học lớp này trong phần III.

Hình 3. Bốn khả năng cho các mối quan hệ giữa các lớp phức tạp. Một mỗi biểu đồ, một vùng mã hóa khác chỉ một
quan hệ tập con riêng. (a)P=NP=co-NP. Hầu hết các nhà nghiên cứu đề cập khả năng này là không giống nhau. (b) Nếu NP
đóng dưới phần bù, thì NP=co-NP, thì không cần trường hợp mà P=NP. (c) P=NP

co-NP,nhưng NP không đóng dưới
phần bù. (d) NP ≠ co-NP và P ≠ NP

co-NP. Hầu hết các nhà nghiên cứu đề cập khả năng này là không giống nhau.
Nhiều câu hỏi cơ bản khác vượt ra ngoài giới hạn P ≠ NP câu hỏi còn lại đã
không được giải quyết. Mặc dù, nhiều công việc bởi nhiều nhà nghiên cứu, thậm
chí không một người nào biết nếu lớp NP mã hóa dưới phần bù. Đó là L ∈ NP
đưa đến
L
∈ NP hay không ? Chúng ta định nghĩa độ phức tạp lớp NP-đầy đủ
như tập các ngôn ngữ L như thế
L
∈ NP. Câu hỏi của NP mã hóa dưới phần bù
có thể đã được nói lại như khi NP=co-NP. Khi P mã hóa dưới phần bù (Bài tập
I.6), nó cho phép rằng P⊆ NP ∩ co-NP. Tuy nhiên, một lần nữa nó không biết
___________________
NP-đầy đủ 15
khi nào mà P⊆ NP ∩ co-NP hoặc khi nào mà có một số ngôn ngữ trong NP ∩
co-NP - P. Hình 3 biểu diễn 4 khả năng có thể thực hiện được.
Vì thế, đối với chúng ta việc hiểu chính xác các mối quan hệ giữa P và NP
là không đầy đủ. Tuy nhiên, bằng cách thăm dò lý thuyết của NP-đầy đủ, chúng
ta sẽ tìm các khó khăn trong việc chứng tỏ các bài toán khó là từ một quan điểm
thiết thực không gần quá lớn chúng ta có thể giả định.
Bài tập :
1. Xem như ngôn ngữ GRAPH-ISOMORPHISM = {<G
1

, G
2
> : G
1
và G
2
là các
đồ thị đẳng cấu}. Chứng tỏ rằng GRAPH-ISOMORPHISM ∈ NP bằng cách
mô tả một thuật toán thời gian đa thức để xác minh ngôn ngữ đó.
2. Chứng tỏ rằng một đồ thị chia đôi vô hướng với một số lẻ các đỉnh, thì G
không Hamilton.
3. Chỉ ra rằng nếu HAM-CYCLE ∈ P, thì bài toán liệt kê các đỉnh của một vòng
Hamilton, theo thứ tự, là thời gian đa thức có thể giải quyết được.
4. Chứng tỏ rằng lớp NP các ngôn ngữ là đã mã hóa dưới phép hợp, phép giao,
phép nối và Kleene star. Thảo luận sự đóng kín của NP dưới phần bù.
5. Chỉ ra rằng bất kỳ ngôn ngữ trong NP có thể đã được quyết định bởi một thuật
toán chạy với thời gian 2
O(nk)
cho một số hằng số k.
6. Một đường Hamilton trong một đồ thị là một đường đơn mà thăm mỗi đỉnh
đúng một lần. Chỉ ra rằng ngôn ngữ HAM-PATH = {<G, u, v> : có một đường
Hamilton từ u đến v trong đồ thị G } thuộc NP.
7. Chỉ ra rằng bài toán đường đi Hamilton có thể đã được giải quyết bằng thời
gian đa thức trên các đồ thị không vòng vô hướng. Cho một thuật toán có hiệu
quả cho bài toán đó.
8. Lấy

một công thức boolean đã được đặt từ giá trị đặt vào các biến x
1
, x

2
, ,
x
k
,phủ định (negations) (¬), VÀ (∧), HOẶC (∨) và parentheses. Công thức

là một phép lặp thừa nếu nó định giá đến 1 cho mỗi chỉ định của 1 và 0 để đặt
vào các biến. Định nghĩa phép lặp thừa (TAUTOLOGY) như ngôn ngữ của công
thức boolean mà là các phép lặp thừa. Chỉ ra rằng TAUTOLOGY ∈ co-NP.
9. Chứng tỏ rằng P ⊆ co-NP.
10. Chứng tỏ rằng nếu NP ≠ co-NP, thì P ≠ NP.
11. Lấy G là một đồ thị vô hướng liên thông với ít nhất 3 đỉnh và lấy G
3
đồ thị
được chứa bởi sự liên kết tất cả các cặp của các đỉnh là đã liên thông bởi một
đường trong G của độ dài ít nhất 3. Chứng tỏ rằng G
3
là Hamilton. (Gợi ý : Đặt
một cây spanning cho G và sử dụng một đối số qui nạp).
3. NP-ĐẦY ĐỦ VÀ SỰ RÚT GỌN (NP-COMLPETENESS AND
REDUCIBILITY) :
Có lẽ hầu hết lý do thuyết phục tại sao các nhà khoa học máy tính lý thuyết
tin rằng P ≠ NP là hiện tượng có thực của lớp các bài toán “NP-đầy đủ”. Lớp này
có tính chất ngạc nhiên rằng nếu bất kỳ bài toán NP-đầy đủ có thể đã giải được
___________________
NP-đầy đủ 16
bằng thời gian đa thức, thì mỗi bài toán trong NP có một giải pháp thời gian đa
thức, đó là, P = NP.
Ngôn ngữ HAM-CYCLE là một bài toán NP-đầy đủ. Nếu chúng ta có thể
quyết định HAM-CYCLE bằng thời gian đa thức, thì chúng ta có thể giải quyết

mỗi bài toán trong NP bằng thời gian đa thức. Sự thật, nếu NP-P không rỗng,
chúng ta sẽ nói một cách chắc chắn rằng HAM-CYCLE ∈ NP-P.
Trong một hoàn cảnh, các ngôn ngữ NP-đầy đủ là các ngôn ngữ “khó nhất”
trong NP. Trong phần này, chúng ta sẽ chỉ ra cách so sánh mối quan hệ “không
đổi” của các ngôn ngữ sử dụng một khái niệm chính xác được gọi là “ rút gọn
được thời gian đa thức”. Sau đó chúng ta định nghĩa hình thức các ngôn ngữ NP-
đầy đủ và chúng ta hoàn thành bởi bản tóm tắt một chứng tỏ rằng một ngôn ngữ
như thế được gọi là CIRCUIT-SAT, là NP-đầy đủ. Phần IV và V, chúng ta sẽ sử
dụng khái niệm của rút gọn được để chỉ ra rằng nhiều bài toán khác là NP-đầy
đủ.
3.1. Sự rút gọn (Reducibility) :
Bằng trực giác, một bài toán Q có thể đã biến đổi bài toán Q’ khác nếu bất
kỳ trường hợp của Q có thể “đã nói lại dễ dàng” như một trường hợp của Q’, giải
pháp này cung cấp một giải pháp đến trường hợp của Q. Chẳng hạn, bài toán của
việc giải quyết các phương trình tuyến trong một vô hạn x biến đổi đến bài toán
của việc giải quyết các phương trình bậc hai. Cho một trường hợp ax+b = 0,
chúng ta chuyển nó đến 0x
2
+ax +b = 0, giải pháp mà cung cấp một giải pháp đến
ax+b = 0.
Vì thế, nếu một bài toán Q biến đổi đến bài toán Q’ khác, trong hoàn cảnh
đó, thì Q là “không khó để giải quyết” hơn Q’. Trở lại khuôn khổ ngôn ngữ
thông thường của chúng ta để quyết định các bài toán, chúng ta nói rằng một
ngôn ngữ L
1
là rút gọn được thời gian đa thức đến một ngôn ngữ L
2
, được viết
L
1

≤ p L
2
, nếu có tồn tại thời gian đa thức có thể tính hàm f : {0, 1}* → {0, 1}*
như đối với tất cả x ∈{0, 1}*.
x ∈L
1
nếu và chỉ nếu f(x) ∈L
2
Chúng ta gọi hàm f này là sự rút gọn hàm và một thuật toán thời gian đa
thức F mà tính toán f được gọi là một sự rút gọn thuật toán.
___________________
NP-đầy đủ 17
Hình 4. Một minh họa của một thời gian đa thức rút gọn từ một ngôn ngữ L
1
đến một ngôn ngữ L
2
qua một hàm rút
gọn f. Đặt bất kỳ x ∈{0, 1}*, hỏi khi mà x ∈L có giống trả lời như hỏi khi mà f(x) ∈ L
2
.
Hình 4 minh họa ý tưởng của một sự rút gọn thời gian đa thức từ một ngôn
ngữ L
1
đến ngôn ngữ L
2
khác. Mỗi ngôn ngữ là một tập con của {0, 1}*. Hàm
rút gọn f này cung cấp một phép ánh xạ thời gian đa thức như thế nếu x ∈L
1
, thì
f(x) ∈L

2
. Hơn nữa, nếu x ∉L
1
thì f(x) ∉L
2
. Vì thế, hàm rút gọn này ánh xạ bất
kỳ trường hợp x của quyết định bài toán được đại diện bởi ngôn ngữ L
1
đến một
trường hợp f(x) của bài toán được đại diện bởi ngôn ngữ L
2
. Cung cấp một trả
lời khi f(x) ∈L
2
hoàn toàn có hướng, cung cấp trả lời khi x ∈L
1
.
Các rút gọn thời gian đa thức cho chúng ta một công cụ mạnh mẽ để chứng
tỏ rằng các ngôn ngữ thuộc P.
Bổ đề 3 :

Nếu L
1
, L
2
⊆{0, 1}* là các ngôn ngữ như thế L
1

p L
2

, thì L
2
∈ P dẫn
đến L
1
∈ P.
Chứng minh :
Lấy A
2
là một thuật toán thời gian đa thức quyết định L
2
và lấy F là thuật
toán rút gọn thời gian đa thức mà các phép tính rút gọn hàm f. Chúng ta sẽ đặt
một thuật toán thời gian đa thức A
1
quyết định L
1
.
Hình 5. Chứng minh của Bổ đề 3. Thuật toán F là một thuật toán rút gọn mà tính toán hàm rút gọn f từ L
1
đến L
2
với
thời gian đa thức và A
2
quyết định là một thuật toán thời gian đa thức quyết định L
2
.Đã minh họa một thuật toán A
1
quyết định khi mà x ∈ L

1
bằng cách sử dụng F để chuyển bất kỳ dữ liệu đặt vào x vào f(x) và sau đó sử dụng A
2
để quyết định
khi mà f(x) ∈ L
2

Hình 5 minh họa đặt A
1
. Đưa dữ liệu vào x ∈ {0, 1}*, thuật toán A
1
này
dùng F để chuyển x vào f(x) và sau đó nó dùng A
2
để thử khi f(x) ∈L
2
. Đưa ra
A
2
là giá trị để cung cấp như đưa ra từ A
1
.
Sự đúng đắn của A
1
theo điều kiện (I). Thuật toán này chạy với thời gian đa
thức, khi cả F và A
2
chạy với thời gian đa thức (xem hình I.5).
3.2. NP-đầy đủ (NP-completeness) :
Các rút gọn thời gian đa thức cung cấp một phương tiện thông thường cho

việc biểu diễn một bài toán là ít khó như bài toán khác, qua một thừa số thời gian
đa thức. Đó là, nếu L
1

p L
2
, thì L
1
là thừa số đa thức không khó hơn L
2
, mà tại
sao “ít hơn hoặc bằng” natation cho sự rút gọn là giúp trí nhớ. Bầy giờ chúng ta
có thể định nghĩa tập của các ngôn ngữ NP-đầy đủ là các bài toán khó nhất trong
NP.
___________________
NP-đầy đủ 18
Một ngôn ngữ L

⊆ {0, 1}* là NP-đầy đủ nếu :
(1) L ∈ NP


(2) L’ ≤ p L đối với mỗi L’ ∈ NP

.
Nếu một ngôn ngữ L thỏa được tính chất (2), nhưng không cần thiết tính
chất (1), chúng ta nói rằng L là NP-khó. Chúng ta cũng định nghĩa lớp NPC của
các ngôn ngữ NP-đầy đủ.
Theo lý thuyết cho rằng, NP-đầy đủ là tại điểm then chốt của tác dụng
quyết định khi P=NP.

Định lý 4 : Nếu bất kỳ bài toán NP-đầy đủ có thể giải quyết được thời gian đa
thức, thì P=NP. Tương đương, nếu bất kỳ bài toán trong NP không thể giải quyết
thời gian đa thức, thì không thể giải quyết bài toán NP-đầy đủ là thời gian đa
thức.
Chứng minh :
Cho rằng L ∈ P và L ∈ NPC. Đối với bất kỳ L’ ∈ NP, chúng ta có L’ ≤ p L
bởi tính chất (2) của định nghĩa NP-đầy đủ. Vì thế, theo Bổ đề 3, chúng ta cũng
có L’ ∈ P, bằng chứng phát biểu thứ nhất của định lý đó.
Để chứng tỏ phát biểu thứ hai, chú ý rằng nó là trái ngược của phát biểu thứ
nhất.
Đối với lý do này mà nghiên cứu vào câu hỏi P ≠ NP xoay quanh các bài
toán chính NP-đầy đủ. Hầu hết các nhà hoa học máy tính lý thuyết tin rằng N ≠
NP, dẫn đến các mối quan hệ giữa P, NP, và NPC biểu diễn ở hình 6.
Nhưng đối với tất cả chúng ta biết rằng, một người nào đó có thể thấy một
thuật toán thời gian đa thức cho một bài toán NP-đầy đủ, vì thế chứng tỏ rằng
P=NP.
Tuy nhiên, khi thuật toán không phải thời gian đa thức cho bất kỳ bài toán
NP-đầy đủ chưa được tìm ra, một chứng tỏ rằng một bài toán là NP-đầy đủ cung
cấp bằng chứng tuyệt vời cho tính khó của nó.
Hình 6. Hầu hết các nhà khoa học máy tính lý thuyết xem các mối quan hệ giữa P, NP và NPC như thế nào?. Cả P và
NPC là hoàn toàn chứa không quá NP và P

NPC =

.
3.3. Thỏa được mạch (Circuit Satisfiability) :
___________________
NP-đầy đủ 19
Chúng ta đã định nghĩa khái niệm của một bài toán NP-đầy đủ nhưng với
quan điểm này, chúng ta không thực sự chứng tỏ rằng bất kỳ bài toán là NP đầy

đủ. Mỗi chúng ta chứng tỏ rằng tại ít nhất một bài toán là NP-đầy đủ, chúng ta có
thể sử dụng thời gian đa thức rút gọn như một công cụ để chứng tỏ NP-đầy đủ
của các bài toán khác vì thế bây giờ chúng ta chứng tỏ tình trạng của một bài
toán NP đầy đủ : bài toán thỏa được mạch.
Tuy nhiên bằng chứng chính thức bài toán thỏa được mạch là NP đầy đủ
yêu cầu kỹ thuật chi tiết nằm ngoài phạm vi của bài tập này. Thay vì chúng ta sẽ
mô tả 1 cách không trang trọng một bằng chứng dựa trên sự hiểu biết cơ bản của
sự liên kết các mạch giá trị.
Sự liên kết các mạch giá trị xây dựng trong các phân tử liên kết giá trị mà
có mối liên hệ với nhau bởi các dây (wires). Một phân tử liên kết giá trị là bất kỳ
phần tử mạch mà có 1 hằng số của giá trị dữ liệu vào và ra biểu diễn 1 hàm các
giá trị boolean đã đưa ra từ tập {0,1} mà 0 đại diện SAI và 1 đại diện ĐÚNG.
Các phần tử kết nối giá trị mà chúng ta dùng trong bài toán thỏa được mạch
tính 1 hàm boolean đơn giản và được biết như các cổng logic
Hình 7 biểu diễn 3 cổng logic cơ bản mà chúng ta dùng trong bài toán thỏa
được mạch cổng NOT (phủ định) cổng AND (và) và cổng OR (hoặc). Cổng
NOT lấy một chuỗi nhị phân đơn giản đặt vào x mà giá trị là 0 hoặc 1, và cho ra
một nhị phân dữ liệu ra g mà giá trị đối lập với giá trị đặt vào hai cổng khác lấy 2
nhị phân đặt vào x và y và cho ra một nhị phân ra z.
Thao tác của mỗi cổng và của bất kỳ phân tử kết nối giá trị có thể đã mô tả
bởi 1 bảng chân trị, biễu diễn dưới mỗi cổng ở hình 7. Một bảng chân trị cho các
dữ liệu ra của phân tử kết nối được mỗi khả năng có thể của các dữ liệu vào.
Chẳng hạn, bảng chân trị đối với cổng OR nó cho chúng ta thấy rằng khi các dữ
liệu vào là x = 0 và y = 1 thì giá trị dữ liệu ra là z = 1. Chúng ta dùng các biểu
tượng ¬ để chỉ hàm NOT (phủ định), ∧ để chỉ hàm AND(và) , và ∨ để chỉ hàm
OR (hoặc).
Vì thế , ví dụ : 0 ∨ 1 = 1
Hình 7. Ba cổng logic cơ bản, với các dữ liệu vào ra là nhị phân. Dưới mỗi cổng là bảng chân trị mô tả các phép
toán của cổng đó. (a) là cổng PHỦ ĐỊNH (NOT), (b) là cổng VÀ (AND), (c) là cổng HOẶC (OR).
___________________

NP-đầy đủ 20
Chúng ta có thể tổng quát hóa các cổng ANDì và OR để lấy hơn 2 dữ liệu
vào. Một cổng AND dữ liệu ra là 1 nếu tất cả dữ liệu vào của nó là 1, và ngược
lại dữ liệu ra của nó là 0. Một cổng OR dữ liệu ra là 1 nếu bất kỳ các dữ liệu vào
của nó là 1 và ngược lại dữ liệu ra của nó là 0.
Một mạch kết hợp boolean chứa một hoặc nhiều hơn các phần tử kết nối giá
trị đã có mối liên hệ với nhau bởi các dây (wires). Một dây có thể kết nối dữ liệu
của một phần tử đến dữ liệu đến dữ liệu vào của một phần tử khác, bởi sự cung
cấp giá trị dữ liệu của phần tử đầu tiên như một giá trị dữ liệu vào của một phần
tử thứ hai. Hình 8, biểu diễn 2 mạch kết hợp boolean giống nhau; chúng khác
nhau chỉ một cổng. Phần (a) của hình cũng chỉ các giá trị trên các dây cá nhân,
cho dữ liệu vào < x
1
=1, x
2
=1, x
3
=1>. Mặc dù, một dây đơn có thể không có nhiều
hơn một phần tử kết nối dữ liệu ra đã kết nối với nó, nó không thể dẫn nhiều
phần tử các dữ liệu vào. Số phần tử các dữ liệu vào dẫn bởi một dây được gọi là
hệ số phân đầu ra (fan-out) của dây đó. Nếu không có phần tử dữ liệu ra đã kết
nối đến một dây, dây đó là một mạch đặt vào, chấp nhận các giá trị dữ liệu vào
từ một nguồn ngoài. Nếu không có phần tử đặt vào đã kết nối đến một dây, dây
đó là một mạch dữ liệu ra, cung cấp các kết quả của phép tính mạch đến bên
ngoài. Đối với mục đích của định nghĩa này bài toán thỏa được mạch chúng ta
giới hạn số mạch các dữ liệu đối với 1, mặc dù trong thực tế thiết kế phần cứng,
một mạch kết hợp boolean có thể có nhiều dữ liệu vào.
Các mạch kết hợp boolean không chứa vòng. Mục đích của chúng ta là tạo
một đồ thị có hướng G=<V,E> với một đỉnh cho mỗi phần tử kết nối và với k
cạnh có hướng cho mỗi dây mà hệ số phân đầu ra (fan-out) là k; đó là một cạnh

(u,v) có hướng nếu một dây kết nối dữ liệu ra của phần tử u đến 1 dữ liệu vào
của phần tử v. Sau đó G phải không vòng (acylic). Một chỉ định chân trị cho một
mạch kết hợp boolean là một tập các giá trị dữ liệu vào boolean. Chúng ta nói
rằng một mạch kết hợp boolean dữ liệu ra 1 là chỉ định thỏa được : một chân trị
chỉ định mà các lý do dữ liệu ra của mạch đó sẽ là 1. Ví dụ, mạch ở hình 8 (a) có
thể chỉ định thỏa được < x
1
=1, x
2
=1, x
3
=0> và vì thế nó là có thể thỏa được. Như
bài tập II.1 yêu cầu bạn biểu diễn, không chỉ định của các giá trị đến x
1
, x
2
và x
3
các lý do mạch ở hình 8 (b) để cho ra một dữ liệu ra 1; nó luôn luôn cho ra 0, vì
thế nó không thể thỏa được.
___________________
NP-đầy đủ 21
Hình 8. Hai trường hợp của bài toán thỏa được mạch. Hình (a), chỉ định (x
1
=1, x
2
=1, x
3
=0) đưa các dữ liệûu vào của
các trường hợp mạch này dữ liệu ra của mạch là 1. Vì thế mạch là thoả được. Hình (b), không chỉ định đến các dữ liệu và

của mạch này có thể do dữ liệu ra của mạch là 1. Vì thế, mạch đó là không thỏa được.
Bài toán thỏa được mạch là “Cho một mạch kết hợp boolean bao gồm các
cổng AND, OR, NOT là có thể thỏa được hay không ?”
Tuy nhiên chúng ta phải đồng ý một mã hóa chuẩn cho các mạch, kích cỡ
của một mạch kết hợp boolean là số các phần tử kết nối giá trị cộng số các dây
trong mạch. 1 có thể đặt một đồ thị mã hóa mà ánh xạ bất kỳ cho mạch C vào
một chuỗi nhị phân <C> mà độ dài là đa thức với kích cỡ của mạch chính nó.
Như một ngôn ngữ hình thức, chúng ta có thể định nghĩa :
CIRCUIT-SAT = { <C> : C có thể thỏa được một mạch kết hợp boolean }.
Bài toán thỏa được mạch (circuit-satisfiability) xuất hiện trong vùng trợ
giúp máy tính tối ưu hóa phần cứng. Nếu một mạch con luôn luôn cho ra 0, mà
mạch con có thể đã được thay thế bởi 1 mạch con đơn giản hơn mà bỏ qua tất cả
các cổng logic và cung cấp giá trị hằng 0 như nó đã đưa ra. Nó sẽ giúp ích cho
một thuật toán thời gian đa thức đối với bài toán này.
Cho một mạch C, chúng ta có thể cố gắng xác định khi nó không thể thỏa
được bởi sự kiểm tra đơn giản tất cả các chỉ định có thể đến các dữ liệu vào. Tuy
nhiên, nếu có k dữ liệu vào, có 2
k
các chỉ định có thể. Khi kích cỡ của C là đa
thức trong k, việc kiểm tra mất thời gian Ω(2
k
), là siêu đa thức (superpolynomial)
với kích cỡ của mạch. Thực tế, có bằng chứng cho rằng, các tồn tại thuật toán
gian không đa thức giải quyết bài toán thỏa được mạch vì thỏa được mạch là NP-
đầy đủ. Chúng ta làm vỡ bằng chứng của sự kiện này vào hai phần, dựa trên hai
phần của định nghĩa NP-đầy đủ.
Bổ đề 5: Bài toán thỏa được mạch (circuit-satisfiability) thuộc lớp NP.
Chứng minh :
Chúng ta sẽ cung cấp một dữ liệu vào 2 thuật toán thời gian đa thức A có
thể chứng minh CIRCUIT-SAT. Mỗi dữ liệu vào A là một mạch kết hợp C. Dữ

liệu vào khác là một chứng nhận (cirtificate) tương ứng đến một chỉ định của các
giá trị boolean đến các dây trong C (Xem bài tập III.4 đối với một chứng nhận
nhỏ hơn).
Thuật toán A đã được xây dựng như sau. Mỗi cổng logic trong mạch, nó
kiểm tra đã cung cấp bởi chứng nhận trên dây dữ liệu ra là hoàn toàn đúng đã
tính như một hàm của các giá trị trên các dây dữ liệu vào. Sau đó, nếu cho ra
toàn bộ mạch là 1, thuật toán dữ liệu ra 1, khi các giá trị đã gán đến các dữ liệu
vào của C cung cấp 1 chỉ định thỏa được. Trái lại, A dữ liệu ra là 0.
Khi một mạch thỏa được C là dữ liệu vào thuật toán A, đó là một chứng
nhận mà độ dài đa thức trong kích cỡ của C là lý do A dữ liệu ra 1. Khi một
mạch không thỏa được là dữ liệu vào, không chứng nhận nào có thể đánh lừa A
và tin tưởng rằng mạch đó có thể thỏa được. Một thuật toán chạy vơi thời gian đa
___________________
NP-đầy đủ 22
thức : với một sự thi hành tốt, thỏa được thời gian tuyến tính. Vì thế, CIRCUIT-
SAT có thể đã thay đổi với thời gian đa thức và CIRCUIT-SAT ∈ NP.
Phần thứ 2 chứng tỏ rằng CIRCUIT-SAT là NP-đầy đủ, là để chỉ rằng ngôn
ngữ là NP-khó. Chúng ta phải chỉ rằng ngôn ngữ trong NP là thời gian đa thức
rút gọn đến CIRCUIT-SAT. Bằng chứng thực sự của sự kiện này là quá nhiều
các phức tạp và vì thế chúng ta sẽ ổn định bằng chứng dựa trên một số hiểu biết
của các công việc của phần cứng máy tính.
Một chương trình máy tính đã lưu trữ trong bộ nhớ máy tính như một chuỗi
các lệnh. Một lệnh tiêu biểu mã hóa một thao tác đã biểu diễn, các địa chỉ của
các toán hạng trong bộ nhớ được gọi là chương trình trong trình bày bản in, giữ
lại các lệnh sẽ được thực hiện tiếp theo. Chương trình trong trình bày bản in này
hoàn toàn tự động gia tăng khi một lệnh đã định sẵn, bởi lý do đó, máy tính thi
hành các lệnh một cách liên tục. Sự thực hiện một lệnh có thể do một giá trị được
viết đến chương trình trong trình bày bản in, tuy nhiên, sau khi thực hiện theo
dãy thông thường có thể đã bị thay đổi, theo máy tính để vòng lặp và biểu diễn
các nhánh đầu tiên.

Tại bất kỳ điểm trong suốt quá trình thực hiện của một chương trình, toàn
bộ trạng thái của phép tính đã trình bày trong bộ nhớ máy tính. Chúng ta gọi bất
cứ trạng thái riêng biệt của bộ nhớ máy tính một cấu hình. Sự thực hiện của một
lệnh có thể xem như ánh xạ một cấu hình khác. Một điều quan trọng, phần cứng
máy tính làm xong ánh xạ này có thể đã thực hiện như một mạch kết hợp
boolean, mà chúng ta biểu thị bởi M trong chứng minh của bổ đề.
Bổ đề 6 : Bài toán thỏa được mạch (circuit-satisfiability) là NP-khó.
Chứng minh :
Lấy L bất kỳ ngôn ngữ trong NP. Chúng ta sẽ mô tả một thuật toán thời
gian đa thức F tính một hàm rút gọn f mà ánh xạ mỗi chuỗi nhị phân x đến một
mạch C=f(x) như x ∈ L khi và chỉ khi C ∈ CIRCUIT-SAT.
Khi L ∈ NP, ắc hẳn tồn tại một thuật toán A chứng minh L với thời gian đa
thức. Thuật toán F mà chúng ta xây dựng sẽ dùng thuật toán 2 dữ liệu vào A để
tính hàm rút gọn f.
Lấy T(n) biểu thị trường hợp xấu nhất thời gian chạy của thuật toán A với
độ dài n dữ liệu vào các chuỗi và k ≥ 1 là một hằng số mà T(n) = O(n
k
) và độ dài
của chứng nhận là O(n
k
).
Ý tưởng cơ bản của bằng chứng là trình bày phép tính của A như một chuỗi
các cấu hình. Như biểu diễn ở hình 9., mỗi cấu hình có thể phá vỡ thành các
phần chứa chương trình A, chương trình trong trình bày bản in và trạng thái máy
phụ, đặt vào x, chứng nhận y và lưu trữ công việc. Bắt đầu với một cấu hình
duy nhất c
0
, mỗi cấu hình c
i
là ánh xạ đến một cấu hình chuỗi con C

i+1
bởi thuật
toán A - 0 hoặc 1 được viết một vài vị trí đã thiết kế trong kho lưu trữ công việc
khi A hoàn thành việc thực hiện và nếu chúng ta cho rằng sau đó A tạm nghỉ, giá
___________________
NP-đầy đủ 23
trị chưa bao giờ thay đổi. Vì thế thuật toán chạy đối với tại hầu hết các bước
T(n), dữ liệu ra xuất hiện như một trong các bits trong c
T(n)
.
Thuật toán rút gọn F xây dựng một mạch nối đơn mà tính tất cả các cấu
hình đã phát sinh bởi một cấu hình duy nhất. Ý tưởng là dán T(n) với nhau sao
chép của mạch M. Dữ liệu ra của i th mạch, mà phát sinh cấu hình c
i
, là dẫn trực
tiếp vào dữ liệu vào (i+1)st mạch. Vì thế, các cấu hình khá hơn kết thúc tại một
thanh ghi trạng thái, đơn giản cư trú như các giá trị trên các dây đang kết nối sao
chép của M.
Hình 9. Chuỗi các cấu hình được sinh bởi một thuật toán A đang chạy với một dữ liệu vào x và chứng nhận y. Mỗi
cấu hình đại diện trạng thái của máy tính cho một bước tính và ngoài ra A, x và y gồm chương trình tính cho bảng in (PC),
bổ trợ máy trạng thái và lưu trữ công việc. Ngoài chứng nhận y, cấu hình c
0
là hằng số. Mỗi cấu hình là đã ánh xạ đến cấu
hình kế tiếp bởi một mạch nối boolean M. Dữ liệu ra là một bit phân biệt trong lưu trữ công việc.
Gọi lại thuật toán rút gọn thời gian đa thức phải làm. Cho một dữ liệu x, nó
phải tính một mạch C=f(x) là có thể thỏa được khi và chỉ khi tồn tại một chứng
nhận y như A(x,y)=1. Khi F chứa một dữ liệu vào x, trước tiên nó tính n=|x| và
xây dựng một mạch nối C’ chứa T(n) sao chép của M. Đặt vào C’ là một cấu
hình duy nhất tương ứng một phép tính trên A(x,y) và dữ liệu ra là cấu hình C
T(n)

.
Mạch C=f(x) mà các phép tính C’ tương ứng đến chương trình cho A,
chương trình trong trình bày bản in là duy nhất, đặt dữ liệu vào x và trạng thái
duy nhất của bộ nhớ là đã mắc (wired) trực tiếp đến các giá trị đã biết. Vì thế, chỉ
duy trì các dữ liệu vào đến mạch tương ứng đến chứng nhận y. Thứ hai, tất cả
dữ liệu ra đến mạch đã bỏ qua, loại trừ một 1 của C
T(n)
tương ứng đến dữ liệu ra
___________________
NP-đầy đủ 24
của A. Mạch C này, nên đã xây dựng, tính C(y)=A(x,y) cho bất kỳ dữ liệu vào y
của độ dài O(n
k
). Thuật toán rút gọn F khi đã cung cấp một chuỗi dữ liệu vào x,
tính như một mạch và cho các dữ liệu ra của nó.
Hai tính chất còn lại đã được chứng minh. Thứ nhất; chúng ta phải chỉ ra
rằng F hoàn toàn tính một hàm rút gọn f. Đó là, chúng ta phải chỉ ra rằng C là có
thể thỏa được khi và chỉ khi tồn tại một chứng nhận y như A(x,y)=1. Thứ hai;
chúng ta phải chỉ ra rằng F hoàn toàn tính một hàm rút gọn, chúng ta hãy cho
rằng tồn tại một chứng nhận y độ dài O(n
k
) như A(x,y)=1. Sau đó, nếu chúng ta
bổ sung các bits của y để đặt vào C, dữ liệu ra của C là C(y)=A(x,y)=1. Vì thế
nếu một chứng nhận tồn tại thì C là có thể thỏa được. Đối với lệnh khác, cho
rằng A là có thể thỏa được. Vì thế, có tồn tại một dữ liệu y đến C như thế
C(y)=1, từ đó chúng ta kết luận rằng A(x,y)=1. Vì thế, F hoàn toàn tính một hàm
rút gọn.
Để bằng chứng, chúng ta chỉ cần chỉ ra rằng F chạy với thời gian đa thức
trong n=|x|. Quan sát đầu tiên chúng ta làm số các bits yêu cầu đại diện một cấu
hình là đa thức trong n. Chương trình cho chính A có kích cỡ hằng số, độc lập

với độ dài của dữ liệu vào x. Độ dài của dữ liệu vào x là n và độ dài của chứng
nhận y là O(n
k
). Khi thuật toán chạy đối với hầu hết các bước O(n
k
), trong lưu
trữ công việc yêu cầu bởi A là đa thức trong n là tốt.
Mạch M nối đang thực hiện phần cứng máy tính có kích cỡ đa thức bằng độ
dài của một cấu hình, mà là đa thức trong O(n
k
) và vì thế là đa thức trong n.
Mạch C chứa hầu hết t =O(n
k
) sao chép của M và vì thế nó có kích cỡ đa thức
trong n. Xây dựng C từ x có thể đã hoàn thành trong thời gian đa thức bởi thuật
toán rút gọn F, khi mỗi bước xây dựng mất thời gian đa thức.
Bởi vậy ngôn ngữ CIRCUIT-SAT là ít khó như bất kỳ ngôn ngữ trong NP
và khi nó thuộc NP, nó là NP-đầy đủ.
Định lý 7: Bài toán thỏa được mạch (circuit-satisfiability) là NP-đầy đủ.
Chứng minh :
Trực tiếp từ bổ đề 5 và 6 và từ định nghĩa của NP-đầy đủ.
Bài tập :
1. Chứng minh rằng mạch trong hình 8(b) là không thể thỏa được.
2. Hãy chỉ ra rằng quan hệ ≤ p là một quan hệ stransitive trên các ngôn ngữ. Từ
đó chỉ ra rằng nếu L
1
≤ p L
2
và L
2

≤ p L
3
thì L
1
≤ p L
3
.
3. Chứng tỏ rằng L ≤ p
L
khi và chỉ khi
L
≤ p L.
4. Hãy chỉ ra rằng một chỉ định thỏa được (satisfying assignment) có thể sử dụng
như một chứng nhận trong một bằng chứng thay đổi của Bổ đề 5. Mà chứng
nhận làm cho chứng minh dễ dàng hơn.
5. Bằng chứng của Bổ đề 6 cho rằng lưu trữ công việc cho thuật toán A chiếm
một miền kề của kích cỡ đa thức. Bằng chứng này đã lợi dụng giả định ở đâu ?
Biện luận rằng lợi dụng này không liên quan đến bất kỳ mất tính tổng quát.
___________________
NP-đầy đủ 25

×