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

Tìm hiểu độ phức tạp một số thuật toán

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 (186.18 KB, 25 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

-----------------------

Nguyễn Thế Quyền

TÌM HIỂU ĐỘ PHỨC TẠP MỘT SỐ THUẬT TOÁN

BẢN TÓM TẮT
LUẬN VĂN THẠC SĨ KHOA HỌC

Hà Nội - 2013


ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

-----------------------

Nguyễn Thế Quyền

TÌM HIỂU ĐỘ PHỨC TẠP MỘT SỐ THUẬTTOÁN

Chuyên ngành: Bảo đảm toán học cho máy tính và hệ thống tính toán
Mã số: 60.46.35

BẢN TÓM TẮT
LUẬN VĂN THẠC SĨ KHOA HỌC

NGƯỜI HƯỚNG DẪN KHOA HỌC


PGS.TS. NGUYỄN HỮU NGỰ

Hà Nội - 2013


MỞ ĐẦU
Lý thuyết độ phức tạp là một lĩnh vực trung tâm của khoa học máy
tính với các kết quả liên quan chặt chẽ với sự phát triển và sử dụng các
thuật toán. Nghiên cứu về lý thuyết độ phức tạp sẽ giúp chúng ta hiểu biết
sâu sắc và khám phá ra ranh giới của những vấn để “có thể” tính toán với
các nguồn tài nguyên hợp lý.
Bản luận văn này gồm có 3 chương. Trong đó, chương 1 trình bày
tóm tắt kiến thức về lý thuyết độ phức tạp như: máy Turing, thuật toán, ...
Chương 2 trình bày các khái niệm bài toán, độ phức tạp của bài toán trong
lý thuyết độ phức tạp. Trong chương này chúng tôi cũng liệt kê một số
nhóm bài toán quan trọng trong lý thuyết độ phức tạp như bài toán người
bán hàng, bài toán xếp ba lô, ... Trong chương 3, chúng tôi trình bày về
việc phân lớp các bài toán bao gồm các bài toán lớp P, NP và NPC. Chúng
tôi quan tâm đặc biệt đến lớp NPC, trong đó chúng tôi đi chứng minh một
số bài toán thuộc lớp NPC dựa trên một khái niệm quan trọng đó là phép
dẫn đa thức.
Bây giờ chúng tôi xin được trình bày lần lượt từng chương, bắt đầu
từ chương 1.
CHƯƠNG 1: KIẾN THỨC CHUẨN BỊ
Chúng tôi bắt đầu với khái niệm máy Turing.
1.1. Máy Turing
Máy Turing gồm có:
- Tập trạng thái trong hữu hạn
- Băng vô hạn hai phía (về lý thuyết có thể kéo dài tuỳ ý cả hai phía),
bảng tín hiệu vào, bảng tín hiệu trên băng, một đầu đọc-ghi.

q

...

B B B B a1 a2 ... ... ai ... ... an B B B ...
Một bước làm việc của máy gồm:
- Đầu đọc-ghi đọc tín hiệu trên băng
1


- Căn cứ vào trạng thái trong và tín hiệu đọc trên băng, đầu đọc-ghi
sẽ ghi một tín hiệu trên băng, dịch chuyển sang phải hoặc sang trái một ô,
và chuyển sang một trạng thái trong nào đó.
Quy ước khi máy bắt đầu làm việc thì trạng thái là trạng thái đầu của
máy, với input hữu hạn trên băng, đầu đọc-ghi nằm ở ký tự bên trái nhất
của input.
Tiếp theo, ta xét hai mô hình máy Turing tất định và máy Turing
không tất định.
1.2. Máy Turing tất định (deterministic)
Có thể định nghĩa một cách hình thức một máy Turing tất định như
sau: là một bộ M = (Q, Σ, Γ, F, q0, B, t1 ) trong đó:
- Γ: là bảng tín hiệu trên băng (hữu hạn)
- Σ: là bảng tín hiệu vào (hữu hạn), Σ ⊂ Γ
- Q: là tập trạng thái (trong) (hữu hạn)
- F: là hàm chuyển F: Q x Γ → Q x Γ x {L,R}
- q0: trạng thái ban đầu (q0 ∈ Q)
- t1: trạng thái kết thúc (t1 ∈ Q)
- B: ký tự trắng, B ∈ Γ, B ∉ Σ
Hàm chuyển F(q, a) = (q', a', D) có thể cho bằng bảng như sau:
a


...

...
q
(q', a', D)
...
Tại mỗi bước, máy ở trạng thái q, đầu đọc-ghi đọc tín hiệu a i tại ô
trên băng, hình trạng của máy có dạng a 1a2...ai-1qai...ak. Theo hàm chuyển
F(q, ai) = (q', c, D), máy sẽ chuyển sang trạng thái q', ghi c lên băng (thay
cho ai), đầu đoc/ghi chuyển sang phải hay sang trái một ô tùy theo D là R
hoặc L. Ta nói rằng máy M chuyển từ hình trạng
H = a1a2...ai-1qai...ak
sang hình trạng
H' = a1a2...q'ai-1cai+1...ak nếu D = L hoặc
H' = a1a2...ai-1cq'ai+1...ak nếu D = R
2


Ký hiệu H − H'.
Máy sẽ làm việc từng bước cho đến khi gặp hình trạng mà hàm
chuyển F(s,a) không xác định hoặc gặp trạng thái kết thúc t1.
Xâu x (input) trên bảng tín hiệu Σ (tức là x ∈ Σ*) gọi là được đoán
nhận bởi máy M nếu tồn tại dãy hình trạng H0, H1, ..., Hm sao cho
H0 − H1 − ...− Hm.
H0 là hình trạng ban đầu, input x được ghi trên băng, đầu đọc-ghi
nhìn vào ký tự đầu tiên của input, trạng thái của máy là q0, tức là:
H0 = q0a1a2...ai-1ai...an với x = a1a2...ai-1ai...an.
Hm có trạng thái là t1.
Tập N các xâu (ngôn ngữ trên Σ) thuộc Σ* gọi là được đoán nhận bởi

máy M nếu N = {x | x∈Σ*, x được đoán nhận bởi máy M}.
Ký hiệu q0 là trạng thái đầu, t1 là trạng thái kết thúc khẳng định.
Ví dụ: Máy Turing đoán nhận ngôn ngữ {x | x có độ dài chẵn}
q0
q1

0
(q1, B, R)
(q0, B, R)

1
(q1, B, R)
(q0, B, R)

b
(t1, B, ' ')
-

Với input 010110 ta có dãy hình trạng
(q0)010110 − 0(q1)10110 − 01(q0)0110 − 010(q1)110 −
0101(q0)10 − 01011(q1)0 − 010110(q0) − 010110(t1)
trạng thái cuối cùng là trạng thái kết thúc đoán nhận t1.
1.3. Máy Turing không tất định (non deterministic)
Định nghĩa như máy Turing tất định, trong đó hàm chuyển F là hàm
đa trị, nghĩa là F : Q x Σ → 2Q x Γ x {L,R}.
Tại mỗi bước, có thể chuyển sang bước sau bằng một trong các khả
năng tùy theo hàm chuyển F. Nếu có một nhánh đoán nhận input x thì xem
như máy đoán nhận input đó.
Giả sử F(s, a) = {(si1, ai1, Di1), (si2, ai2, Di2), ..., (sim, aim, Dim)} là một
tập (có thể rỗng). Với hình trạng H với trạng thái s và tín hiệu a được đọc

máy có thể chuyển đến một trong các hình trạng
H − Hi1 , H − Hi2 , ..., H − Him .
trong đó Hik có trạng thái sik và tín hiệu được ghi là aik, ...
3


Ví dụ:
q0

0
(q0,1,R)
(q1,1,R)

q1
q2

1

B

(q2,0,L)
(q0,1,R)

(t1,' ',' ')

Với w = 010
(q0)010

1(q0)10


1(q1)10

(q2)100

1(q0)00

11(q0)0

11(q1)0

111(q0) 111(q1)B
(t1)
Bây giờ chúng chúng tôi trình bày về thuật toán và dộ phức tạp của
thuật toán. Với một bài toán thì cần có thuật toán đề giải bài toán đó.
1.2. Khái niệm thuật toán (algorithm)
1.2.1. Khái niệm
Một cách không hình thức thì thuật toán là việc mô tả một cách chính
xác quá trình thực hiện trên các đối tượng để nhằm đạt được một kết quả
nào đó theo một yêu cầu cho trước.
Cần chú ý các đặc trưng hữu hạn trong thuật toán:
- Đối tượng hữu hạn, thao tác hữu hạn
- Cho kết quả qua một số hữu hạn bước
- Về lý thuyết cho phép khả năng kéo dài tuỳ ý (vô hạn tiềm năng).
Ta phân biệt hai loại thuật toán: tất định và không tất định. Đối với
thuật toán tất định tại mỗi thời điểm chỉ có không quá một bước tiếp theo.
Đối với thuật toán không tất định tại mỗi thời điểm có thể có một số khả
năng để lựa chọn bước tiếp theo.
1.2.2. Ví dụ về thuật toán
Ví dụ: Thuật toán sắp dãy số tăng bằng đổi chỗ trực tiếp
Input: n và dãy số n phần tử a1, a2, ..., an .

Output: Dãy số a1, a2, ..., an được sắp xếp tăng.
Mô tả cụ thể các bước:
1. i = 1
2. k = i + 1
3. Nếu ai > ak thì hoán vị ai với ak
4


4. k = k + 1
5. Nếu k <= n thì trở lại 3
6. i = i + 1
7. Nếu i < n thì trở lại 2.
Ngôn ngữ giả Pascal:
For i = 1 to n - 1 do
For k = i + 1 to n do
if ai > ak then hoán vị giá trị ai với ak cho nhau.
Sơ đồ khối:
Nhập n, dãy số a1, ..., an
i=1
k = i+1
ai>ak

Đ

hoán vị ai với ak

S
k = k+1
Đ


kS
i = i+1

Đ

iS
S

Đưa ra dãy số a1, ..., an

1.2.3. Luận đề Church-Turing
Luận đề Church-Turing phát biểu như sau: những bài toán có thể giải
được trên một mô hình tính toán nào đó được biết cho đến nay đều có thể
tính được trên máy Turing.
5


1.3. Độ phức tạp của thuật toán
Đối với một thuật toán để giải một bài toán ta cần đánh giá độ phức
tạp của thuật toán đó. Có thể đánh giá độ phức tạp của một thuật toán về
mặt thời gian (số bước tính toán) hoặc là về mặt không gian (bộ nhớ cần sử
dụng). Trong luận văn này ta chỉ quan tâm dến độ phức tạp về mặt thời
gian của thuật toán.
1.3.1 Độ phức tạp về thời gian
Giả sử A là một thuật toán. Ký hiệu:
T(x) là thời gian tính toán với đầu vào x.
T(n) = max {T(x), x có độ dài bằng n}.
Nếu A là thuật toán không tất định, thì T(n) là độ dài dài nhất trong

các nhánh làm việc với đầu vào x. Có thể dùng hàm T(n) để đánh giá độ
phức tạp của thuật toán A, T(n) tính theo trường hợp xấu nhất trong các
đầu vào có cùng độ dài.
Nếu T(n) của thuật toán A = O(g(n)) thì g(n) mới chỉ là chặn trên của
T(n). Nếu T(n) của thuật toán A = θ(g(n)) thì g(n) mới là tượng trưng chính
xác cho độ phức tạp của A. Tuy nhiên việc tính O dễ hơn việc tính θ. Nếu
T(n) của thuật toán A = O(g(n)) (hoặc tốt hơn là θ(g(n))) trong đó g(n) là
một đa thức theo n thì ta nói rằng thuật toán A làm việc với thời gian đa
thức, gọi tắt là thuật toán đa thức.
Thuật toán đa thức thường được xem là tốt.
1.3.2. Ví dụ cách tính độ phức tạp
Ví dụ 1: Thuật toán tìm kiếm nhị phân
Input: dãy số tăng a1, ..., an; số x.
Output: trả lời x có thuộc dãy hay không
Dùng thuật toán đệ quy DQ(a, b) (tìm trên đoạn con [d, c])
1. Nếu d = c và a(c) = x return "yes"
2. c = (a + b)/2
6


3. Nếu a(c) = x return "yes"
4. Nếu x < a(c) thì gọi DQ(a, c-1) else gọi DQ(a, c+1)
Để tìm nghiệm, gọi DQ(1, n)
Đánh giá độ phức tạp: T(2*k) = T(k) + 2.
T(1) = 1
T(2) = T(1) + 2
...
T(2k) = T(2k-1) + 2
Lấy 2k xấp xỉ n,
T(n) = T(2k) (cộng từng vế và khử)

= 2*k – 1 = 2*log2n - 1 = O(logn).
Tuy nhiên trên thực tế còn xét đến độ phức tạp trung bình:
Ttb(n) = tổng số các T(X) với X có độ dài n, chia cho số các dữ liệu
có thể với độ dài n.
Ví dụ 2: (tính độ phức tạp trung bình)
Máy Turing đoán nhận ngôn ngữ {X | X ∈ {0,1}* có ít nhất một chữ
số 1}
Số dữ liệu có thể với độ dài n là s = 2n
Số các X không có chữ số 1 (không được đoán nhận) là 1 (duy nhất
"00...0"), thời gian T(X) = n, tỷ lệ không đoán nhận là T0(n) = n/s.
Với i ≤ n thì số các X (được đoán nhận) có X(i) = '1', và X(k) = '0'
với k < i, là 2n-i, với thời gian T(X) = i.
Tổng thời gian tính với các X này là:
h = 1*2n-1 + 2*2n-2 + ... + n*2n-n
Tỷ lệ đoán nhận là T1(n) = h/s = t
t = 1*2-1 + 2*2-2 + ... + (n-1)*2-(n-1) + n*2-n
Đặt c = 1/2 (khi đó T0(n) = n/s = n*cn)
t = c + 2*c2 + ... + (n-1)*cn-1 + n*cn
7


c*t = c2 + 2*c3 + ... + (n-1)*cn + n*cn+1
t - c*t = c + c2 + ... + cn + n*cn+1 = c*[(1- cn)/(1- c) - n*cn]
T1(n) = t = c*[(1- cn)/(1- c) - n*cn ]/(1-c) (vì c/(1-c) = 1)
Vậy Ttb(n) = T1(n) + T0(n) = (1- cn)/(1- c) - n*cn + n*cn = 2 - 1/2n-1.
Trong khi đó độ phức tạp T(n) = n.
Bây giờ ta sẽ chuyển sang một nội dung quan trọng tiếp theo đó là
khái niệm bài toán và độ phức tạp của bài toán.

8



Chương 2. BÀI TOÁN VÀ ĐỘ PHỨC TẠP CỦA BÀI TOÁN
2.1. Bài toán là gì?
Trong giới hạn của luận văn này thì bài toán là một vấn đề phù hợp
với việc tính toán của máy tính và tập các kết quả chính xác.
Ví dụ: Việc tìm kiếm một bản án cho bị cáo hay việc dịch một văn
bản tiếng Đức sang một ngôn ngữ khác không phải là các bài toán vì chúng
phụ không phù hợp với tính toán bằng máy tính hoặc tập kết quả chính xác
không rõ ràng. Việc tìm kiếm đường đi ngắn nhất từ một đỉnh s đến một
đỉnh t rõ ràng là một bài toán.
Sau đây ta sẽ liệt kê danh sách một số bài toán quan trọng trong lý
thuyết độ phức tạp.
2.2. Một số bài toán quan trọng
1)
Các bài toán người bán hàng (TSP)
Bài toán người bán hàng (TSP): là bài toán tìm kiếm một chu trình
ngắn nhất qua n thành phố đúng một lần và quay trở lại điểm xuất phát của
nó. Các thành phố được ký hiệu bằng 1, ..., n và các khoảng cách giữa các
thành phố là di,j (1 ≤ i, j ≤ n). Các khoảng cách được chọn từ N ∪ {∞}, và
giá trị ∞ có nghĩa là không có sự kết nối trực tiếp giữa hai thành phố cụ
thể. Một chu trình là một phép hoán vị π của {1, …, n}, do đó các thành
phố đã đến được sắp xếp theo thứ tự là π(1), π(2), …, π(n), π(1). Giá trị của
một chu trình π được tính bởi:
dπ(1), π(2) + dπ(2), π(3) + … + dπ(n-1), π(n) + dπ(n), π(1)
và một chu trình có giá trị cực tiểu được tính toán.
2)
Các bài toán xếp ba lô (KNAPCK)
Các hành khách muốn thu xếp hành lý trong giới hạn 20 kg theo quy
định của hàng không có thể áp dụng bài toán xếp ba lô (KNAPSACK).

