1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận Phân tích và thiết kế thuật toán NP-ĐẦY ĐỦ (NP-Completeness)

48 701 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 48
Dung lượng 0,94 MB

Nội dung

Chưa có thuật toán thời gian đa thức nào được khám phá cho bài toán NP đầy đủ,cũng như chưa có ai có thể chứng minh rằng thuật toán không phải thời gian đa thức có thể tồn tại đối với bấ

Trang 1

ĐẠI HỌC HUẾ TRƯỜNG ĐẠI HỌC KHOA HỌC

TIỂU LUẬN PHÂN TÍCH VÀ THIẾT KẾT THUẬT TOÁN

Lớp Khoa học máy tính Khoá 2009-2011

Huế, tháng 11/2009

Trang 2

M C L C ỤC LỤC ỤC LỤC

PHẦN I: TỔNG QUAN 2

PHẦN II: NỘI DUNG 7

1 THỜI GIAN ĐA THỨC (POLYNOMIAL TIME): 7

1.1 Các bài toán trừu tượng (Abstract problems): 8

1.2 Các phép mã hóa (encodings): 8

1.3 Một khuôn khổ ngôn ngữ hình thức (A formal-language frameword): 11

Bài tập: 13

2 XÁC MINH THỜI GIAN ĐA THỨC (POLYNOMIAL-TIME VERIFICATION): 14

2.1 Chu trình Hamilton (Hamiltonian cycles): 14

2.2 Các thuật toán xác minh (Verification algorithms) : 15

2.3 Lớp phức NP (The complexity class NP): 15

Bài tập: 17

3 NP-ĐẦY ĐỦ VÀ PHÉP RÚT GỌN (NP-COMLPETENESS AND REDUCIBILITY): 18

3.1 Sự rút gọn (Reducibility): 18

3.2 NP-đầy đủ (NP-completeness): 20

3.3 Thỏa mãn mạch (Circuit Satisfiability): 21

Bài tập: 27

4 CÁC CHỨNG MINH NPC (NP-COMPLETENESS PROOFS): 28

4.1 Thỏa mãn công thức (Formula satisfiability): 29

4.2 Thỏa mãn được 3-CNF: 31

Bài tập: 35

5 CÁC BÀI TOÁN NP-ĐẦY ĐỦ (NP-COMLETE PROBLEMS): 35

5.1 Bài toán clique (The clique problem): 35

5.2 Bài toán vỏ phủ đỉnh (The vertex-cover problem): 38

5.3 Bài toán chu trình Hamilton (The Hamiltonian-cycle problem): 39

5.4 Bài toán người bán hàng du lịch (The traveling-salesman problem): 43

5.5 Bài toán tổng tập con (The subset-sum problem): 44

Bài tập: 47

Trang 3

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) : trên các đầu vào có kích cỡ n, thời gian

thực hiện trong trường hợp xấu nhất là O(n k ) với một hằng số k Quả rất tự

nhiên khi ta tự hỏi rằng: có phải tất cả các bài toán đều có thể giải trong thờigian đa thức? Câu trả lời là không Chẳng hạn, đó là các bài toán, như “bàitoán Halting” nổi tiếng của Turing, không thể giải được bằng bất kỳ máy tínhnào, bất kể cung ứng bao nhiêu thời gian 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 Nói chung,

chúng ta xem các bài toán có thể giải được bằng các thuật toán thời gian đathức là “dễ trị” và các bài toán đòi hỏi thời gian siêu đa thức là “khó trị”

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ácbài toán “NP-đầy đủ (NP-complete)", mà tình trạng của nó là một ẩn số Chưa

có thuật toán thời gian đa thức nào được khám phá cho bài toán NP đầy đủ,cũng như chưa có ai có thể chứng minh rằng thuật toán không phải thời gian

đa thức có thể tồn tại đối với bất kỳ bài toán nào trong số chúng Cái gọi là P

 NP này đã từng là một trong những bài toán nghiên cứu mở gây phức tạpnhất, sâu nhất trong khoa học máy tính lý thuyết được đư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à xemchúng giống như các bài toán mà có các thuật toán thời gian đa thức Trongmỗ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ặckhác là NP-đầy đủ, nhưng sự khác nhau không đáng kể giữa các bài toánxuấ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à NP đầy đủ.

* Chu trình Hamilton và Euler (Euler tour vs hamiltonian cycle) :