Trọng lượng giới hạn W∈N phải được giám sát và có n vật cần mang theo.
Đồ vật thứ i có trọng lượng w i∈N và có tiện ích ui ∈ N. Hành khách không
được phép mang các đồ vật có tổng trọng lượng vượt quá W. Mục tiêu là
tối đa hoá tổng tiện ích của tất cả các đồ vật được chọn
3)
Các bài toán về phân vùng
9


Trường hợp đặc biệt với ui = wi cho tất cả các đồ vật. Hơn nữa, W =
(w1 + w2 + … + wn)/2 và chúng ta xem xét bài toán quyết định là liệu
chúng ta có thể đạt được trọng lượng tối đa cho phép hay không, thì bài
toán sẽ tương đương với câu hỏi liệu tất cả các đồ vật có thể được chia
thành hai nhóm có tổng trọng lượng giống nhau không. Bài toán phân vùng
cũng là một trường hợp đặc biệt của bài toán đóng thùng (BINPACKING),
trong đó các thùng có kích thước b có sẵn, chúng ta phải đóng thùng n đồ
vật với các kích cỡ u1, u2, ..., un vào càng ít thùng càng tốt.
4)
Các bài toán giám sát (hoặc phủ)
Một bài toán giám sát điển hình là một bài toán triển lãm nghệ thuật.
Yêu cầu đưa ra là giám sát tất cả các bức tường của một phòng triển lãm
với càng ít máy quay càng tốt. Chúng ta sẽ hạn chế trong các bài toán giám
sát trên các đồ thị vô hướng, trong trường hợp đó chúng thường được gọi
là các bài toán phủ. Trong một bài toán phủ đỉnh (VERTEXCOVER), mỗi
đỉnh sẽ theo dõi tất cả các cạnh liên quan tới nó, và tất cả các cạnh được
theo dõi với càng ít đỉnh càng tốt. Trong một bài toán phủ cạnh
(EDGECOVER), các vai trò đảo ngược lại: mỗi cạnh theo dõi hai đỉnh liên
quan đến nó, các đỉnh sẽ được giám sát với càng ít cạnh càng tốt.
5)
Các bài toán clique (CLIQUE)

Các đỉnh của đồ thị có thể được sử dụng để biểu diễn con người, các
cạnh sẽ biểu diễn mối quan hệ giữa mọi người. Một clique được định nghĩa
là một nhóm trong đó mỗi người thích những người khác trong nhóm.
Trong bài toán phủ clique (CLIQUECOVER), các đỉnh của một đồ thị
phải được phân chia thành càng ít tập hợp càng tốt, theo cách như vậy mỗi
tập hợp tạo thành một clique. Trong một bài toán clique (ký hiệu là
CLIQUE), một clique lớn nhất có thể sẽ được tính toán. Một anti-clique
(“không ai thích ai cả”, giữa hai đỉnh bất kỳ không có một cạnh nào) được
gọi là một tập hợp độc lập, và bài toán tính toán một tập hợp độc lập lớn
nhất được gọi là INDEPENTSET.
6)
Các bài toán xây dựng nhóm
Xây dựng nhóm có nghĩa là phân chia những người với khả năng
khác nhau vào các nhóm hợp tác, trong đó các thành viên của mỗi nhóm
10


phải làm việc cùng nhau. Đối với bài toán k-DM (đối sánh k chiều, nghĩa
là xây dựng các nhóm có kích thước k), chúng ta có sẵn k nhóm người
(mỗi nhóm đại diện cho một trong k khả năng), và danh sách các nhóm k
thành viên tiềm năng, trong đó mỗi người đến từ các nhóm khả năng. Mục
đích là để hình thành nên càng nhiều nhóm càng tốt với hạn chế là mỗi
người chỉ có thể được tham gia vào một nhóm. 2-DM cũng được biết đến
như là bài toán hôn nhân: hai “khả năng” được hiểu như là hai giới tính,
một nhóm có tiềm năng được xem như là một cuộc “hôn nhân bền vững”,
và mục tiêu là tối đa hoá số lượng các cuộc hôn nhân bền vững.
7)
Các bài toán luồng tối ưu
Trong bài toán luồng qua mạng (NETWORKFLOW), người ta tìm
kiếm các luồng tối đa trong các mạng. Chúng ta chỉ quan tâm đến bài toán