Một chu trình Euler của một kết nối của đồ thị có hướng G = (V, E) là một

chu trình đ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 chu trình

Euler với thời gian O(E) Một chu trình Hamilton của một đồ thị có hướng G

= (V, E) là một chu trình đơn mà chứa mỗi đỉnh trong V Xác định khi một đồ

thị có hướng có một chu trình 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); và dấu ngoặcđơn () Một công thức boolean là thỏa được nếu có một vài chỉ định của cácgiá trị 0 và 1 đến các biến của nó mà do nó định giá đến 1 Chúng ta sẽ địnhnghĩ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 dạng chuẩn tắc hội (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

Trang 4

biến hoặc các phủ định của chúng Ví dụ, một công thức boolean (x1  x2)

(x1 x3)  (x2 x3) là trong 2-CNF (Nó có chỉ định thỏa được x1 = 1, x2 =

0, x3 = 1) Đó là một thuật toán thời gian đa thức để xác định khi một côngthứ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 đủ

NP đầy đủ và các lớp P và NP :

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(nk) với một số

hằng số k, mà n là kích cỡ vào của bài toán.

* Lớp NP chứa các bài toán có thể “xác minh (verifiable)" bằng thờigian đa thức Nghĩa là nếu chúng ta đưa ra một "chứng chỉ (certificate)" củamột lời giải, thì chúng ta có thể xác minh rằng chứng chỉ đó là đúng với thờigian đa thức với kích cỡ vào của bài toán Chẳng hạn, trong bài toán chu trình

Hamilton, cho một đồ thị có hướng G = (V, E), một chứng chỉ có thể là một chuỗi <v1, v2, v3, , v |V| > của các cạnh |V| Dễ dàng kiểm tra bằng thời gian đa thức mà (vi, vi+1) E với i = 1, 2, 3, , |V| - 1 và (v |V| , v1) E Một ví dụ khác,

đối với thỏa được 3-CNF, một chứng chỉ 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ếukhi một bài toán thỏa được trong P thì có thể giải được nó trong thời gian đathức ngay cả khi không bị đưa ra một chứng chỉ Chúng ta sẽ chính thức hóakhá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ộtthuậ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 tinrằng các bài toán NP-đầy đủ đó là khó trị, 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ònquá xa để chứng minh rằng các bài toán NP-đầy đủ là khó trị- không có mộtkế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ácnguyên lý cơ bản của lý thuyết NP-đầy đủ Nếu bạn có thể thiết lập một bài

Trang 5

toán như NP-đầy đủ, bạn đưa ra bằng chứng tốt cho tính khó trị 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ộtthuật toán xấp xỉ hoặc việc giải quyết một trường hợp đặc biệt dễ trị, khá hơnviệc tìm kiếm một thuật toán nhanh mà giải quyết bài toán một cách chínhxác Hơn nữa, nhiều bài toán hấp dẫn dường như không khó hơn việc phânloại, nghiên cứu đồ thị hoặc mạng luồng thực tế là NP-đầy đủ Vì thế, nó quantrọ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ánriêng biệt là NP-đầy đủ khác với các phương pháp kỹ thuật đã sử dụng quahầ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ựavà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 lời giải khả thi có một giá trị phù hợp và chúng ta mong ướctìm một lời giải 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ốiquan 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 địnhliên kết bởi một giới hạn trên giá trị sẽ được tối ưu Ví dụ, đối với đường đingắ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àitoá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ảiquyết ĐƯỜNG ĐI (PATH) bằng cách giải quyết ĐƯỜNG ĐI NGẮNNHẤ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ếuchú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 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ì

Trang 6

thế, ngay cả khi nó giới hạn sự chú ý đến các bài toán quyết định, lý thuyếtcủ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

dễ thuyết 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ứctrong cách trái ngược để biểu diễn một bài toán là NP-đầy đủ Chúng ta hãylấ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ácphé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ó

Trang 7

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ứngminh đơ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 hy vọng 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

Trang 8

PHẦN II: NỘI DUNG

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 khuôn khổ (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ờigian đa thức “các phép rút gọn” Nó định nghĩa NP-đầy đủ và phát thảo mộtchứng cứ mà một bài toán được gọi là NP-đầy đủ “ thỏa được mạch” (“circuitsatisfiability“) 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ảnbằ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 đã đượcminh 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 lý lẽ hỗ trợ:

- Thứ nhất, mặc dù có lý khi xem bai toán yêu cầu thời gian (n100) làkhó trị, song có rất ít 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 Các bài toán tính toán được theo thời gian đa thức đãgặp trong thực tế thường yêu cầu ít thời gian hơn nhiều Thậm chí nếu hiện tạithuậ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 tính toán hợp lý, 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ảiquyế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ánthỏa được trong thời gian đa thức bằng máy truy cập ngẫu nhiên nối tiếp đượcdùng thường xuyên trong cuốn sách này giống như lớp bài toán giải được trongthờ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, cho dù sốlượng các bộ xử lý tăng trưởng theo đa thức với kích cỡ đầu vào

- Thứ ba, lớp các bài toán thời gian đa thức giải được có các tính chấtbao đóng chính xác, bởi 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 kết xuất một thuật toán thời gian đa thức được dẫn vàomột thuật toán thời gian đa thức khác, thuật toán phức hợp này là đa thức

Trang 9

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ácthủ tục con, thời gian chạy của thuật toán phức hợp là đa thức.

1.1 Các bài toán trừu tượng (Abstract problems):

Để hiểu lớp các bài toán giải được theo thời gian đa thức, trước hếtchú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 hệ thức nhị phân trên một tập I

các minh dụ (instances) của bài toán và một tập S các nghiệm của bài toán.

Chẳng hạn, một minh dụ đối với đường đi ngắn nhất là một bộ ba chứa 1

đồ thị và 2 đỉnh Một nghiệm 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à

hệ thức kết hợp từng minh dụ của mỗi đồ thị và 2 đỉnh với một lộ trình ngắnnhất trong đồ thì nối hai đỉnh Vì các đường đi ngắn nhất này là không nhấtthiết phải duy nhất, một minh dụ đã cho có thể có nhiều hơn một nghiệm

Cách trình bày này của một bài toán trừu tượng là chung hơn so với yêucầu của các mục tiêu của chúng ta Để đơn giản, lý thuyết về NP-đầy đủ giớihạn sự chú ý đến các bài bài toán quyết định : có một nghiệm có/ không.Trong trường hợp này, chúng ta có thể xem một bài toán quyết định trừu

tượng dưới dạng một hàm ánh xạ từ tập minh dụ I đến tập nghiệm {0,1} Ví

dụ, một bài toán quyết định 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 minh dụ của bài toán đường đi ngắn nhất, thì 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 phải là bài toán quyết định mà

là bài toán tối ưu, mà một vài giá trị đều phải nhỏ nhất hoặc lớn nhất Để ápdụng lý thuyết về NP đầy đủ cho các bài toán tối ưu hóa, ta phải áp đổi lạichúng thành các bài toán quyết định Thông thường để áp đổi lại một bài toántối ưu hóa, ta áp đặt một cận trên giá trị sẽ được tối ưu hóa Nói chung, nếu cóthể nhanh chóng giải một bài toán tối ưu hóa, ta cũng có thể nhanh chóng giảimột bài toán quyết định có liên quan của nó Do đó, nếu một bài toán tối ưuhóa là dễ thì bài toán quyết định liên quan của nó cũng dễ

1.2 Các phép 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àitoá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 hiểu

rõ Phép mã hó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 đã xem xét các phép biểu diễn máy tính

về các ký tự trên bàn phím ắt quen với bảng mã ASCII hoặc EBCDIC Trongbả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 phép biểudiễn của các bộ phận cấu tạo của nó 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 dưới dạng các chuỗinhị phân

Trang 10

Như vậy, một thuật toán máy tính mà “giải quyết” một vài bài toán quyếtđịnh trừu tượng thực tế chấp nhận một mã hóa của minh dụ bài toán như dữliệu vào Chúng ta gọi một bài toán mà tập minh dụ 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 được cung cấp một minh dụ bài toán

i có độ dài n= |i|, thuật toán này có thể tạo ra nghiệm trong thời gian tối đa O(T(n)) Do đó, một bài toán cụ thể có thể giải quyết thời gian đa thức, nếu tồn

tại một thuật toán để giải quyết nó với thời gian O(nk) cho một vài hằng số k.

Bây giờ chúng ta có thể định nghĩa hình thức lớp P như tập các bài toánquyết định cụ thể giải được thời gian đa thức

Chúng ta có thể sử dụng các phép mã hóa để ánh xạ các bài toán trừutượng đến các bài toán cụ thể Đưa ra một một bài toán quyết định trừu tượng

Q ánh xạ một tập minh dụ I vào{0,1}, một mã hóa e: I  {0,1}* có thể được

dùng để cảm sinh một bài toán quyết định cụ thể có liên quan, mà chúng ta

biểu thị bởi e(Q) Nếu nghiệm cho một minh dụ bài toán trừu tượng i thuộc I

là Q(i)  {0,1}, thì nghiệm cho minh dụ bài toán cụ thể e(i) {0,1}* cũng là

Q(i) Với tư cách là một tính chất kỹ thuật, có thể một số chuỗi nhị phân

không biểu diễn một bài toán minh dụ trừu tượ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ư vậy được ánh xạ tùy ý đến 0

Vì thế, bài toán cụ thể tạo ra cùng các nghiệm như bài toán trừu tượng trêncác minh dụ chuỗi nhị phân biểu thị cho các phép mã hóa của các minh dụ bàitoá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ácphép 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 được phụ thuộcvà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 dưới

dạng 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 theo đơn phân- 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ộcvà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ờigian 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 tahiể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ộtbà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ảiquyết bằng thời gian đa thức Chẳng hạn, biểu các số nguyên theo cơ số 3 thay

vì 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 biểu diễn trong cơ số 3 có thể chuyển đếnmột số nguyên đã được biểu diễn trong cơ số 2 bằng thời gian đa thức

Trang 11

Chúng ta nói rằng một hàm số f : {0, 1}*  {0, 1}* là có thể tính toán được theo 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}*, sẽ tạo 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 e1 và e2 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

f12 và f21 như đối với bất kỳ i  I , chúng ta có f12(e1(i)) = e2(i) và f21(e2(i)) =

e1(i) Đó là, mã hóa e2(i) có thể đã tính từ việc mã hóa e1(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 e1 và e2 của một bài toántrừu tượng là đa thức quan hệ, thì bài toán đó là thời gian đa thức có thể giảiquyết hoặc không là độc lập việc mã hóa chúng ta dùng như theo các biểudiễn bổ đề

Bổ đề 34.1 : Cho Q là một bài toán quyết định trừu tượng trên một tập minh

dụ I, và cho e1 và e2 là các phép mã hóa có liên quan theo đa thức trên I Thì,

e1(Q)P khi và chỉ khi e2(Q)P.

Chứng minh :

Chúng ta chỉ cần chứng tỏ hướng tới, khi lùi lại là đối xứng Vì thế, cho

rằng, e1(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 e1(i) có thể đã được tính từ việc mã hóa e2(i) với thời gian O(n c) đối với một vài hằng

số c, tại n=|e2(i)| Để giải quyết bài toán e2(Q), trên dữ liệu vào e2(i), đầu tiên chúng ta tính e1(i) và sau đó chạy thuật toán cho e2(Q) trên e2(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ế |e1(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 e1(i) mất thời gian O(|e1(i)| k ) = O(n ck), là

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.

Về sau chúng ta hoàn toàn dùng một mã hóa là đa thức đã quan hệ vớichuẩ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ừutượ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

Trang 12

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ừ khichúng ta định rõ ràng điều trái ngược Chúng ta sẽ không chú ý sự khác biệtnà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 khuôn khổ 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ánthỏa được là làm cho nó dễ sử dụng máy móc của lý thuyết ngôn ngữ hìnhthứ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ỗirỗ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 1L 1

x 2L 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ừ quan điểm của lý thuyết ngôn ngữ, tập các minh dụ đối với bất kỳ các

bài toán quyết định Q là tập *, mà  = {0, 1} Bởi Q được mô tả bởi các minh dụ bài toán 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 mà chiều dài tối đa của nó là k }

Một khuôn khổ 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 quyết định 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 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.

Trang 13

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 được quyết định trong 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 quyết định x trong 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ể được 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 để tính một đường đi ngắn nhất từ u đến v trong G và sau đó so sánh khoảng cách có được với 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à dừng.

Trái lại, thuật toán này chạy vĩnh viễn Thuật toán này không quyết địnhđườ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 quyết định

đườ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 quyết định 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 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(complexity class) như một tập các ngôn ngữ, với tư cách là thành viên mà ở

đó được xác định bởi một độ đo phức, chẳng hạn thời gian chạy của một thuật

toán xác định một chuỗi x có thuộc về ngôn ngữ L Định nghĩa thực sự của

một lớp phức là một cái gì đó hơn kỹ thuật - độc giả đã quan tâm đến bởiHartmanis và Steams

Sử dụng khuôn khổ lý thuyết ngôn ngữ này, chúng ta có thể cung cấpmột định nghĩa khác của lớp phức P :

P = {L  {0,1}* : có tồn tại một thuật toán A mà quyết định L trong thời

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

Trang 14

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 minh định lý 2 là phi kiến tạo Đối với một ngôn ngữ

L P, chúng ta thực sự không thể biết một cận trên 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 một cận tồn tại, rằng một thuật toán A’ tồn tại có thể kiểm tra cậ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 quyết định 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 đathứ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 chu trình đơn dài nhất

trong một đồ thị vô hướng Nêu một quan hệ quyết định bài toán Nêu ngônngữ tương ứng để quyết định bài toán

3 Cho một phép mã hóa hình thức của các đồ thị có hướng dưới dạng các

chuỗi nhị phân dùng một phép biểu diễn ma trận-liền kề Như sử dụng mộtphép biểu danh sách-liền kề Chứng tỏ rằng hai phép biểu diễn là liên quantheo đ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 đathức 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ậttoá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 L1, L2 P, thì L1L2 

P,

Trang 15

2 XÁC MINH THỜI GIAN ĐA THỨC (POLYNOMIAL-TIME VERIFICATION):

Bây giờ ta xét các thuật toán “xác minh” tư cách thành viên trong các

ngôn ngữ Chẳng hạn, giả sử rằng với một minh dụ <G, u, v, k> của bài toán quyết định PATH, ta cũng có một đường đi p từ u đến v Ta có thể dễ dàng kiểm tra độ dài của p có phải tối đa là k hay không và nếu có ta có thể xem p

như một “chứng chỉ” thực sự thuộc về bài toán PATH Với bài toán quyếtđịnh PATH “chứng chỉ” dường như không làm ta quan tâm lắm Xét chocùng, PATH thuộc lớp P - trên thực thế, PATH có thể giải được trong thờigian tuyến tính- và do đó việc chứng minh tư cách thành viên cho một chứngchỉ đã cho sẽ kéo dài ngang bằng với việc giải quyết bài toán ngay từ đầu.Bây giờ, ta sẽ xét một bài toán mà biết rằng chưa có giải thuật quyết địnhtrong thời gian đa thức, tuy nhiên nếu ta có một chứng chỉ thì việc xác minh

nó là dễ dàng

2.1 Chu trình Hamilton (Hamiltonian cycles):

Bài toán tìm một chu trình hamilton trong một đồ thị vô hướng đã đượcnghiên cứu hơn một trăm năm qua Một cách hình thức, một chu trình

hamilton của một đồ thị vô hướng G = (V, E) là một chu trình đơn chứa tất cả các đỉnh trong V Một đồ thị chứa một chu trình hamilton được gọi là đồ thị

hamilton; Ngược lại được gọi là phi hamilton Bondy và Murty trích dẫn mộtbức thư của W R Hamilton mô tả một trò chơi toán học trên khối mười haimặt (Hình 2.(a)) như sau: một người chơi sẽ chỉ ra năm đỉnh liên tiếp bất kỳtrong đồ thị người chơi còn lại sẽ phải hoàn thành đường đi để tạo ra một chutrình chứa tất cả các đỉnh Khối mười hai mặt này là đồ thị hamilton và (Hình2.(a)) chỉ ra một chu trình hamilton Tuy nhiên,không phải tất cả các đồ thịđều là Hamilton, ví dụ (Hình (b)) là 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ị như thế là hamilton

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.

Chúng ta có thể định nghĩa bài toán chu trình hamilton, “Một đồ thị G có

HAM-CYCLE = {<G> : G là một đồ thị Hamilton}.

Một thuật toán như thế nào có thể quyết định ngôn ngữ HAM-CYCLE?

Căn cứ vào một minh dụ <G>, một thuật toán quyết định 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ị để

Trang 16

thấy nó có phải là một chu trình hamilton hay không Thời gian chạy củathuật toán này là gì? Nếu chúng ta sử dụng phép 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 , trong

đó n = |<G>| là độ dài mã hóa của G Có m! các phép hoán vị các đỉnh có thể

là O(n k ) với k là hằng số Vì thế, thuật toán này không chạy với thời gian đa

thức Sự thật, bài toán chu trình hamilton là NP-đầy đủ, như chúng ta sẽchứng tỏ trong phần 5

2.2 Các thuật toán xác minh (Verification algorithms) :

Xem xét 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

đồ thị G là Hamilton rồi xung phong chứng minh điều đó bằng cách đưa cho

bạn một chu trình hamilton Chắc chắn nó sẽ dễ dàng để xác minh chu trình

đã đưa ra đó có đúng không bằng cách: kiểm tra nó có phải là phép hoán vị

của các đỉnh của V và mỗi trong số các cạnh kề dọc theo chu trình có thực sự

tồn tại trong đồ thị hay không Một cách chắc chắn thuật toán xác minh này

có thể đã thực hiện với thời gian O(n 2 ); với n là độ dài mã hóa của G Như

vậy, một phép chứng minh rằng một chu trình hamilton tồn tại trong một đồthị có thể được xác minh trong thời gian đa thức

Ta định nghĩa một thuật toán xác minh A dưới dạng một thuật toán hai đối số (two-argument), mà đối số x là một chuỗi đầu 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 chỉ Một thuật toán hai đối số A xác minh một chuỗi đầu vào x nếu ở đó tồn tại một chứng

chỉ y sao cho A(x,y)=1 Ngôn ngữ được xác minh bởi một thuật toán xácminh A là:

L= { x{0, 1}* : có tồn tại y{0, 1}* sao cho 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 chỉ 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 chỉ nào chứng tỏ rằng x 

L Chẳng hạn, trong bài toán chu trình hamiton, chứng chỉ là danh sách các

đỉnh trong chu trình hamilton Nếu một đồ thị là Hamilton, chu trình

Hamilton của chính nó cung cấp đủ thông tin để xác minh điều này Ngượclại, nếu một đồ thị không phải là Hamilton, thì không có danh sách các đỉnhnào có có thể đánh lừa thuật toán xác minh tin rằng đồ thị đã đưa ra làhamilton, bởi thuật toán xác minh kiểm tra một cách cẩn thận “chu trình” đã

để đảm bảo là chắc chắn

2.3 Lớp phức NP (The complexity class NP):

Lớp phức NP là lớp các ngôn ngữ có thể được 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à 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 (| xc |) sao cho

A(x,y)=1 }.

Trang 17

Chúng ta nói rằng thuật toán A xác minh ngôn ngữ L trong thời gian đa

thức

Từ thảo luận trên về bài toán chu trình hamilton, dẫn đến 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, bởi 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

Ta vẫn chưa biết P = NP hay không, nhưng hầu hết các nhà nghiên cứutin 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ácbài toán có thể đã giải quyết một cách nhanh chóng Lớp NP bao gồm các bàitoán có thể được xác minh một cách nhanh chóng Có lẽ qua kinh nghiệm bạn

có thể đã biết rằng việc giải quyết một bài toán từ đầu phức tạp hơn việc xácminh một giải pháp được đưa ra một cách rõ ràng, đặc biệt khi làm việc trongthời gian ràng buộc Nói chung, các nhà khoa học máy tính tin rằng sự tươngđồng này mở rộng các lớp P và NP, và như vậy tin rằng NP gồm các ngônngữ 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ữ đầy đủ” Chúng ta sẽ nghiên cứu lớp này trong phần 3

“NP-Nhiều câu hỏi cơ bản khác vượt ra ngoài giới hạn P ≠ NP vẫn chưa đượcgiải quyết được Mặc dù, đã có nhiều công sức của nhiều nhà nghiên cứu đã

bỏ ra, thậm chí không một người nào biết lớp NP có bị đóng dưới phần bù

có bị đóng dưới phần bù hay không có thể được phát biểu như sau:

NP=co-NP Khi NP 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 ta không biết P = NP  co-NP hay khônghoặc khi nào mà có một số ngôn ngữ trong NP  co-NP – P hay không Hình

3 biểu diễn 4 khả năng có thể xảy ra

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 chắc xảy ra nhất (b) Nếu NP đóng dưới phần bù, thì NP=co-NP, thì không cần trường hợp 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à có thể xảy ra nhất.

Trang 18

Như vậy, sự hiểu biết của chúng ta về mối quan hệ chính xác giữa P và

NP là không đầy đủ Tuy nhiên, bằng cách khảo sát lý thuyết về tính đầy đủ

NP, chúng ta sẽ thấy rằng việc chứng tỏ các bài toán là khó từ một quan điểmthiết thực không quá lớn chúng ta tưởng

Bài tập:

1 Xét ngôn ngữ GRAPH-ISOMORPHISM = {<G1, G2> : G1 và G2 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 laf phi

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

chu trinhf hamilton, theo thứ tự, trong 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 2O(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ệuquả 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 x1,

x2, , xk,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ônngữ của công thức boolean mà là các phép lặp thừa Chỉ ra rằngTAUTOLOGY  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 Cho G là một đồ thị vô hướng liên thông với ít nhất 3 đỉnh và lấy G3 đồ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 G3 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À PHÉP RÚT GỌN (NP-COMLPETENESS AND REDUCIBILITY):

Có lẽ lý do thuyết phục nhất tại sao các nhà khoa học máy tính lý thuyếttin rằng P ≠ NP là sự tồn tại 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ể được giảitrong 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

Trang 19

đa thức, đó là, P = NP Mặc dù, nhiều năm nghiên cứu chưa có 1 giải thuậtthời gian đa thức nào được khám phá cho bài toán NP đầy đủ

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 trong thời gian đa thức, thì chúng ta có thể giảimỗi bài toán NP trong thời gian đa thức Thật vậy, 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

Theo một nghĩa nào đó, 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 “tính khó”tươ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à

“khả năng rút gọn thời gian đa thức” Sau đó chúng ta định nghĩa 1 cách hìnhthức các ngôn ngữ NP-đầy đủ và phác họa một phần chứng minh rằng mộtngôn ngữ như vậy đượ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 về khả năng rút gọn để chỉ ra rằng nhiều bàitoán khác là NP-đầy đủ

3.1 Sự rút gọn (Reducibility):

Theo trực giác, một bài toán Q có thể được rút gọn bài toán Q’ khác nếu bất kỳ đầu vào của Q có thể “dễ dàng được đặt lại” dưới dạng một đầu vào của Q’, giải pháp này cung cấp một giải pháp đến đầu vào 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 biến đổi nó thành 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 trường hợp này, thì Q là “không khó để giải quyếtt” hơn

Q’

Trở về khuôn khổ ngôn ngữ hình thức của quyết định các bài toán,

đến một ngôn ngữ L2, được viết L1  p L2 , nếu có tồn tại hàm tính toán theo

thời gian đa thức f : {0, 1}*  {0, 1}* sao cho tất cả x {0, 1}*.

x L1 nếu và chỉ nếu f(x) L2

Chúng ta gọi hàm f là hàm rút gọn và một thuật toán thời gian đa thức F dùng để tính toán f được gọi là một thuật toán rút gọn

Trang 20

Hình 4 Một minh họa của phép rút gọn thời gian đa thức 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 Bất kỳ x {0, 1}*, câu hỏi x L1 hay không sẽ có câu trả lời như câu hỏi f(x)  L 2 hay không.

Hình 4 minh họa ý tưởng của một phép rút gọn thời gian đa thức từ một

ngôn ngữ L1 đến ngôn ngữ L2 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 sao cho nếu x L1 , thì f(x) L2 Hơn nữa, nếu x L1 thì f(x) L2 Vì thế, hàm rút

gọn này ánh xạ bất kỳ đầu vào x của bài toán quyết định được đại diện bởi ngôn ngữ L1 đến một đầu vào của f(x) của bài toán được đại diện bởi ngôn ngữ L2 Cung cấp một trả lời f(x) L2 hay không, sẽ trực tiếp cung cấp trả

lời x L1 hay không

Các phép 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ữ khác thuộc về P

Bổ đề 3 : Nếu L1, L2 {0, 1}* là các ngôn ngữ sao cho L1  p L2, thì L2  P

hàm ý L1 P

Chứng minh :

Lấy A2 là một thuật toán thời gian đa thức mà nó quyết định L2 ,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 toán hàm rút gọn f Chúng ta sẽ đặt một thuật toán thời gian đa thức A1 quyết định L1

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ừ L1 thành L2 trong thời gian đa thức và A2

là một thuật toán thời gian đa thức quyết định L2 Minh họa một thuật toán A1

mà quyết định bất kì x  L1 hay không bằng cách sử dụng F để chuyển bất kỳ

dữ liệu vào x vào f(x) và sau đó sử dụng A2 để quyết định bất kì f(x)  L2

Hình 5 minh họa phần kiến tạo của A1 Đưa 1 dữ liệu vào x  {0, 1}*, thuật toán A1 này dùng F để chuyển x vào f(x) và sau đó nó dùng A2 để

kiểm tra bất kì f(x) L2 Đầu ra của A2 là giá trị được cung cấp như đầu ra từ

A1.

Sự đúng đắn của A1 là do đ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à A2 chạy với thời gian đa thức (xem hình I.5)

Trang 21

3.2 NP-đầy đủ (NP-completeness):

Các phép rút gọn thời gian đa thức cung cấp một biện pháp hình thức đểchứng tỏ một bài toán tối thiểu cũng khó bằng một bài toán khác, qua một

thừa số thời gian đa thức Đó là, nếu L1  p L2 , thì L1 là không khó hơn một

thừa số đa thức L2, là lí do tại sao “nhỏ hơn hoặc bằng” cho phép rút gọnmang tính gợi 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

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 nhất 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ụngquyết định khi P=NP?

Trang 22

Định lý 4:

Nếu có một bài toán NP-đầy đủ nào giải được trong thời gian đa thức thì P

= NP.Nếu có một bài toán trong NP nào mà không giải được trong thời gian

đa thức thì tất cả các bài toán NP-đầy đủ đều không giải được trong 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, theo chứng minh phát biểu thứ nhất của định lý đó.

Để chứng tỏ phát biểu thứ hai, giả sử tồn tại sự mâu thuẫn với phát biểuthứ nhất

Chính vì lý do này mà cuộc nghiên cứu vào câu hỏi P  NP xoay quanhcá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 tinrằng P  NP, dẫn đến các mối quan hệ giữa P, NP, và NPC biểu diễn ở hình6

Nhưng đối với tất cả chúng ta biết rằng, một người nào đó có thể thấymộ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, chưa có thuật toán thời gian đa thức nào cho bất kỳ bài toánNP-đầy đủ được tìm ra, nên chứng minh cho rằng một bài toán là NP-đầy đủ

sẽ cung cấp một 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 mãn mạch (Circuit Satisfiability):

Chúng ta đã định nghĩa khái niệm của một bài toán NP-đầy đủ, nhưngvới quan điểm này chúng ta chưa thực tế chứng minh rằng bất kỳ một bài toán

là NP đầy đủ Một khi chúng ta chứng minh có ít nhất một bài toán là NP-đầy

đủ, chúng ta có thể sử dụng khả năng rút gọn thời gian đa thức làm một công

cụ để chứng minh NP-đầy đủ của các bài toán khác Vì thế bây giờ chúng tatập trung vào việc chứng minh sự tồn tại của một bài toán NP đầy đủ : bàitoán thỏa mãn mạch

Trang 23

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 tài liệu này Thay vì thếchúng ta sẽ mô tả không chính thức 1 một chứng minh dựa trên sự hiểu biết

cơ bản về các mạch tổ hợp bool

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 1hà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 mãnmạ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ánthỏ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)

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ệuvà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ốigiá 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 ra của một phần tử đến dữ liệu vào của một phần tử khác, bằng cách

Trang 24

cung cấp giá trị dữ liệu cho phần tử đầu tiên sẽ cho ra giá trị dữ liệu vào củaphần tử thứ hai Hình 8, biểu diễn 2 mạch kết hợp boolean giống nhau; chúngkhác nhau chỉ một cổng Phần (a) của hình cũng chỉ giá trị trên các dây riêng

lẻ, 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ó có thể dẫn vàiphầ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ệuvà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ộtdâ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ạchchú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

Hình 8 Hai trường hợp của bài toán thỏa được mạch Hình (a), chỉ định (x1=1, x2=1, x3=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.

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àoboolean Chúng ta nói rằng một mạch kết hợp boolean dữ liệu ra 1 là chỉ địnhthỏ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 < x1=1, x2=1, x3=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 x1, x2 và x3 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

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, nó 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ácdây trong mạch Một phép có thể đặt một đồ thị mã hóa mà ánh xạ bất kỳ cho

Ngày đăng: 11/04/2015, 22:10

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w