cơ bản mà trong đó chúng ta tìm kiếm để tối đa hoá luồng từ s đến t trong
một đồ thị có hướng. Luồng f(e) chạy theo một cạnh e phải là số nguyên
không âm bị chặn trên bởi khả năng c(e) của cạnh đó. Luồng tổng đạt đến
một đỉnh v ∉ {s, t}, nghĩa là tổng số f(e) với e = (., v) phải bằng luồng tổng
rời khỏi v, tức là tổng số f(e) với e = {v, .}. Đỉnh nguồn s không có bất kỳ
cạnh nào đi vào và đỉnh đích t không có bất kỳ cạnh nào đi qua.
8)
Các bài toán vô địch trong giải đấu thể thao
Bài toán vô địch (CHAMPIONSHIP) cơ bản là một bài toán quyết
định. Một cổ động viên tự hỏi tại một thời điểm cụ thể trong mùa giải liệu
có thể (ít nhất là về mặt lý thuyết) đội bóng yêu thích của mình sẽ vô địch
trong giải đấu được không. Cho biết xếp hạng hiện tại của mỗi đội chơi và
có một danh sách các trận đấu còn được chơi. Đội được chọn có thể trở
thành nhà vô địch nếu có kết quả tiềm năng của các các trận đấu còn lại
sao cho đến cuối giải không đội nào khác có nhiều điểm hơn (nếu cần thiết,
đội chơi có thể cũng cần phải có hiệu số bàn thắng thua tốt nhất). Ngoài ra,
một trong những quy tắc sau đây phải chỉ rõ bao nhiêu điểm đạt được trong
mỗi trận đấu
9)
Các bài toán xác minh
Đối với lớp của các bài toán xác minh, chúng ta đề cập tới lĩnh vực
phần cứng. Bài toán cơ bản là liệu đặc tả S và nhận dạng R của một chíp có
11


mô tả cùng một hàm số Boolean không. Tức là, chúng ta có các mô tả S và
R của các hàm Boolean f và g và tự hỏi liệu f(a) = g(a) với tất cả các yếu tố
đầu vào a không. Vì chúng ta thực hiện các thao tác bit xác minh, có thể
giả sử rằng f, g: {0, 1}n → {0, 1}. Tính chất f ≠ g tương đương với tồn tại
một a mà (f ⊕ g)(a) = 1 (⊕ = XOR). Vì vậy, chúng ta đặt ra câu hỏi liệu h

= f ⊕ g có thể thoả được không, tức là liệu h có thể cho ra giá trị 1 không.
Bài toán quyết định này còn được gọi là bài toán thoả được.
10) Các bài toán trong lý thuyết số
Mật mã học hiện đại có kết nối chặt chẽ với các bài toán lý thuyết số,
trong đó các số rất lớn được sử dụng. Ở đây chúng ta phải lưu ý rằng, biểu
diễn nhị phân của đầu vào n chỉ có độ dài [log(n + 1)]. Trong trường học,
hầu hết chúng ta học thuật toán về cộng các phân số đòi hỏi chúng ta phải
tính toán các mẫu số chung, và để làm được chúng ta sẽ phân chia mẫu số
thành thừa số nguyên tố. Đây là bài toán tạo thừa số (FACT).
Các bài toán được chia ra làm ba loại: bài toán tối ưu hoá, bài toán
xác định và bài toán quyết định. Về nguyên tắc mọi bài toán đều có thể
biểu diễn lại dưới dạng bài toán quyết định.
2.3. Độ phức tạp của bài toán
Đối với một bài toán thì có rất nhiều thuật toán để giải bài toán đó.
Ký hiệu TA(n) = max {T(x), x là đầu vào có độ dài n} là độ phức tạp
của một thuật toán A.
Ta có thể định nghĩa độ phức tạp của một bài toán như sau:
TB(n) = inf {TA(n), A là một thuật toán giải bài toán B}
Thường thì rất khó tính được độ phức tạp của bài toán mà chỉ biết
được cận trên và cận dưới của độ phức tạp của bài toán.
Cuối cùng chúng chúng tôi trình bày về các lớp bài toán dựa trên độ
phức tạp của chúng.

12


CHƯƠNG 3: PHÂN LỚP CÁC BÀI TOÁN THEO ĐỘ PHỨC TẠP
3.1. Lớp các bài toán P, NP và mối quan hệ giữa chúng
3.1.1. Lớp P
Bao gồm các bài toán giải được bằng máy Turing trong thời gian đa

thức.
Ví dụ: bài toán tìm ước chung lớn nhất, bài toán kiểm nghiệm tính
nguyên tố, ...
3.1.2. Lớp NP
Bao gồm các bài toán giải được bằng máy Turing không đơn định
trong thời gian đa thức
Ví dụ: bài toán người bán hàng, bài toán xếp ba lô, ...
Rõ ràng là P ⊆ NP.
Bây giờ ta chuyển sang lớp các bài toán NPC.
3.2. Lớp các bài toán NPC
Trước hết ta đi xét khái niệm về phép dẫn đa thức.
3.2.1. Phép dẫn đa thức (ký hiệu ∝)
Phép biến đổi f được gọi là phép dẫn đa thức từ bài toán Π1 về bài
toán Π2 nếu nó thoả mãn hai điều kiện sau:
- Biến đổi f được thực hiện trong thời gian đa thức bởi một máy
Turing tất định
- Biến đổi mọi đầu vào của Π1 thành đầu vào của Π2 sao cho ...
Phép biến đổi đa thức được sử dụng để chứng minh một số bài toán
NPC.
3.2.2. Lớp các bài toán NPC
Một bài toán thuộc lớp NP mà mọi bài toán thuộc lớp NP khác đều
dẫn được về nó với thời gian đa thức được gọi là bài toán NPC.
Như vậy Π là một bài toán NPC nếu nó thoả mãn:
13


o Π ∈ NP
o Với mọi Π’ ∈ NP thì đều dẫn được về Π trong thời gian đa
thức
Bây giờ ta xét bài toán SAT, cùng với định lý khẳng định nó là bài

toán NPC.
3.2.2.1. Bài toán SAT. Định lý Cook
Bài toán SAT
Đầu vào:
Câu hỏi:
Định lý Cook: Bài toán SAT là NPC
Chứng minh:
Ta chỉ trình bày những ý chính của chứng minh.
Trước hết ta dễ dàng thấy là SAT ∈ NP. Một thuật toán không tất
định chỉ cần phỏng đoán một phép gán thực trị “truth assignment” là t cho
các biến logic, sau đó kiểm tra xem phép gán t này có thoả được tập mệnh
đề C không. Điều này có thể dễ dàng thực hiện trong thời gian đa thức.
Bước tiếp theo ta sẽ chỉ ra rằng với mọi Π ∈ NP thì dẫn được về
SAT trong thời gian đa thức, nói cách khác là tồn tại một phép biến đổi đa
thức fL từ mỗi bài toán Π ∈ NP về SAT.
Ta sẽ chuyển bài toán SAT về ngôn ngữ L = L[SAT,e] với e là một
lược đồ mã hoá hợp lý nào đó. Chúng ta phải chứng tỏ rằng với mọi ngôn
ngữ L∈ NP thì L ∝ LSAT.
Ký hiệu M là một chương trình NTDM thời gian đa thức tuỳ ý, xác
định bởi Γ, Σ*, b, Q, q0, qY, qN và δ, đoán nhận ngôn ngữ L = L M. Ngoài ra,
cho p(n) là một đa thức trên tập các số nguyên, nó giới hạn hàm phức tạp
thời gian TM(n). (Không mất tính tổng quát, ta có thể giả sử p(n) ≥ n với
mọi n ∈ Z+). Phép biến đổi tổng quát fL sẽ nhận được dưới dạng M, Γ, Σ*,
b, Q, q0, qY, qN, δ và p.
14


fL có tính chất là đối với mọi x ∈ Σ*, x ∈ L nếu và chỉ nếu fL(x) có một
phép gán thực trị thoả được. Điểm mấu chốt khi xây dựng fL là cho thấy cách
mà tập các mệnh đề được sử dụng để kiểm tra xem một đầu vào x có được

chấp nhận bởi chương trình NDTM là M không, tức là x ∈ L không.
Nếu đầu vào x

∈ Σ*

được chấp nhận bởi M, thì chúng ta biết rằng có

một tính toán chấp nhận được cho M trên x sao cho cả số bước trong giai
đoạn kiểm tra và số ký hiệu trong xâu phỏng đoán giới hạn bởi p(n) với n =
|x|. Một tính toán như vậy sẽ chỉ liên quan đến các ô được đánh số từ -p(n)
tới p(n)+1, vì đầu đọc-ghi bắt đầu từ ô 1 di chuyển tối đa là một ô tại mỗi
bước chuyển. Trạng thái của việc tính toán kiểm tra tại một thời điểm có
thể được xác định hoàn toàn, bằng cách đưa ra nội dung của các ô này,
trạng thái hiện tại, và vị trí của đầu đọc-ghi. Hơn nữa, vì có không nhiều
hơn p(n) bước trong việc tính toán kiểm tra, có nhiều nhất là p(n) +1 thời
điểm riêng biệt phải được xem xét. Điều này cho phép chúng ta mô tả một
tính toán như vậy một cách đầy đủ, chỉ sử dụng một số giới hạn các biến
Boolean và một phép gán thực trị cho chúng.
Tập các biến U được dùng cho mục đích xây dựng f L. Gán nhãn các
phần tử của Q là q0, q1 = qY, q2 = qN, q3, ..., qr với r = |Q|-1 và gán nhãn các
phần tử của

Γ

là s0 = b, s1, s2, ..., sv với v = | Γ |-1. Sẽ có ba loại biến, từng

loại có một ý nghĩa cụ thể xác định ở Hình 4. Cụm từ “tại thời điểm i” có
nghĩa là “trong lúc hoàn thành bước i của việc tính toán kiểm tra”.
Biến
Q[i,k]

H[i,j]
S[i,j,k]

Phạm vi

Ý nghĩa

0 ≤ i ≤ p(n)
0≤k≤r
0 ≤ i ≤ p(n)
-p(n) ≤ j ≤ p(n) + 1
0 ≤ i ≤ p(n)
-p(n) ≤ j ≤ p(n) + 1
0≤k≤v

Tại thời điểm i, M ở trạng thái
qk
Tại thời điểm i, đầu đọc-ghi
đang đọc ô j
Tại thời điểm i, nội dung của ô j
là ký hiệu sk

Hình 4. Các biến trong fL(x) và ý nghĩa của chúng.
15


Một tính toán của M sẽ tạo ra một phép gán thực trị cho các biến này
một cách ràng, với quy ước là nếu chương trình dừng trước thời gian p(n)
thì cấu hình vẫn giữ nguyên ở tất cả thời điểm tiếp theo, giữ nguyên trạng
thái dừng, ví trí đầu đọc-ghi và nội dung băng. Nội dung của băng tại thời

điểm 0 chứa đầu vào x được viết trong các ô từ 1 đến n, và xâu phỏng đoán
w được viết trong các ô từ -1 đến -|w|, các ô còn lại là trống.
Theo một phép gán thực trị tùy ý, một ô cho trước có thể chứa nhiều
kí hiệu tại một thời điểm, máy có thể cùng lúc ở vài trạng thái khác nhau,
và đầu đọc-ghi có thể ở trong tập con bất kỳ của các vị trí –p(n) tới p(n)+1.
Biến đổi fL làm việc bằng cách xây dựng một tập các mệnh đề liên quan
đến các biến này sao cho một phép gán thực trị là thoả được nếu và chỉ nếu
nó là phép gán thực trị được tạo ra bởi một tính toán chấp nhận được cho x
mà giai đoan kiểm tra có p(n) bước hoặc ít hơn, và xâu phỏng đoán có độ
dài tối đa p(n). Vì vậy ta sẽ có:
x∈L

⇔ có một tính toán chấp nhận được của M trên x
⇔ có một tính toán chấp nhận được của M trên x với p(n)
bước hoặc ít hơn trong giai đoạn kiểm tra và với xâu được
đoán có độ dài chính xác bằng p(n).
⇔ có một phép gán thực trị thỏa được cho tập mệnh đề trong
fL(x).

Điều này có nghĩa là fL thỏa mãn một trong hai điều kiện yêu cầu của
một biến đổi đa thức. Điều kiện còn lại là f L có thể được thực hiện trong
thời gian đa thức, sẽ được kiểm chứng một cách dễ dàng một khi chúng ta
đã hoàn thành mô tả về fL.
Các mệnh đề trong fL(x) có thể phân chia thành sáu nhóm, mỗi nhóm
áp đặt một loại hạn chế riêng biệt trên phép gán thực trị thoả được bất
kỳ như trong Hình 5.

16



Nhóm mệnh đề

Hạn chế được áp đặt

G1

Tại thời điểm i, M ở chính xác một trạng thái.

G2

Tại thời điểm i, đầu đọc-ghi đọc chính xác một ô.

G3

G4

G5

Tại thời điểm i, mỗi ô chứa chính xác một ký hiệu
của Γ .
Tại thời điểm 0, tính toán ở cấu hình ban đầu với sự
kiểm tra của đầu vào x.
Trước thời gian p(n), M đã vào trạng thái là qY và
do đó đã chấp nhận x.
Mỗi thời điểm i, 0

G6




i < p(n), cấu hình của M tại

thời điểm i+1 theo sau bởi một áp dụng duy nhất
của hàm chuyển δ từ cấu hình tại thời điểm i.

Hình 5. Các nhóm mệnh đề trong fL và các hạn chế áp đặt trên phép gán
thực trị.
Nhận xét rằng, nếu tất cả sáu nhóm mệnh đề đều thực hiện nhiệm vụ
dự định của chúng thì một phép thực trị thoả được sẽ phải tương ứng với
tính toán chấp nhận mong muốn cho x. Vì vậy, chúng ta chỉ cần chứng tỏ
rằng cách mà các nhóm mệnh đề thực hiện nhiệm vụ của chúng là có thể
xây dựng được.
Nhóm G1 bao gồm những mệnh đề sau:
{Q[i,0], Q[i,1], ..., Q[i,r]}, 0 ≤ i ≤ p(n)
{ Q[ i, j ] , Q[ i, j '] }, 0 ≤ i ≤ p(n), 0 ≤ j < j’≤ r
(p(n) + 1) mệnh đề đầu tiên có thể đồng thời được thỏa mãn nếu và
chỉ nếu, tại mỗi thời điểm i, M ở trong ít nhất một trạng thái. (p(n) + 1)(r +
1)(r/2) mệnh đề còn lại có thể đồng thời thỏa mãn nếu và chỉ nếu không có
thời điểm i nào mà M ở nhiều hơn một trạng thái. Do đó
nhiệm vụ của nó.
17

G1

thực hiện


Nhóm G2 và G3 được xây dựng tương tự, và nhóm G4 và G5 đều khá
đơn giản mỗi nhóm chỉ bao gồm các mệnh đề một literal. Hình 6 mô tả đầy
đủ năm nhóm đầu tiên. Chú ý rằng số mệnh đề trong các nhóm, và số

literals lớn nhất xuất hiện trong mỗi mệnh đề đều bị chặn bởi hàm đa thức
của n (vì r và v là các hằng số xác định bởi M, do đó bởi L).
Nhóm mệnh đề cuối cùng G6, đảm bảo rằng mỗi cấu hình tiếp theo
trong tính toán theo sau cấu hình trước đó bởi một bước của chương trình
M, là phức tạp hơn một chút. Nó bao gồm hai nhóm con các mệnh đề.
Nhóm con đầu tiên đảm bảo rằng nếu đầu đọc-ghi không quét ô j tại
thời điểm i, thì kí hiệu trong ô j không thay đổi giữa thời điểm i và i+1.
Những mệnh đề trong nhóm con này như sau:
{ S [ i, j , l ] , H[i,j], S[i+1,j,l]}, 0 ≤ i < p(n), -p(n) ≤ j ≤ p(n)+1, 0 ≤ l ≤ v
Với mỗi thời điểm i, ô j và kí hiệu s l, nếu đầu đọc-ghi không quét ô j
tại thời điểm i và ô j chứa sl tại thời điểm i nhưng không chứa tại thời điểm
i+1 thì mệnh đề ở trên dựa trên i, j và l sẽ không thỏa được (ngược lại thì
nó sẽ thỏa được). Do đó, 2(p(n)+1) 2(v+1) mệnh đề trong nhóm con này sẽ
thực hiện nhiệm vụ của chúng.
Nhóm mệnh đề
G1

Các mệnh đề trong nhóm
{Q[i,0], Q[i,1], ..., Q[i,r]}, 0 ≤ i ≤ p (n)
{ Q[i, j ] , Q[ i, j '] }, 0 ≤ i ≤ p(n), 0 ≤ j < j’ ≤ r

G2

{H[i,-p(n)], H[i,-p(n)+1], ..., H[i,p(n)+1]}, 0 ≤ i ≤ p(n)
{ H [i, j ] ,

G3

H [ i, j '] },


0 ≤ i ≤ p(n), -p(n) ≤ j < j’ ≤ p(n)+1

{S[i,j,0], S[i,j,1],...., S[i,j,v]}, 0 ≤ i ≤ p(n), -p(n) ≤ j≤ p(n)

+1
{ S[i, j, k ] , S [ i, j , k '] }, 0 ≤ i ≤ p(n), -p(n) ≤ j ≤ p(n)+1, 0 ≤ k≤
k’≤ v
18


G4

{Q[0,0]}, {H[0,1]}, {S[0,0,0]},
{S[0,1,k1]}, {S[0,2,k2]}, …, {S[0,n,kn]},
{S[0,n+1,0]}, {S[0,n+2,0]}, …, {S[0,p(n)+1,0]}
trong đó x =

G5

s k1 s k2 ...s kn

{Q[p(n),1]}
Hình 6. Năm nhóm mệnh đề đầu tiên trong fL(x).

Nhóm con còn lại của G6 đảm bảo những chuyển đổi từ một cấu hình
sang cấu hình tiếp theo phù hợp với hàm chuyển δ cho M.
Với mỗi bộ (i, j, k, l), 0 ≤ i < p(n), -p(n) ≤ j ≤ p(n)+1, 0 ≤ k ≤ r, và 0
≤ l ≤ v, nhóm con này gồm có các mệnh đề sau:
{ H [i, j ] , Q[ i, k ] ],


S [i, j , l ] ,

H[i+1, j+ ∆]}

{ H [i, j ] ,

Q[i, k ] ], S [i, j , l ] ,

Q[i+1, k’]}

{ H [i, j ] ,

Q[i, k ] ], S [i, j , l ] ,

S[i+1, j,l’]}

trong đó nếu qk ∈ Q-{qy, qN} thì giá trị của ∆, k’, l’ thoả mãn δ(qk, sl) = (qk’,
sl’, ∆), và nếu qk ∈{qY, qN} thì ∆ = 0, k’ = k và l’ = l.
Không khó để thấy rằng 6(p(n))(p(n) + 1)(r + 1)(v + 1) mệnh đề này
áp đặt những hạn chế mong muốn trên các phép gán thực trị thoả được.
Vì vậy, ta đã cho thấy cách xây dựng các nhóm mệnh đề từ G 1 tới G6
thực hiện các nhiệm vụ được nói ở trên. Nếu x ∈ L thì có một tính toán
chấp nhận của M trên x có chiều dài p(n) hoặc ít hơn, và tính toán này bắt
buộc một phép gán thực trị phải thoả mãn tất cả các mệnh đề trong C = G 1
∪ G2 ∪ G3 ∪ G4 ∪ G5 ∪ G6.
Ngược lại, việc xây dựng C là một phép gán thực trị thoả được cho C
phải tương ứng với một tính toán chấp nhận của M trên x. Nó kéo theo là
fL(x) có một phép gán thực trị thỏa được nếu và chỉ nếu x ∈ L.
Tất cả những gì còn cần chứng tỏ là đối với bất kỳ ngôn ngữ L cố
định, fL(x) có thể được xây dựng từ x trong thời gian bị chặn bởi một hàm

19


đa thức của n = |x|. Cho trước L, chúng ta chọn một chương trình NDTM
nào đó là M đoán nhận L trong thời gian bị chặn bởi một đa thức p. Giới
hạn đa thức của việc tính toán tập các biến U và tập mệnh đề C được suy
trực tiếp một khi chúng ta chứng tỏ rằng Length[fL(x)] là bị chặn trên bởi
một hàm đa thức của n, trong đó Length[I] là độ dài của một chuỗi mã hóa
thể hiện I theo một lược đồ mã hoá hợp lý. Hàm Length “hợp lý” như vậy
cho SAT được cho trước, chẳng hạn bằng |U|.|C|. Không mệnh đề nào có
thể chứa nhiều hơn 2.|U| literal (đó là tổng số literal), và số ký hiệu cần
thiết để mô tả mỗi literal được giới hạn đa thức. Vì r và v được cố định
trước và chỉ có thể thêm vào các hằng số vào |U| và |C|, chúng ta có |U| =
O(p(n)2) và |C| = O(p(n)2). Do đó, Length[fL(x)] = |U|.|C| = O(p(n)4), và
được giới hạn bởi một hàm đa thức của n như mong muốn.
Vì vậy, biến đổi fL có thể được tính bởi một thuật toán thời gian đa
thức và ta kết luận rằng với mỗi L ∈ NP, fL là một biến đổi đa thức từ L về
SAT. Vậy SAT là NP-đầy đủ.
3.2.4.2. Bài toán 3-SATIFIABILITY (3SAT)
- Đầu vào: Cho tập các mệnh đề C = {c 1, c2, ..., cm} dựa trên một tập
hữu hạn các biến U sao cho |ci| = 3 với 1 ≤ i ≤ m.
- Câu hỏi: Có tồn tại một phép gán thực trị cho U mà thỏa mãn tất cả
các mệnh đề trong C?
3.2.4.3. Bài toán 3-DIMENSIONAL MATCHING (3DM)
Bài toán 3DM có thể mô tả như sau:
- Đầu vào: Một tập M ⊆ W x X x Y; với W, X, và Y là các tập rời
nhau và đều có q phần tử.
- Câu hỏi: M có chứa một đối sánh là một tập con M ’ ⊆ M sao cho |
M’| = q và không có bất kì hai phần tử nào của M ’ có chung thành phần với
nhau?

3.2.4.4. Bài toán VERTEX COVER (VC)
20


- Đầu vào: Cho đồ thị G = (V,E) và số nguyên dương k thoả mãn k ≤ |V|
- Câu hỏi: Tồn tại hay không một tập con V ’ của V sao cho |V’|≤ k và
mỗi cạnh {u, e} ∈ E thì một trong hai đỉnh u hoặc e phải thuộc V’.
3.2.4.5. Bài toán CLIQUE
- Đầu vào: Cho đồ thị G = (V,E) và số nguyên dương k thoả mãn k ≤ |V|
- Câu hỏi: Tồn tại hay không một tập con V’ của V sao cho |V’| ≥ k
mà mọi cặp đỉnh trong V’ đều được nối bởi một cạnh trong E.
3.2.4.6. Bài toán HAMILTON CIRCUIL (HC)
- Đầu vào: Cho đồ thị G = (V,E)
- Câu hỏi: G có chứa một chu trình đơn đi qua mọi đỉnh hay không?
3.2.4.7. Bài toán PARTITION
- Đầu vào: Một tập hữu hạn A và một “trọng số” s(a) ∈ Z+ cho mỗi a ∈ A
- Câu hỏi: Có tồn tại một tập con A’ ⊂ A sao cho

∑ s (a ) = ∑ s (a)

a∈A '

a∉A − A '

3.2.4.8. Bài toán TRAVELING SALEMAN (TSP)
- Đầu vào: Cho tập n thành phố C = {c 1,…,cm} với khoảng cách
d(ci,cj) ∈ Z+ và một số nguyên dương B.
- Câu hỏi: Có tồn tại một hoán vị π trên {1, 2, ..., m} sao cho:
 m−1


 ∑ d (c Π (i ) , c Π (i + !) )  + d (c Π ( m) , c Π (1) )
 i =1


≤ B hay không?

Ta có sơ đồ để chứng minh một số bài toán là NPC như sau:
SAT

Hình 7. 3SAT
Sơ đồ chứng minh một số bài toán NPC.
3DM

VC

PARTITION

CLIQUE

21

HC

TSP


KẾT LUẬN
Như vậy trong bản luận văn này, chúng tôi đã đi tìm hiểu một số khái
niệm quan trọng của lý thuyết thuật toán, lý thuyết độ phức tạp và phân lớp
độ phức tạp của các bài toán. Trong lý thuyết thuật toán còn những nội

dung trọng tâm như các thuật toán thông dụng và độ phức tạp của các thuật
toán này, ... Trong lý thuyết độ phức tạp còn những nội dung quan trọng
như phương pháp giải các bài toán tối ưu tổ hợp và các thuật toán xấp xỉ,
xác suất, heuristics và ứng dụng của nó ... Trong thời gian tới chúng tôi sẽ
nghiên cứu tiếp những nội dung này.

22


TÀI LIỆU THAM KHẢO
Tiếng Việt
1. Nguyễn Hữu Điển, Một số bài toán về thuật toán, NXB Giáo dục, Hà
Nội, 2005.
2. Phan Huy Khánh, Giáo trình Lý thuyết tính toán, ĐH Đà Nẵng, Đà
Nẵng, 1999.
Tiếng Anh
3. Agrawal, M., Kayal, N. and Saxena, N. (2002). PRIMES is in P. Tech.
Report Dept. of Computer Science and Engineering. Indian Inst. of
Technology Kanpur.
4. Ahuja, R.K., Magnanti, T.L. and Orlin, J.B. (1993). Network Flows.
Theory, Algorithms and Applications. Prentice–Hall.
5. Dietzfelbinger, M. (2004). Primality Testing in Polynomial Time. LNCS
3000. Springer.
6. Garey, M.R. and Johnson, D.B. (1979). Computers and Intractability. A
Guide to the Theory of NP-Completeness. W.H. Freeman.
7. Homer, S. (2001). Computability and Complexity Theory. Springer.
8. Hopcroft, J.E., Motwani, R. and Ullman, J.D. (2001). Introduction to
Automata

Theory,


Languages

and

Computation.

Addison-Wesley

Longman.
9. Ingo Wegener (2005). Complexity Theory. Springer.
10. Martello, S. and Toth, P. (1990). Knapsack Problems. Wiley.
11. Motwani, R. and Raghavan, P. (1995). Randomized Algorithms.
Cambridge University Press.
12. T. Cormen, C. Leiserson, R. Rivest (1990). Introduction to Algorithms,
Mc Graw-Hill.

23


×