ThiếT Kế Và đáNh Giá ThuậT ToáN
-
Upload
guest717ec2 -
Category
Sports
-
view
37.343 -
download
7
Transcript of ThiếT Kế Và đáNh Giá ThuậT ToáN
11
Thiết kế và đánh Thiết kế và đánh giá thuật toángiá thuật toán
Cao học, khoa công nghệ thông Cao học, khoa công nghệ thông tintin
Đại học quốc gia Hà nội.Đại học quốc gia Hà nội.
Phan Thị Hà DươngPhan Thị Hà DươngViện Toán học. Viện Toán học.
[email protected]@gmail.com
22
Chương trìnhChương trình
Chương 1Chương 1: Giới thiệu về thuật toán: Giới thiệu về thuật toánChương 2Chương 2: Phân tích tính hiệu quả của : Phân tích tính hiệu quả của
thuật toán thuật toán Chương 3Chương 3: Phương pháp “tham lam”: Phương pháp “tham lam”Chương 4Chương 4: Phương pháp “chia để trị”: Phương pháp “chia để trị”Chương 5Chương 5: Phương pháp qui hoạch động: Phương pháp qui hoạch độngChương 6Chương 6: Thuật toán trên đồ thị: Thuật toán trên đồ thịChương 7Chương 7: Phương pháp xác suất: Phương pháp xác suấtChương 8Chương 8: Về độ phức tạp tính toán: Về độ phức tạp tính toán
33
Ví dụ: Chương 3: Phương Ví dụ: Chương 3: Phương pháp “tham lam”pháp “tham lam”
I.I. Giới thiệu chungGiới thiệu chungII.II. Thuật toán trên đồ thịThuật toán trên đồ thị
1)1) Cây bao trùm nhỏ nhấtCây bao trùm nhỏ nhất2)2) Đường đi ngắn nhấtĐường đi ngắn nhất
III.III. Thuật toán sắp xếp lịch làm việcThuật toán sắp xếp lịch làm việcIV.IV. Thuật toán “heurisitic”Thuật toán “heurisitic”
1)1) Tô màu đồ thịTô màu đồ thị2)2) Người đưa hàngNgười đưa hàng
44
Sách tham khảoSách tham khảo
55
Sách tham khảoSách tham khảo
2. 2. Algorithmique - conception et analyseAlgorithmique - conception et analyseG. Brassard and P.Bratley, Masson, Paris G. Brassard and P.Bratley, Masson, Paris
, 1987, 19873. 3. Data structure and algorithmsData structure and algorithmsA. Aho, J. Hopcroft and J. Ullman, A. Aho, J. Hopcroft and J. Ullman,
Addison Wesley Publishing CompanyAddison Wesley Publishing Company4. 4. Lý thuyết độ phức tạp tính toán.Lý thuyết độ phức tạp tính toán.Phan Đình Diệu.Phan Đình Diệu.
66
Chương 1: Giới thiệu về Chương 1: Giới thiệu về thuật toánthuật toán
I.I. Khái niệm thuật toánKhái niệm thuật toán
II.II. Một số ví dụMột số ví dụ
III.III. Đánh giá thuật toán trong trường Đánh giá thuật toán trong trường hợp xấu nhất và theo trung bìnhhợp xấu nhất và theo trung bình
IV.IV. Về thuật toán hiệu quảVề thuật toán hiệu quả
V.V. Một số bài toán cụ thểMột số bài toán cụ thể
VI.VI. Cấu trúc dữ liệu Cấu trúc dữ liệu
77
Khái niệm về thuật toánKhái niệm về thuật toán
Thuật toán:Thuật toán:
Dữ kiện vàoKết quả ra
Quá trình tính toánMột dãy các bước tính toán
Một dãy số Dãy số được
sắp xếpThuật toán sắp xếp
88
Một số từ khóaMột số từ khóaif (điều kiện) then {…} elseif (điều kiện) then {…} else
for (điều kiện) do {…}for (điều kiện) do {…}
while (điều kiện) do {…}while (điều kiện) do {…}
procedure (T, a, b) {…}procedure (T, a, b) {…}
function(A) {… return r; }function(A) {… return r; }
99
Sắp xếp chèn vàoSắp xếp chèn vào
55 22 4 6 1 3 4 6 1 3
66 5 5 44 6 1 3 6 1 3
22 4 5 4 5 66 1 3 1 3
22 4 54 56 6 11 3 3
33 2 4 5 6 2 4 5 6 33
1 2 3 4 5 61 2 3 4 5 6
1010
Thuật toán xếp chèn vàoThuật toán xếp chèn vào
Insertion-Sort (A) {Insertion-Sort (A) {forfor j = 2 j = 2 toto length (A) length (A) dodo { {
k = A[j]; // k = A[j]; // chèn A[j] vào dãy đã sắp A[1..j-1]chèn A[j] vào dãy đã sắp A[1..j-1]j = j-1;j = j-1;while while i > 0 and A[i] > k do {i > 0 and A[i] > k do {
A[i+1] = A[i];A[i+1] = A[i];I = i-1; }I = i-1; }
A{i+1} = k; }A{i+1} = k; }}}
1111
Thuật toán xen kẽ (merge Thuật toán xen kẽ (merge sort)sort)
1212
Sắp xếp xen kẽSắp xếp xen kẽ
Merge-Sort(A,p,r){Merge-Sort(A,p,r){
1.1. ifif p < r p < r thenthen { {
2.2. q = q = [(p+r-1)/2];[(p+r-1)/2];
3.3. Merge-Sort(A,p,q);Merge-Sort(A,p,q);
4.4. Merge-Sort(A,q+1,r);Merge-Sort(A,q+1,r);
5.5. Merge(A,p,q,r);Merge(A,p,q,r);
}}
}}
1313
Phân tích thuật toán Merge-Phân tích thuật toán Merge-SortSort
Đây là một thuật toán chia để trị.Đây là một thuật toán chia để trị.
ChiaChia:: bước 2: bước 2: θθ(1)(1)
TrịTrị:: bước 3 và 4:bước 3 và 4: 2T(n/2)2T(n/2)
Hợp lạiHợp lại:: bước 5:bước 5: θθ(n)(n)
Tổng kếtTổng kết::
T(n) = T(n) = θθ(1)(1) nếu n=1nếu n=1
2T(n/2) + 2T(n/2) + θθ(n)(n) nếu n >1nếu n >1
1414
Đánh giá thuật toánĐánh giá thuật toán
Giải quyết một bài toán. Giải quyết một bài toán.
Vấn đề:Vấn đề:
Có nhiều thuật toán. Chọn thuật toán Có nhiều thuật toán. Chọn thuật toán nào ?nào ?
Mô hình hóa Lập chương trìnhViết thuật toán
1515
Phương pháp đánh giáPhương pháp đánh giá
Phương pháp thực nghiệmPhương pháp thực nghiệm: Lập trình, và thử trên : Lập trình, và thử trên các ví dụ xem thuật toán nào nhanh.các ví dụ xem thuật toán nào nhanh.
Phương pháp lý thuyếtPhương pháp lý thuyết: Tính toán thời gian, bộ : Tính toán thời gian, bộ nhớ, … cần thiết của mỗi thuât toán dựa theo độ nhớ, … cần thiết của mỗi thuât toán dựa theo độ lớn của dữ liệu vào.lớn của dữ liệu vào.
Ưu điểmƯu điểm: - không phụ thuộc ngôn ngữ lập trình, : - không phụ thuộc ngôn ngữ lập trình, loại máy tínhloại máy tính
- Biết được tính hiệu quả của thuật toán - Biết được tính hiệu quả của thuật toán đối với các dữ liệu có kích thước lớn.đối với các dữ liệu có kích thước lớn.
1616
Đánh giá thuật toán trong Đánh giá thuật toán trong trường hợp xấu nhất và theo trường hợp xấu nhất và theo
trung bìnhtrung bìnhVí dụVí dụ: Sắp xếp lựa chọn: Sắp xếp lựa chọn
Select-SortSelect-Sort (A){ (A){forfor i=1 i=1 toto n-1 n-1 dodo { {
index = i; x = T[i];index = i; x = T[i];forfor j= i+1 j= i+1 toto n n dodo { {
ifif T[j] < x T[j] < x then then { index = j; x = T[j];}{ index = j; x = T[j];}}}T{index = T{i};T{index = T{i};T{i} = x;T{i} = x;
}}}}
1717
Ví dụVí dụ
Hãy chạy thuật toánHãy chạy thuật toán
Insertion-SortInsertion-Sort
Merge-SortMerge-Sort
Đối với các bảng sau :Đối với các bảng sau :
A = [3,1,4,1,5,9,2,6,5,3]A = [3,1,4,1,5,9,2,6,5,3]
B = [1,2,3,4,5,6]B = [1,2,3,4,5,6]
C = [6,5,4,3,2,1]C = [6,5,4,3,2,1]
1818
Thời gian chạy trong trường hợp xấu Thời gian chạy trong trường hợp xấu nhất: là cận trên đối với mọi dữ liệu nhất: là cận trên đối với mọi dữ liệu vào.vào.
Thời gian chạy trung bình: thường khó Thời gian chạy trung bình: thường khó phân tích và đánh giá hơn.phân tích và đánh giá hơn.
1919
Ví dụ: dãy FibonacciVí dụ: dãy Fibonacci
Dãy Fibonacci được định nghĩa:Dãy Fibonacci được định nghĩa:
F(0) = 0, F(1) = 1, vàF(0) = 0, F(1) = 1, và
F(n) = F(n-1) + F(n-2) với n > 1.F(n) = F(n-1) + F(n-2) với n > 1.
Tìm thuật toán tính số Fibonacci thứ n.Tìm thuật toán tính số Fibonacci thứ n.
2020
Thuật toán thứ nhất và thứ Thuật toán thứ nhất và thứ haihai
fontionfontion fib1(n){ fib1(n){ifif n < 2 n < 2 thenthen returnreturn n; n;else returnelse return f(n-1) + f(n-2); f(n-1) + f(n-2);
} }
fonctionfonction fib2(n){ fib2(n){a= 0; b = 1;a= 0; b = 1;forfor k = 1 k = 1 toto n n dodo {c=b; b = a+b; a=c;} {c=b; b = a+b; a=c;}return return b;b;
}}
2121
Thuật toán thứ baThuật toán thứ ba
fonctionfonction fib3(n){ fib3(n){i = 1; j = 0; k = 0; h = 1;i = 1; j = 0; k = 0; h = 1;whilewhile n>0 n>0 dodo { {
if if (n lẻ) (n lẻ) thenthen { t = jh; { t = jh; j = ih + jk +t;j = ih + jk +t; i = ik +t;}i = ik +t;}
t = h^2;t = h^2;h = 2kh+t;h = 2kh+t;k = k^2+t;k = k^2+t;n = n div 2;n = n div 2;
}}return return j;j;
}}
2222
Ví dụ về thời gian chạy Ví dụ về thời gian chạy (Pascal, CDC Cyber 835)(Pascal, CDC Cyber 835)
nn 1010 2020 3030 5050 100100 1000100000
1 0001 000
000000100010000000000000
fib1fib1 8 ms8 ms 1 s1 s 2 min2 min 21 21 daysdays
fib2fib2 1/6 1/6 msms
1/3 1/3 msms
½ ms½ ms ¾ ms¾ ms 3/2 3/2 msms
150 150 msms
15 s15 s 25 25 minmin
fib3fib3 1/3 1/3 msms
2/5 2/5 msms
½ ms½ ms ½ ms½ ms ½ ms½ ms 1 ms1 ms 3/2 3/2 msms
2 ms2 ms
2323
Cấu trúc dữ liệuCấu trúc dữ liệu
Dãy (list)Dãy (list)
typetype tablist = tablist = structurestructure{{value[1..lengthmax]: information elements;value[1..lengthmax]: information elements;counter: 0.. lengthmax;}counter: 0.. lengthmax;}
typetype elem = elem = structurestructure{{value: information element;value: information element;next: * elem;}next: * elem;}
6 7 314
2424
Đồ thịĐồ thị
typetype adjgraph = adjgraph = structurestructure { {value[1..n]: information elements;value[1..n]: information elements;adjacent[1..n, 1..n]: booleans;}adjacent[1..n, 1..n]: booleans;}
typetype listgraph = array[1..n] of listgraph = array[1..n] of structurestructure { {value: information element;value: information element;neighbours: list; }neighbours: list; }
12
43
2525
CâyCây
typetype treenode = treenode = structurestructure{{value: information element;value: information element;children: array[ ] of * treenodes;children: array[ ] of * treenodes;}}
typetype treenode = treenode = structurestructure{{value: information element;value: information element;first child: * treenode;first child: * treenode;next brother: * treenode;next brother: * treenode;}}
typetype binarytreenode = binarytreenode = structurestructure{{value: information element;value: information element;left child, right child: * binarytreenode;left child, right child: * binarytreenode;}}
a
b c
d e f
2626
Tập hợpTập hợp
set[1..N]: integer;set[1..N]: integer;
fonction find(x){ } fonction find(x){ } // tìm phần tử có giá trị x// tìm phần tử có giá trị x
procedure merge(a,b) // procedure merge(a,b) // tìm hợp của hai tập được tìm hợp của hai tập được sắpsắp
2727
Chương 2: Phân tích tính Chương 2: Phân tích tính hiệu quả của thuật toánhiệu quả của thuật toán
I.I. Các ký hiệu đánh giá tiệm cậnCác ký hiệu đánh giá tiệm cận
II.II. Phân tích thuật toánPhân tích thuật toán
III.III. Giải các phương trình đệ quiGiải các phương trình đệ qui
IV.IV. Một số ví dụMột số ví dụ
2828
Ký hiệu O:Ký hiệu O:
O(g(n)) = {f(n): tồn tại hằng số c và N O(g(n)) = {f(n): tồn tại hằng số c và N để:để:
0 ≤ f(n)< c g(n) với mọi n ≥ 0 ≤ f(n)< c g(n) với mọi n ≥ N}N}
Đây là một quan hệ thứ tự: phản xứng, Đây là một quan hệ thứ tự: phản xứng, “phi đối xứng” và bắc cầu.“phi đối xứng” và bắc cầu.
2929
Ký hiệu Ký hiệu ΩΩ
ΩΩ(g(n)) = {f(n): tồn tại hằng số c và N (g(n)) = {f(n): tồn tại hằng số c và N để:để:
f(n)≥ c g(n) với mọi n ≥ N}f(n)≥ c g(n) với mọi n ≥ N}
f(n) f(n) ЄЄ ΩΩ (g(n)) (g(n)) ≈ g(n) ≈ g(n) ЄЄ O(f(n)) O(f(n))
Đây là một quan hệ thứ tự: phản xứng, Đây là một quan hệ thứ tự: phản xứng, “phi đối xứng” và bắc cầu.“phi đối xứng” và bắc cầu.
3030
Ký hiệu Ký hiệu θθ
θθ(g(n))={f(n): tồn tại 2 hằng c, d và N để:(g(n))={f(n): tồn tại 2 hằng c, d và N để:
c g(n) ≤ f(n) ≤ d g(n) với mọi n ≥ N}c g(n) ≤ f(n) ≤ d g(n) với mọi n ≥ N}
f(n) = f(n) = θθ(g(n)) (g(n))
≈ ≈ f(n) = O(g(n)) và f(n) = f(n) = O(g(n)) và f(n) = ΩΩ(g(n))(g(n))
Đây là một quan hệ tương đương: phản xứng, Đây là một quan hệ tương đương: phản xứng, đối xứng và bắc cầu.đối xứng và bắc cầu.
3131
Ký hiệu Ký hiệu oo
oo(g(n)) = {f(n): với mọi hằng c >0, tồn (g(n)) = {f(n): với mọi hằng c >0, tồn tại tại N để: 0 ≤ f(n)< c g(n) với mọi n N để: 0 ≤ f(n)< c g(n) với mọi n ≥ N}≥ N}
Đây là một quan hệ thứ tự: phản xứng, Đây là một quan hệ thứ tự: phản xứng, “phi đối xứng” và bắc cầu.“phi đối xứng” và bắc cầu.
3232
Ký hiệu Ký hiệu ωω
ωω(g(n)) = {f(n): với mọi hằng c >0, tồn (g(n)) = {f(n): với mọi hằng c >0, tồn tại tại N để: 0 ≤ c g(n) <f(n) với mọi n ≥ N để: 0 ≤ c g(n) <f(n) với mọi n ≥ N}N}
f(n) f(n) ЄЄ ωω(g(n)) (g(n)) ≈ g(n) ≈ g(n) ЄЄ o(f(n)) o(f(n))
Đây là một quan hệ thứ tự: phản xứng, Đây là một quan hệ thứ tự: phản xứng, “phi đối xứng” và bắc cầu“phi đối xứng” và bắc cầu
3333
Nhận xétNhận xét
f(n) = O (g(n)) ≈ a ≤ bf(n) = O (g(n)) ≈ a ≤ b
f(n) = f(n) = ΩΩ (g(n)) ≈ a ≥ b (g(n)) ≈ a ≥ b
f(n) = f(n) = θθ (g(n)) ≈ a = b (g(n)) ≈ a = b
f(n) = o (g(n)) ≈ a < bf(n) = o (g(n)) ≈ a < b
f(n) = f(n) = ωω (g(n)) ≈ a > b (g(n)) ≈ a > b
3434
Sắp xếp các hàm sau theo quan hệ 0 Sắp xếp các hàm sau theo quan hệ 0
và và θθ
3535
Một số hàm cơ bảnMột số hàm cơ bản
1.1. n^b = o(a^n), với mọi a>1 và bn^b = o(a^n), với mọi a>1 và b
2.2. e^x = 1 + x + e^x = 1 + x + θθ(x^2), với |x| ≤ 1(x^2), với |x| ≤ 1
3.3. lg^b n = o(n^a), với mọi a > 0lg^b n = o(n^a), với mọi a > 0
4.4. n! = o(n^n)n! = o(n^n)
5.5. n! = n! = ωω(2^n)(2^n)
6.6. lg(n!)= lg(n!)= θθ(n lg n)(n lg n)
3636
Giải các phương trình đệ quiGiải các phương trình đệ qui
Ví dụ:Ví dụ:
T(n) = T(n) = θθ(1) (1) nếu nếu n= 1n= 1
2 T(n/2) + 2 T(n/2) + θθ(n)(n) nếu n >1nếu n >1
T(n) = T(n) = θθ(n lg n)(n lg n)
3737
Phương pháp truy hồiPhương pháp truy hồi
- Dự đoán kết quảDự đoán kết quả- Chứng minh bằng truy hồi (quy nạp)Chứng minh bằng truy hồi (quy nạp)
Ví dụ: Cho T(n) = 2 T(n/2) + n. Ta Ví dụ: Cho T(n) = 2 T(n/2) + n. Ta chứng minh truy hồi rằng T(n) = O(n chứng minh truy hồi rằng T(n) = O(n lg n).lg n).
3838
Đổi biếnĐổi biến
Ví dụ: Ví dụ:
T(n) = 2 T(T(n) = 2 T([[√n√n]) + lg n]) + lg n
Đặt m = lg n, ta có:Đặt m = lg n, ta có:
T(2^m) = 2 T(2^{m/2}) + mT(2^m) = 2 T(2^{m/2}) + m
Đặt S(m) = T(2^m), ta có: Đặt S(m) = T(2^m), ta có:
S(m)= 2 S(m/2) + mS(m)= 2 S(m/2) + m
T(n) = S(m) = O(m lg m) = O(lg n lg lg n)T(n) = S(m) = O(m lg m) = O(lg n lg lg n)
3939
Phương pháp tính dần từng Phương pháp tính dần từng bướcbước
Ví dụ T(n) = 3T(n/4)+nVí dụ T(n) = 3T(n/4)+n
T(n) = n+ 3 T(n/4)T(n) = n+ 3 T(n/4)
= n + 3(n/4 + 3T(n/16))= n + 3(n/4 + 3T(n/16))
= n + 3 n/4 + 3 (n/16 + = n + 3 n/4 + 3 (n/16 + 3T(n/64))3T(n/64))
≤ ≤ n + 3n/4 + 9n/16 + … n + 3n/4 + 9n/16 + …
4040
Ví dụ: Sắp xếp xen kẽVí dụ: Sắp xếp xen kẽ
Merge-Sort(A,p,r){Merge-Sort(A,p,r){
1.1. ifif p < r p < r thenthen { {
2.2. q = q = [(p+r-1)/2];[(p+r-1)/2];
3.3. Merge-Sort(A,p,q);Merge-Sort(A,p,q);
4.4. Merge-Sort(A,q+1,r);Merge-Sort(A,q+1,r);
5.5. Merge(A,p,q,r);Merge(A,p,q,r);
}}
}}
4141
Phân tích thuật toán Merge-Phân tích thuật toán Merge-SortSort
Đây là một thuật toán chia để trị.Đây là một thuật toán chia để trị.
ChiaChia:: bước 2: bước 2: θθ(1)(1)
TrịTrị:: bước 3 và 4:bước 3 và 4: 2T(n/2)2T(n/2)
Hợp lạiHợp lại:: bước 5:bước 5: θθ(n)(n)
Tổng kếtTổng kết::
T(n) = T(n) = θθ(1)(1) nếu n=1nếu n=1
2T(n/2) + 2T(n/2) + θθ(n)(n) nếu n >1nếu n >1
4242
4343
The Master TheoremThe Master Theorem
Cho a≥1 và b>1 hằng số, hàm số f(n) Cho a≥1 và b>1 hằng số, hàm số f(n) và T(n) được định nghĩa: và T(n) được định nghĩa:
T(n) = aT(n/b) + f(n),T(n) = aT(n/b) + f(n),
Khi đó định lý sẽ cho biết giới hạn tiệm Khi đó định lý sẽ cho biết giới hạn tiệm cận của T(n)cận của T(n)
4444
Chương 3: Phương pháp Chương 3: Phương pháp “tham lam”“tham lam”
I.I. Giới thiệu chungGiới thiệu chung
II.II. Thuật toán trên đồ thịThuật toán trên đồ thị1)1) Cây bao trùm nhỏ nhấtCây bao trùm nhỏ nhất
2)2) Đường đi ngắn nhấtĐường đi ngắn nhất
III.III. Thuật toán sắp xếp lịch làm việcThuật toán sắp xếp lịch làm việc
IV.IV. Thuật toán “heurisitique”Thuật toán “heurisitique”1)1) Tô màu đồ thịTô màu đồ thị
2)2) Người đưa hàngNgười đưa hàng
4545
Giới thiệu chung Giới thiệu chung (greedy algorithms)(greedy algorithms)
Các thuật toán tham lam chủ yếu để Các thuật toán tham lam chủ yếu để giải quyết các bài toán tối ưu. Ta có:giải quyết các bài toán tối ưu. Ta có:- Một tập các đối tượng- Một tập các đối tượng- Một dãy các đối tượng đã lựa chọn- Một dãy các đối tượng đã lựa chọn- Một hàm để xem một tập các đối tượng có lập - Một hàm để xem một tập các đối tượng có lập thành một thành một giải phápgiải pháp hay không (không nhất thiết hay không (không nhất thiết tối ưu)tối ưu)- Một hàm để xem một tập đối tượng có là - Một hàm để xem một tập đối tượng có là tiềm tiềm năngnăng hay không hay không- Một hàm để lựa chọn ứng viên có - Một hàm để lựa chọn ứng viên có triển vọngtriển vọng nhất nhất- Một hàm đích cho giá trị của một - Một hàm đích cho giá trị của một giải phápgiải pháp (để (để tối tối ưuưu hóa) hóa)
4646
Cách giải quyếtCách giải quyết
Tìm một tập các đối tượng lập thành Tìm một tập các đối tượng lập thành một giải pháp và tối ưu hóa hàm đích. một giải pháp và tối ưu hóa hàm đích. Từng bước một:Từng bước một:- Đầu tiên tập đối tượng là rỗng- Đầu tiên tập đối tượng là rỗng- Tại mỗi bước, ta cố thêm vào một đối tượng tốt - Tại mỗi bước, ta cố thêm vào một đối tượng tốt nhất còn lại (nhờ hàm chọn)nhất còn lại (nhờ hàm chọn)
+ Nếu tập mới không là tiềm năng, bỏ đối + Nếu tập mới không là tiềm năng, bỏ đối tượng này đi, chọn đối tượng kháctượng này đi, chọn đối tượng khác
+ Ngược lại, đối tượng mới này xếp vào cuối + Ngược lại, đối tượng mới này xếp vào cuối tậptập
+ Kiểm tra xem tập mới có là một giải pháp+ Kiểm tra xem tập mới có là một giải pháp
4747
Tính đúng đắnTính đúng đắn
Một thuật toán “tham lam” chạy đúng Một thuật toán “tham lam” chạy đúng nếu giải pháp được lựa chọn là tối ưu.nếu giải pháp được lựa chọn là tối ưu.
4848
Thuật toán sinhThuật toán sinh
Thuật_toán Tham_lam{Thuật_toán Tham_lam{// // vào: tập hợp C các đối tượngvào: tập hợp C các đối tượng// ra: tập S (giải pháp tối ưu)// ra: tập S (giải pháp tối ưu)
S = S = Ø;Ø;whilewhile(! (! solutionsolution(S) (S) andand C <> Ø) C <> Ø) do do {{
x = phần tử của C sao cho x = phần tử của C sao cho selectselect(x) max;(x) max;C = C \ {x};C = C \ {x};ifif realisablerealisable(S U {x}) (S U {x}) thenthen S = S U {x};} S = S U {x};}
ifif solutionsolution(S) (S) then returnthen return S; S; elseelse returnreturn “không có nghiệm”; “không có nghiệm”;
}}
4949
Cây bao trùm nhỏ nhấtCây bao trùm nhỏ nhất
Bài toánBài toán: Cho đồ thị vô hướng liên : Cho đồ thị vô hướng liên thông G=(V,E). Mỗi cạnh e thông G=(V,E). Mỗi cạnh e ЄЄ E có độ E có độ dài l(e). Tìm tập con T của E sao cho dài l(e). Tìm tập con T của E sao cho (V,T) vẫn liên thông và tổng (V,T) vẫn liên thông và tổng ΣΣ l(e) ( l(e) (e e ЄЄ E) là nhỏ nhất.E) là nhỏ nhất.
Vấn đềVấn đề: Chứng minh (V,T) là một cây.: Chứng minh (V,T) là một cây.
““Cây bao trùm nhỏ nhất” Cây bao trùm nhỏ nhất”
5050
Một số khái niệmMột số khái niệm
Một tập cạnh là:Một tập cạnh là:
-- một một giải phápgiải pháp nếu nó tạo một cây bao trùm nếu nó tạo một cây bao trùm- một một tiềm năngtiềm năng nếu nó không chứa xích nếu nó không chứa xích- một tập tiềm năng là một một tập tiềm năng là một triển vọngtriển vọng nếu có nếu có
thể thêm cạnh vào nó để đạt một thể thêm cạnh vào nó để đạt một giải pháp giải pháp tối ưutối ưu
Một cạnhMột cạnh “nối”“nối” một tập đỉnh nếu đúng một đỉnh một tập đỉnh nếu đúng một đỉnh của nó nằm trong tập đỉnh nàycủa nó nằm trong tập đỉnh này
5151
Mệnh đềMệnh đề: Cho đồ thị vô hướng liên thông : Cho đồ thị vô hướng liên thông G=(V,E). Mỗi cạnh e G=(V,E). Mỗi cạnh e ЄЄ E có độ dài l(e). E có độ dài l(e). Cho B là một tập con (thực) của V. Cho B là một tập con (thực) của V. Cho T là một tập cạnh triển vọng sao Cho T là một tập cạnh triển vọng sao cho không cạnh nào của T nối B.cho không cạnh nào của T nối B.Cho e là một cạnh có độ dài min của B.Cho e là một cạnh có độ dài min của B.
Ta có: T U {e} là một triển vọng.Ta có: T U {e} là một triển vọng.
5252
Thuật toán Kruskal (ý tưởng)Thuật toán Kruskal (ý tưởng)
- Lúc đầu T rỗngLúc đầu T rỗng- Tại mỗi thời điểm (V,T) là một hợp rời Tại mỗi thời điểm (V,T) là một hợp rời
các thành phần liên thông (tplt): các thành phần liên thông (tplt): trong mỗi tplt, các cạnh của T lập trong mỗi tplt, các cạnh của T lập thành một cây bao trùm nhỏ nhất.thành một cây bao trùm nhỏ nhất.
- Cuối cùng: chỉ còn một tplt, và T là Cuối cùng: chỉ còn một tplt, và T là cây bao trùm nhỏ nhất của đồ thị G.cây bao trùm nhỏ nhất của đồ thị G.
5353
- Xếp các cạnh của E theo thứ tự tăng Xếp các cạnh của E theo thứ tự tăng dầndần
- Nếu một cạnh nối hai tplt, thêm vào Nếu một cạnh nối hai tplt, thêm vào TT
- Nếu không, bỏ đi, xét cạnh tiếp theoNếu không, bỏ đi, xét cạnh tiếp theo
5454
Tính đúng đắnTính đúng đắn
Vấn đềVấn đề: chứng minh tính đúng đắn : chứng minh tính đúng đắn của thuật toán Kruskalcủa thuật toán Kruskal
5555
Ví dụVí dụ
1 2
3
4 5
6
7
12
46
4 56
3 8
47 3
5656
Thuật toán Kruskal Thuật toán Kruskal
MST-Kruskal(G,l){MST-Kruskal(G,l){1.1. Xếp E theo l tăng; n = # V; T = Xếp E theo l tăng; n = # V; T = Ø;Ø;2.2. Đặt n tplt, mỗi tplt chứa 1 phần tử của V;Đặt n tplt, mỗi tplt chứa 1 phần tử của V;3.3. dodo{{4.4. (u,v) cạnh độ dài min chưa xét đến;(u,v) cạnh độ dài min chưa xét đến;5.5. ifif setset(u)<> (u)<> setset(v) (v) thenthen{{6.6. T = T T = T U (u,v); U (u,v); unionunion((setset(u),(u),setset(v));(v));7.7. }}8.8. } } whilewhile(#T = n-1)(#T = n-1)9.9. returnreturn T; T;10.10. } }
5757
Phân tíchPhân tích
1.1. Đánh giá độ phức tạp tính toán của Đánh giá độ phức tạp tính toán của thuật toán Kruskalthuật toán Kruskal
2.2. Nếu đồ thị không liên thông, kết Nếu đồ thị không liên thông, kết quả sẽ thế nào ?quả sẽ thế nào ?
3.3. Một đồ thị có thể có nhiều cây bao Một đồ thị có thể có nhiều cây bao trùm nhỏ nhất. Cây nào được cho trùm nhỏ nhất. Cây nào được cho bởi thuật toán Kruskal ?bởi thuật toán Kruskal ?
5858
Thuật toán Prim (ý tưởng)Thuật toán Prim (ý tưởng)
- Lúc đầu T rỗng và cây B chứa một Lúc đầu T rỗng và cây B chứa một đỉnh bất kỳđỉnh bất kỳ
- Tại mỗi thời điểm, T là một cây bao Tại mỗi thời điểm, T là một cây bao trùm nhỏ nhất của B. Chọn một cạnh trùm nhỏ nhất của B. Chọn một cạnh (u,v) độ dài min sao cho u (u,v) độ dài min sao cho u ЄЄ V\B và v V\B và v ЄЄ B. Thêm u vào B và (u,v) vào T B. Thêm u vào B và (u,v) vào T
- Cuối cùng: B=V, và T là cây bao trùm Cuối cùng: B=V, và T là cây bao trùm nhỏ nhất của đồ thị G.nhỏ nhất của đồ thị G.
5959
Bài tậpBài tập
1.1. Chạy ví dụ t.t. Prim trong hình vẽ đã choChạy ví dụ t.t. Prim trong hình vẽ đã cho
2.2. Viết thuật toán PrimViết thuật toán Prim
3.3. Đánh giá độ phức tạp tính toán của t.t.Đánh giá độ phức tạp tính toán của t.t.
4.4. Chứng minh tính đúng đắn của t.t.Chứng minh tính đúng đắn của t.t.
5.5. Một đồ thị có thể có nhiều cây bao trùm Một đồ thị có thể có nhiều cây bao trùm nhỏ nhất. Cây nào được cho bởi thuật toán nhỏ nhất. Cây nào được cho bởi thuật toán Prim ?Prim ?
6.6. Nếu đồ thị không liên thông, kết quả sẽ Nếu đồ thị không liên thông, kết quả sẽ thế nào ?thế nào ?
6060
Đường đi ngắn nhấtĐường đi ngắn nhất
Bài toánBài toán: Cho đồ thị có hướng : Cho đồ thị có hướng G=(V,E). Mỗi cạnh e G=(V,E). Mỗi cạnh e ЄЄ E có độ dài E có độ dài l(e). Một đỉnh nguồn s. Tìm đường đi l(e). Một đỉnh nguồn s. Tìm đường đi ngắn nhất từ s đến các đỉnh khác của ngắn nhất từ s đến các đỉnh khác của G.G.
6161
Thuật toán Dijkstra (ý Thuật toán Dijkstra (ý tưởng)tưởng)
- Tập S gồm các đỉnh đã xác định Tập S gồm các đỉnh đã xác định đường ngắn nhất từ sđường ngắn nhất từ s
- Tập C gồm các đỉnh còn lạiTập C gồm các đỉnh còn lại- Lúc đầu S = {s}Lúc đầu S = {s}- Tại mỗi thời điểm, chọn trong C đỉnh Tại mỗi thời điểm, chọn trong C đỉnh
có khoảng cách từ s min, thêm vào Scó khoảng cách từ s min, thêm vào S- Cuối cùng S = VCuối cùng S = V
6262
Bổ đềBổ đề: (đường con của một đường : (đường con của một đường ngắn nhất cũng là đường ngắn nhất)ngắn nhất cũng là đường ngắn nhất)
Hệ quảHệ quả: Ta có thể xây dựng một cây : Ta có thể xây dựng một cây gốc s để đường duy nhất từ s đến gốc s để đường duy nhất từ s đến mỗi u là đường có khoảng cách minmỗi u là đường có khoảng cách min
6363
Khai triển ý tưởngKhai triển ý tưởng
- Bảng d: d[u]: khoảng cách min (tạm thời) Bảng d: d[u]: khoảng cách min (tạm thời) từ s đến utừ s đến u
- Bảng Adj: Adj[u] : các đỉnh liên hệ với uBảng Adj: Adj[u] : các đỉnh liên hệ với u- Bảng l: l[u,v]: độ dài cạnh (u,v) (nếu không Bảng l: l[u,v]: độ dài cạnh (u,v) (nếu không
có (u,v) thì l[u,v] = ∞có (u,v) thì l[u,v] = ∞- Bảng p: p[u] là “cha” của u trên đường từ s Bảng p: p[u] là “cha” của u trên đường từ s
đến uđến u- Kết quả là một cây gốc s, đường duy nhất Kết quả là một cây gốc s, đường duy nhất
từ s đến mỗi u là đường có khoảng cách từ s đến mỗi u là đường có khoảng cách minmin
6464
Thuật toán DijkstraThuật toán Dijkstra
Dijkstra(G,l,s){Dijkstra(G,l,s){1.1. S= {s}; C = V \ {s}; n= #V; d[s]=0;S= {s}; C = V \ {s}; n= #V; d[s]=0;2.2. forfor u u ЄЄ C C do do {d[u] = l[s,u]; p[u] = Null;}{d[u] = l[s,u]; p[u] = Null;}
3.3. whilewhile (C≠Ø) (C≠Ø) dodo { {4.4. chọn v chọn v ЄЄ C để d[v] min; C để d[v] min;5.5. C = C C = C \ {v}; S = S \ {v}; S = S U U {v};{v};6.6. forfor w w ЄЄ Adj[v] Adj[v] dodo { {7.7. if if d[w] > d[u]+l[u,v] d[w] > d[u]+l[u,v] thenthen { p[w]= v; { p[w]= v;8.8. d[w]= d[v]+l[v,w];}}d[w]= d[v]+l[v,w];}}
}}
6565
Ví dụ Ví dụ
1
5
2
4 3
1050
100
30
10
50
205
6666
Tính đúng đắn Tính đúng đắn
Chứng minh quy nạp rằng:Chứng minh quy nạp rằng:1.1. Nếu u Nếu u ЄЄ S: d[u] là khoảng cách min S: d[u] là khoảng cách min
từ s đến utừ s đến u2.2. Nếu Nếu u u ЄЄ C: d[u] là khoảng cách min C: d[u] là khoảng cách min
từ s đến u của các đường chỉ đi qua từ s đến u của các đường chỉ đi qua các đỉnh của Scác đỉnh của S
3.3. Cuối cùng S = V, d[u] là khoảng Cuối cùng S = V, d[u] là khoảng cách cần tìmcách cần tìm
6767
Phân tích thuật toánPhân tích thuật toán
Độ phức tạp: O(V^2)Độ phức tạp: O(V^2)
Nếu đồ thị ít cạnh: O(E lg V)Nếu đồ thị ít cạnh: O(E lg V)
6868
Sắp xếp lịch làm việcSắp xếp lịch làm việc
Bài toán 1Bài toán 1: : tối thiểu hóa thời gian chờ tối thiểu hóa thời gian chờ đợiđợi::
Một máy tính cần phục vụ khách Một máy tính cần phục vụ khách hàng.hàng.
Thời gian phục vụ khách hàng i la t[i]. Thời gian phục vụ khách hàng i la t[i].
Tìm cách xếp khách hàng để tối thiểu Tìm cách xếp khách hàng để tối thiểu hóa tổng thời gian chờ đợi.hóa tổng thời gian chờ đợi.
6969
Thuật toánThuật toán
Ý tưởngÝ tưởng: Sắp xếp theo trình tự t[i] tăng.: Sắp xếp theo trình tự t[i] tăng.
Vấn đềVấn đề: : 1.1. Chứng minh tính đúng đắn của thuật Chứng minh tính đúng đắn của thuật
toántoán2.2. Độ phức tạp của thuật toánĐộ phức tạp của thuật toán3.3. Nếu có s máy tính, thuật toán thay Nếu có s máy tính, thuật toán thay
đổi thế nào ?đổi thế nào ?
7070
Sắp xếp lịch làm việc có lợi Sắp xếp lịch làm việc có lợi nhuận nhuận
Bài toánBài toán: Cho một tập n việc phải : Cho một tập n việc phải làm, mỗi việc trong thời gian đơn vị. làm, mỗi việc trong thời gian đơn vị. Việc i sẽ đem lại lợi nhuận g[i] nếu Việc i sẽ đem lại lợi nhuận g[i] nếu được thực hiện trước hạn d[i].được thực hiện trước hạn d[i].
Tìm cách thực hiện các công việc để Tìm cách thực hiện các công việc để có lợi nhuận cao nhấtcó lợi nhuận cao nhất
7171
Ví dụVí dụ
Dữ kiệnDữ kiện i i 11 22 33 44
g[i]g[i] 5050 1010 1515 3030
d[i]d[i] 22 11 22 11
Các khả năngCác khả năng
Công việcCông việc 1,31,3 2,12,1 2,32,3 3,13,1 4,14,1 4,34,3
Lợi nhuậnLợi nhuận 6565 6060 2525 6565 8080 4545
7272
Ý tưởng thuật toánÝ tưởng thuật toán
Một tập hợp công việc là Một tập hợp công việc là tiềm năngtiềm năng nếu nếu có một dãy (tiềm năng) thực hiện mọi có một dãy (tiềm năng) thực hiện mọi công việc của tập này trước thời hạn.công việc của tập này trước thời hạn.
Thuật toánThuật toán: Từng bước một, thêm vào : Từng bước một, thêm vào tập công việc một công việc i chưa tập công việc một công việc i chưa được xét có g[i] max và tập mới vẫn là được xét có g[i] max và tập mới vẫn là tiềm năng.tiềm năng.
7373
Chạy thuật toán trên ví dụChạy thuật toán trên ví dụ
1.1. Chọn việc 1. Tập {1} là tiềm năngChọn việc 1. Tập {1} là tiềm năng2.2. Chọn việc 4. Tập {1, 4} là tiềm năngChọn việc 4. Tập {1, 4} là tiềm năng3.3. Chọn việc 3. Tập {1, 4, 3} không là Chọn việc 3. Tập {1, 4, 3} không là
tiềm năng. Bỏ việc 3 đitiềm năng. Bỏ việc 3 đi4.4. Chọn việc 2. Tập {1, 4, 2} không là Chọn việc 2. Tập {1, 4, 2} không là
tiềm năng. Bỏ việc 2 đitiềm năng. Bỏ việc 2 đi5.5. Kết quả tập {1, 4} được chọn. Thực Kết quả tập {1, 4} được chọn. Thực
hiện theo thứ tự 4, 1hiện theo thứ tự 4, 1
7474
Xác định tập tiềm năngXác định tập tiềm năng
Bổ đềBổ đề: Cho J là một tập công việc và : Cho J là một tập công việc và cho p= {s1,s2,…,sk} là một hoán vị cho p= {s1,s2,…,sk} là một hoán vị của các việc đó sao cho d[s1]≤d[s2] của các việc đó sao cho d[s1]≤d[s2] ≤… ≤d[sk].≤… ≤d[sk].
Tập J là tiềm năng ≈ dãy p là tiềm Tập J là tiềm năng ≈ dãy p là tiềm năng.năng.
7575
Tính đúng đắn của thuật Tính đúng đắn của thuật toántoán
Cho I là tập nhận được từ thuật toánCho I là tập nhận được từ thuật toán
Cho J là một tập tối ưu.Cho J là một tập tối ưu.
Chứng minh lợi nhuận của I và của J Chứng minh lợi nhuận của I và của J bằng nhau.bằng nhau.
7676
Quy ướcQuy ước
Ký hiệu:Ký hiệu:
n việc được xếp thứ tự 1,2,…,n để g n việc được xếp thứ tự 1,2,…,n để g giảmgiảm
Tập việc là một bảng jTập việc là một bảng j
n>0, d[i]>0n>0, d[i]>0
Biến chặn 0: d[0]=0; j[0]=0Biến chặn 0: d[0]=0; j[0]=0
7777
Thuật toánThuật toán
Săp_xếp(d)Săp_xếp(d){{d[0]=0; j[0]=0;d[0]=0; j[0]=0;j[1]=1; k=1;j[1]=1; k=1;for i=2 to n do{for i=2 to n do{ r=k;r=k;
while d[j[r]]>max(d[i],r) do r=r-1;while d[j[r]]>max(d[i],r) do r=r-1;if d[j[r]]≤d[i] and d[i]>r then {if d[j[r]]≤d[i] and d[i]>r then {
for (l=k,r+1,-1) do j[l+1]=j[l];for (l=k,r+1,-1) do j[l+1]=j[l];j[r+1]=i;j[r+1]=i;k=k+1;}}k=k+1;}}
return j;return j;}}
7878
Phân tích thuật toánPhân tích thuật toán
1.1. Kiểm tra thuật toánKiểm tra thuật toán
2.2. Tính độ phức tạp của thuật toánTính độ phức tạp của thuật toán
3.3. Cải tiến cách kiểm tra tập tiềm Cải tiến cách kiểm tra tập tiềm năng. Viết thuật toán mới với độ năng. Viết thuật toán mới với độ phức tạp O(n lg n)phức tạp O(n lg n)
7979
Thuật toán định hướngThuật toán định hướng
Với một số bài toán tối ưu, thuật toán Với một số bài toán tối ưu, thuật toán tìm nghiệm chính xác có độ phức tạp tìm nghiệm chính xác có độ phức tạp rất lớn.rất lớn.
Ta sử dụng các thuật toán đơn giản, tìm Ta sử dụng các thuật toán đơn giản, tìm nghiệm xấp xỉ.nghiệm xấp xỉ.
(chú ý rằng trong 1 số trường hợp, t.t.x.x (chú ý rằng trong 1 số trường hợp, t.t.x.x không cho kết quả tối ưu)không cho kết quả tối ưu)
8080
Tô màu đồ thịTô màu đồ thị
Bài toánBài toán: Cho một đồ thị vô hướng : Cho một đồ thị vô hướng G=(V,E). Tô màu G là tô màu các đỉnh G=(V,E). Tô màu G là tô màu các đỉnh sao cho hai đỉnh liên thuộc không cùng sao cho hai đỉnh liên thuộc không cùng màu.màu.Tìm cách tô màu sử dụng ít màu nhất.Tìm cách tô màu sử dụng ít màu nhất.
Kết quả đã biếtKết quả đã biết: các thuật oán tối ưu : các thuật oán tối ưu đã biết đều có độ phức tạp là hàm mũ.đã biết đều có độ phức tạp là hàm mũ.
Mục đíchMục đích: Tìm thuật toán xấp xỉ.: Tìm thuật toán xấp xỉ.
8181
Thuật toán xấp xỉThuật toán xấp xỉ
Thuật toán: Thuật toán:
1.1. chọn 1 màu và 1 đỉnh bất kì, tô màu chọn 1 màu và 1 đỉnh bất kì, tô màu đỉnh đó.đỉnh đó.
2.2. xét các đỉnh còn lại, đỉnh nào tô xét các đỉnh còn lại, đỉnh nào tô được màu vừa chọn thì tôđược màu vừa chọn thì tô
3.3. nếu còn lại một số đỉnh, quay lại nếu còn lại một số đỉnh, quay lại bước 1bước 1
8282
Đánh giáĐánh giá
Cho đồ thị G, p là một hoán vị các đỉnh của Cho đồ thị G, p là một hoán vị các đỉnh của G, c(p) là số màu nhận được bởi t.t.x.x, G, c(p) là số màu nhận được bởi t.t.x.x, c là số màu tối ưu. Ta cóc là số màu tối ưu. Ta có
1.1. Tồn tại một hoán vị p để c(p)=cTồn tại một hoán vị p để c(p)=c2.2. Với mọi a>0, tồn tị G, p để c/c(p) < aVới mọi a>0, tồn tị G, p để c/c(p) < a
Như vậy t.t.x.x có thể đạt tối ưu, và cũng có Như vậy t.t.x.x có thể đạt tối ưu, và cũng có thể “xấu” tùy ý.thể “xấu” tùy ý.
8383
Người đưa hàngNgười đưa hàng
Bài toánBài toán: Cho một đồ thị có hướng, : Cho một đồ thị có hướng, các cạnh có độ dài. Tìm một chu các cạnh có độ dài. Tìm một chu trình ngắn nhất bắt đầu và kết thúc trình ngắn nhất bắt đầu và kết thúc tại một đỉnh, và đi qua mỗi đỉnh còn tại một đỉnh, và đi qua mỗi đỉnh còn lại đúng một lần.lại đúng một lần.
G=(V,E), V={1,2,..,n}, L[i,j]: độ dài G=(V,E), V={1,2,..,n}, L[i,j]: độ dài cạnhcạnh
8484
Thuật toán xấp xỉThuật toán xấp xỉ
Ở mỗi bước, chọn một cạnh ngắn nhất Ở mỗi bước, chọn một cạnh ngắn nhất chưa được xét thỏa mãn:chưa được xét thỏa mãn: Không tạo nên một chu trình với các Không tạo nên một chu trình với các
cạnh đã chọn (trừ trường hợp cạnh cuối cạnh đã chọn (trừ trường hợp cạnh cuối cùng)cùng)
Không là cạnh thứ 3 liên hệ với cùng Không là cạnh thứ 3 liên hệ với cùng một đỉnh.một đỉnh.
8585
Ví dụVí dụ
đến j= 2 3 4 5 6đến j= 2 3 4 5 6Từ i= 1 Từ i= 1 3 10 11 7 25 3 10 11 7 25
2 6 12 8 262 6 12 8 26 3 9 4 203 9 4 20 4 5 154 5 15 5 185 18
Các cạnh được chọn là: 12, 35, 45, 23, 46, 16, tạo Các cạnh được chọn là: 12, 35, 45, 23, 46, 16, tạo chu trình (1,2,3,5,4,6,1), độ dài 58.chu trình (1,2,3,5,4,6,1), độ dài 58.
Kết quả này không tối ưu (56 là tối ưu)Kết quả này không tối ưu (56 là tối ưu)
8686
Chương 4: Phương pháp Chương 4: Phương pháp “chia để trị”“chia để trị”
I.I. Giới thiệu chungGiới thiệu chung
II.II. Xác định ngưỡngXác định ngưỡng
III.III. Phương pháp “phân đôi”Phương pháp “phân đôi”
IV.IV. Sắp xếp “xen kẽ”. Sắp xếp nhanh Sắp xếp “xen kẽ”. Sắp xếp nhanh
V.V. Số học các số nguyên lớnSố học các số nguyên lớn
VI.VI. Nhân ma trậnNhân ma trận
VII.VII. Giới thiệu về mật mãGiới thiệu về mật mã
8787
Giới thiệu chungGiới thiệu chung(divide and conquer (divide and conquer
algorithms)algorithms)Ý tưởngÝ tưởng: để giải quyết một bài toán, : để giải quyết một bài toán, 1.1. chia ra làm nhiều phần nhỏ hơn, chia ra làm nhiều phần nhỏ hơn, 2.2. giải quyết từng phần độc lập, giải quyết từng phần độc lập, 3.3. sau đó từ các kết quả này, xây dựng sau đó từ các kết quả này, xây dựng
kết quả của bài toán ban đầu.kết quả của bài toán ban đầu.
Viêc giải quyết các phần nhỏ hơn này Viêc giải quyết các phần nhỏ hơn này có thể thực hiên một cách đệ qui.có thể thực hiên một cách đệ qui.
8888
Thuật toán sinhThuật toán sinh
Thuật_toán DAC(x){Thuật_toán DAC(x){//t.t. này cho kết quả y ứng với đầu vào x//t.t. này cho kết quả y ứng với đầu vào xifif (x đủ nhỏ) (x đủ nhỏ) thenthen returnreturn base(x); base(x);chia x thành x_1, x_2, …, x_k;chia x thành x_1, x_2, …, x_k;forfor (i=1 (i=1 toto k) k) dodo y_i = DAC(x_i); y_i = DAC(x_i);hợp các y_i lại để tìm ra y;hợp các y_i lại để tìm ra y;returnreturn y; y;
} }
8989
Bài toán tìm kiếmBài toán tìm kiếm
Bài toánBài toán: Cho bảng T[1..n] các số được xếp : Cho bảng T[1..n] các số được xếp tăng dần. Cho số x. Tìm phần tử trong T có tăng dần. Cho số x. Tìm phần tử trong T có giá trị xgiá trị x
Thuật toán đơn giảnThuật toán đơn giản: :
whilewhile (T[i]≤x) (T[i]≤x) do ifdo if (T[i]=x) (T[i]=x) thenthen returnreturn i; i;
elseelse i=i+1; i=i+1;
Độ phức tạpĐộ phức tạp: O(n): O(n)
9090
Phương pháp “phân đôi”Phương pháp “phân đôi”
funtion dictofuntion dicto (T[i..j],x){ (T[i..j],x){if if (i=j) (i=j) thenthen { { ifif (T[i]=x) (T[i]=x) then returnthen return i; i;
else returnelse return “không có”; “không có”;elseelse { k=(i+j+1)/2; { k=(i+j+1)/2;
ifif (x < T[k]) (x < T[k]) then then returnreturn dictodicto(T[i..k-1],x);(T[i..k-1],x);
else returnelse return dictodicto(T[k..j],x);(T[k..j],x); }}}}
Độ phức tạp : ?Độ phức tạp : ?
9191
Sắp xếp xen kẽ (Merge sort)Sắp xếp xen kẽ (Merge sort)
Ý tưởng:Ý tưởng:Để xếp bảng T:Để xếp bảng T:
1.1. Chia T thành 2 bảng độ dài bằng nhauChia T thành 2 bảng độ dài bằng nhau2.2. Sắp xếp mỗi bảng con nàySắp xếp mỗi bảng con này3.3. Từ hai bảng con đã sắp, xếp xen kẽ lại để Từ hai bảng con đã sắp, xếp xen kẽ lại để
được bảng T sắp xếpđược bảng T sắp xếp
Chú ýChú ý: bước 2 được thực hiện đệ qui : bước 2 được thực hiện đệ qui
9292
Thuật toán Merge-sortThuật toán Merge-sort
Merge-Sort(A,p,r){Merge-Sort(A,p,r){
1.1. ifif p < r p < r thenthen { {
2.2. q = q = [(p+r-1)/2];[(p+r-1)/2];
3.3. Merge-Sort(A,p,q);Merge-Sort(A,p,q);
4.4. Merge-Sort(A,q+1,r);Merge-Sort(A,q+1,r);
5.5. Merge(A,p,q,r);Merge(A,p,q,r);
}}
}}
9393
Phân tích thuật toánPhân tích thuật toán
Đây là một thuật toán chia để trị.Đây là một thuật toán chia để trị.
ChiaChia:: bước 2: bước 2: θθ(1)(1)
TrịTrị:: bước 3 và 4:bước 3 và 4: 2T(n/2)2T(n/2)
Hợp lạiHợp lại:: bước 5:bước 5: θθ(n)(n)
Tổng kếtTổng kết::
T(n) = T(n) = θθ(1)(1) nếu n=1nếu n=1
2T(n/2) + 2T(n/2) + θθ(n)(n) nếu n >1nếu n >1
9494
Sắp xếp nhanh (quicksort)Sắp xếp nhanh (quicksort)
ChiaChia: Bảng T[p..r] được chia thành 2 : Bảng T[p..r] được chia thành 2 phần T[p..q] và T[q+1..r] sao cho phần T[p..q] và T[q+1..r] sao cho mọi phần tử trong bảng 1 nhỏ hơn mọi phần tử trong bảng 1 nhỏ hơn mọi phần tử bảng 2mọi phần tử bảng 2
TrịTrị:: Mỗi bảng con được sắp xếp đệ Mỗi bảng con được sắp xếp đệ quiqui
HợpHợp: Vì mỗi bảng đã đúng vị trí. Kết : Vì mỗi bảng đã đúng vị trí. Kết thúc.thúc.
9595
Thuật toán quicksortThuật toán quicksort
QuicksortQuicksort(A,p,r){(A,p,r){1.1. if (p<r) then {if (p<r) then {2.2. q=Partition(A,p,r);q=Partition(A,p,r);3.3. Quicksort(A,p,q);Quicksort(A,p,q);4.4. Quicksort(A,q+1,r);Quicksort(A,q+1,r);
}}}}
9696
Chia đôi bảng (Partition)Chia đôi bảng (Partition)
Ví dụ:Ví dụ:
5 3 2 6 4 1 3 75 3 2 6 4 1 3 7
55 3 2 6 4 1 3 2 6 4 1 33 7 7
33 3 2 6 4 1 3 2 6 4 1 55 7 7
3 3 2 3 3 2 66 4 4 11 5 7 5 7
3 3 2 1 3 3 2 1 44 66 5 7 5 7
9797
PartitionPartition
PartitionPartition(A,p,r){(A,p,r){1.1. x = A[p];x = A[p];2.2. i = p-1; j = r+1;i = p-1; j = r+1;3.3. whilewhile (i<j) (i<j) dodo { {4.4. repeatrepeat j = j-1 j = j-1 until until A[j] ≤ x;A[j] ≤ x;5.5. repeat repeat i = i+1 i = i+1 untiluntil A[i] ≥ x; A[i] ≥ x;6.6. ifif (i<j) (i<j) thenthen exchange (A[i], A[j]); exchange (A[i], A[j]);7.7. else returnelse return j; j;8.8. }}} }
9898
Phân tích thuật toánPhân tích thuật toán
1.1. Partition(A,p,r): O(r-p)Partition(A,p,r): O(r-p)
2.2. Trường hợp xấu nhấtTrường hợp xấu nhất: mỗi lần chia bảng ta : mỗi lần chia bảng ta được 1 bảng 1 phần tử, và một bảng tất cả phần được 1 bảng 1 phần tử, và một bảng tất cả phần tử còn lại: T(n) = T(n-1) + tử còn lại: T(n) = T(n-1) + θθ(n).(n). Như vậy: Như vậy: T(n) = T(n) = θθ(n^2)(n^2)
3.3. Trường hợp tốt nhấtTrường hợp tốt nhất: bảng luôn phân đôi đều:: bảng luôn phân đôi đều:T(n) = 2 T(n/2) + T(n) = 2 T(n/2) + θθ(n). Như vậy: T(n) = (n). Như vậy: T(n) = θθ(n lg n)(n lg n)
Câu hỏiCâu hỏi: Cho ví dụ về trường hợp xấu nhất, tốt nhất.: Cho ví dụ về trường hợp xấu nhất, tốt nhất.
9999
Độ phức tạp trung bìnhĐộ phức tạp trung bình
100100
Số học các số nguyên lớnSố học các số nguyên lớn
Phép nhân hai số nguyên cực lớn:Phép nhân hai số nguyên cực lớn:
Bài toán: Cho u và v là hai số nguyên Bài toán: Cho u và v là hai số nguyên lớn, giả sử mỗi số biểu diễn bởi n lớn, giả sử mỗi số biểu diễn bởi n chữ số.chữ số.
Tìm thuật toán nhân u và v hiệu quả.Tìm thuật toán nhân u và v hiệu quả.
101101
Phân tích vấn đềPhân tích vấn đề
a b
c d
n
n
u
v
u v = 10^{2s} ac + 10 ^s (ad+bc) + bd (s = n/2)
102102
Phân tích vấn đề (tiếp)Phân tích vấn đề (tiếp)
Nhận xét:Nhận xét:
r = (a+b)(c+d) = ac+(ad+bc)+bdr = (a+b)(c+d) = ac+(ad+bc)+bd
Thay vì tính 4 phép nhân ac, bd, ad, Thay vì tính 4 phép nhân ac, bd, ad, bc, bc,
Ta tính ac, bd, và rTa tính ac, bd, và r
103103
Thuật toán nhânThuật toán nhân
MultMult(u,v){(u,v){1.1. n= min(size(u), size(v));n= min(size(u), size(v));2.2. ifif (n bé) (n bé) then returnthen return uv; uv;3.3. elseelse { s = n/2; { s = n/2;4.4. a= u div (10^s), b= u mod 10^s;a= u div (10^s), b= u mod 10^s;5.5. c= v div (10^s), d= v mod 10^s;c= v div (10^s), d= v mod 10^s;6.6. r= Mult(a+b,c+d);r= Mult(a+b,c+d);7.7. p=Mult(a,c); q= Mult(b,d);p=Mult(a,c); q= Mult(b,d);8.8. t = r-p-q;t = r-p-q;9.9. returnreturn(p*10^{2s} + t*10^s+q);(p*10^{2s} + t*10^s+q);10.10. }}}}
104104
Độ phức tạp thuật toánĐộ phức tạp thuật toán
T(n) = 3 T(n/2)+ T(n) = 3 T(n/2)+ θθ(n)(n)T(n) = T(n) = θθ(n ^{lg 3}) ≈ (n ^{lg 3}) ≈ θθ(n^{1,59})(n^{1,59})
Bài tậpBài tập: Thay đổi thuật toán để làm : Thay đổi thuật toán để làm việc với các biểu diễn nhị phân và các việc với các biểu diễn nhị phân và các phép toán trong biểu diễn nhị phânphép toán trong biểu diễn nhị phân
105105
Nhân hai ma trậnNhân hai ma trận
Bài toán: Cho 2 ma trận A, và B, kích Bài toán: Cho 2 ma trận A, và B, kích cỡ n*n. Tìm ma trận tích C = A*B.cỡ n*n. Tìm ma trận tích C = A*B.
Thuật toán đơn giản: T(n) = Thuật toán đơn giản: T(n) = θθ(n^3)(n^3)
106106
Thuật toán StrassenThuật toán Strassen
Ý tưởng:Ý tưởng:
A = A = a1 a2
a3 a4
b1 b2
b3 b4
B =
m2+m3
m1+m2+m4+m5m1+m2+m4-m7
m1+m2+m5+m6
A*B =
107107
Tính m_iTính m_i
m1 = (a3+a4-a1)(b4-b2+b1)m1 = (a3+a4-a1)(b4-b2+b1)
m2 = a1 *b1m2 = a1 *b1
m3 = a2* b3m3 = a2* b3
m4= (a1-a3)(b4-b2)m4= (a1-a3)(b4-b2)
m5= (a3+a4)(b2-b1)m5= (a3+a4)(b2-b1)
m6 = (a2-a3+a1-a4)*b4m6 = (a2-a3+a1-a4)*b4
m7 = a4*(b1+b4-b2-b3)m7 = a4*(b1+b4-b2-b3)
108108
Độ phức tạp tính toánĐộ phức tạp tính toán
T(n) = 7 T(n/2) + T(n) = 7 T(n/2) + θθ(n^2) (n^2)
≈ ≈ θθ(n^{2,81}) (n^{2,81})
109109
Giới thiệu về mật mãGiới thiệu về mật mã
Vấn đềVấn đề: A và B muốn trao đổi thông tin sao cho C : A và B muốn trao đổi thông tin sao cho C đọc được nhưng không hiểu được.đọc được nhưng không hiểu được.
Giải quyết:Giải quyết: A, B chọn số nguyên tố lớn p và số g, 2 ≤ g ≤ p-1.A, B chọn số nguyên tố lớn p và số g, 2 ≤ g ≤ p-1.A chọn số A, B chọn số B ≤ p. A gửi số a, B gửi số b. A chọn số A, B chọn số B ≤ p. A gửi số a, B gửi số b. C biết đươc p,g,a,b. Nhưng không biết x.C biết đươc p,g,a,b. Nhưng không biết x.
A: a= g^A mod p B: g^b mod p
A: x= b^A mod p B: y = a^B mod p
a
b
=
110110
Thuật toán logarithm rời rạcThuật toán logarithm rời rạc
Muốn tìm x, C phải tìm A (hoặc B).Muốn tìm x, C phải tìm A (hoặc B).
Muốn tìm A, biết a, C phải tính logarithmMuốn tìm A, biết a, C phải tính logarithm
logDlogD(g,a,p){(g,a,p){
A=0; x=1;A=0; x=1;
dodo { A=A+1; x = xg;} { A=A+1; x = xg;}
while while ((a= x mod p) or (A=p))((a= x mod p) or (A=p))
returnreturn A; A;
}}
111111
Phân tích thuật toánPhân tích thuật toán
Trung bình: logD có p/2 vòng lặp while.Trung bình: logD có p/2 vòng lặp while.
Nếu p rất lớn (vài chục chữ số) thì t.t. Nếu p rất lớn (vài chục chữ số) thì t.t. chạy rất lâu.chạy rất lâu.
Chưa biết t.t. nào cải thiện hàm logDChưa biết t.t. nào cải thiện hàm logD
112112
Thuật toán Mũ Thuật toán Mũ (exponentiation)(exponentiation)
A phải tính g^A mod pA phải tính g^A mod p
Thuật toán đơn giản:Thuật toán đơn giản:
expD(g,A,p){expD(g,A,p){a=1;a=1;for (i=1 to A) do a = a*g mod p;for (i=1 to A) do a = a*g mod p;return a;return a;
}}
113113
Bài tậpBài tập: Viết thuật toán “chia để trị” : Viết thuật toán “chia để trị” để tính hàm mũ theo thời gian O(lg để tính hàm mũ theo thời gian O(lg p)p)
114114
Chương 5: Phương pháp Chương 5: Phương pháp qui hoạch độngqui hoạch động
I.I. Giới thiệu chungGiới thiệu chung
II.II. Nhân một dãy các ma trậnNhân một dãy các ma trận
III.III. Các đường đi ngắn nhấtCác đường đi ngắn nhất
IV.IV. Người đưa hàngNgười đưa hàng
115115
Giới thiệu chungGiới thiệu chung
So sánh với phương pháp “chia để trị”:So sánh với phương pháp “chia để trị”:- Chia thành các phần nhỏ hơnChia thành các phần nhỏ hơn- Thực hiện độc lập từng phầnThực hiện độc lập từng phần- Hợp các kết quả nhỏ lại.Hợp các kết quả nhỏ lại.
Vấn đềVấn đề: : - nếu có nhiều phần nhỏ giống nhau, liên nếu có nhiều phần nhỏ giống nhau, liên
quan đến nhauquan đến nhau - => sử dụng kết quả đã tính: lập bảng lưu => sử dụng kết quả đã tính: lập bảng lưu
trữ dần các kết quả của các phần contrữ dần các kết quả của các phần con
116116
Chia để trịChia để trị: : từ trên xuốngtừ trên xuống: nhìn ngay : nhìn ngay vào vấn đề lớn, chia nhỏ ra, trị phần vào vấn đề lớn, chia nhỏ ra, trị phần concon
Quy hoạch độngQuy hoạch động: : từ dưới lêntừ dưới lên: bắt đầu : bắt đầu từ các trường hợp đơn giản, nhỏ, xây từ các trường hợp đơn giản, nhỏ, xây dựng dần lên, đến bài toán tổng kết dựng dần lên, đến bài toán tổng kết cuối cùng.cuối cùng.
117117
Ví dụ nhỏ: phép tính tổ hợpVí dụ nhỏ: phép tính tổ hợp
Tính C(n,k) = n!/(n-k)!k!Tính C(n,k) = n!/(n-k)!k!
Thuật toán đơn giảnThuật toán đơn giản::
function C(n,k){function C(n,k){if if (k=0 (k=0 ou ou k=n) k=n) then returnthen return 1; 1;else returnelse return C(n-1,k-1)+C(n,k-1); C(n-1,k-1)+C(n,k-1);
}}
Câu hỏiCâu hỏi: tính độ phức tạp tính toán của thuật toán này: tính độ phức tạp tính toán của thuật toán này
118118
Ví dụ nhỏ: phép tính tổ hợp Ví dụ nhỏ: phép tính tổ hợp (tiếp)(tiếp)
Cải thiện thuật toánCải thiện thuật toán: dùng tam giác Pascal: dùng tam giác Pascal
0.0. 111.1. 11 1 12.2. 11 2 1 2 13.3. 1 3 3 11 3 3 14.4. 1 4 6 4 11 4 6 4 15.5. 1 5 10 10 5 11 5 10 10 5 1
Câu hỏiCâu hỏi: Viết thuật toán bằng cách dùng bảng lưu : Viết thuật toán bằng cách dùng bảng lưu trữ kết quả, tính độ phức tạp tính toán của t.t. đó.trữ kết quả, tính độ phức tạp tính toán của t.t. đó.
119119
Nhân một dãy các ma trậnNhân một dãy các ma trận
Vấn đềVấn đề: Ta muốn nhân một dãy các ma trận : Ta muốn nhân một dãy các ma trận M= M1xM2x…xMnM= M1xM2x…xMn
Có nhiều cách đặt các dấu ngoặc để nhân dần 2 ma trận. Có nhiều cách đặt các dấu ngoặc để nhân dần 2 ma trận. Chúng ảnh hưởng nhiều đến thời gian tính toán.Chúng ảnh hưởng nhiều đến thời gian tính toán.
Ví dụVí dụ: M=ABCD, A=(10,2); B=(2,100); : M=ABCD, A=(10,2); B=(2,100); C=(100,3); D=(3,20)C=(100,3); D=(3,20)
M=((AB)C)D: 10x2x100+2x100x3+10x3x20=3200 phép xM=((AB)C)D: 10x2x100+2x100x3+10x3x20=3200 phép xM=(AB)(CD): 10x2x100+100x3x20+10x100x20 = M=(AB)(CD): 10x2x100+100x3x20+10x100x20 = 2800028000M=(A(BC))D: 2x100x3 +10x2x3 +10x3x20 = 1260M=(A(BC))D: 2x100x3 +10x2x3 +10x3x20 = 1260M=A((BC)D): 2x100x3 +2x3x20 +10x2x20 = M=A((BC)D): 2x100x3 +2x3x20 +10x2x20 = 11201120M=A(B(CD)): 100x3x20+2x100x20 +10x2x20 = 10400M=A(B(CD)): 100x3x20+2x100x20 +10x2x20 = 10400
120120
Ý tưởng tìm cách tínhÝ tưởng tìm cách tính
Số các cách tính MSố các cách tính M (số Catalan): (số Catalan):C(n) = 1/n x C(2n-2,n-1) = C(n) = 1/n x C(2n-2,n-1) = ΩΩ (4^n/n^2) (4^n/n^2) Không thể xét tất cả các trường hợpKhông thể xét tất cả các trường hợp
Ý tưởng:Ý tưởng: Nếu để tính M, cắt khúc ở i là tối ưuNếu để tính M, cắt khúc ở i là tối ưuThì để tính M1x…xMi và M(i+1)x…xMn, ta Thì để tính M1x…xMi và M(i+1)x…xMn, ta
cũng tính cách tối ưu.cũng tính cách tối ưu.=> Lập bảng a[i,j] để lưu trữ số phép x tối => Lập bảng a[i,j] để lưu trữ số phép x tối
ưu khi tính Mix…xMjưu khi tính Mix…xMj
121121
Ý tưởng tìm cách tính (tiếp)Ý tưởng tìm cách tính (tiếp)
Chiều các ma trận: d[0..n], Mi=(d[i-1],d[i])Chiều các ma trận: d[0..n], Mi=(d[i-1],d[i])
Xây dựng a[i,j] theo từng đường chéoXây dựng a[i,j] theo từng đường chéo..Đường chéo sĐường chéo s: a[i,j]: j-i=s.: a[i,j]: j-i=s.
s=0: a[i,i]=0, i= 1,2..,ns=0: a[i,i]=0, i= 1,2..,ns=1: a[i,i+1]=d[i-1]d[i]d[i+1], i=1,2,..,n-1s=1: a[i,i+1]=d[i-1]d[i]d[i+1], i=1,2,..,n-11<s<n: i =1,2,..,n-s1<s<n: i =1,2,..,n-sa[i,i+s]=min (a[i,k]+a[k+1,i+s]+d[i-1]d[i]d[i+1])a[i,i+s]=min (a[i,k]+a[k+1,i+s]+d[i-1]d[i]d[i+1]) i≤k≤i+s-1 i≤k≤i+s-1
122122
Ý tưởng tìm cách tính: ví dụÝ tưởng tìm cách tính: ví dụ
M=ABCD, A=(10,2); B=(2,100); M=ABCD, A=(10,2); B=(2,100); C=(100,3); D=(3,20).C=(100,3); D=(3,20).
s=1:a[12]=2000,a[23]=600,a[34]=18000 s=1:a[12]=2000,a[23]=600,a[34]=18000 ……
j = 1j = 1 22 33 44i=1i=1 0 2000 ? ? 0 2000 ? ? 22 00 600 ?600 ? 3 3 00 1800018000 44 00
123123
Bài tậpBài tập
1.1. Viết thuật toán tính bảng aViết thuật toán tính bảng a
2.2. Tính độ phức tạp tính toánTính độ phức tạp tính toán
3.3. Thay đổi thuật toán thế nào để Thay đổi thuật toán thế nào để nhận được không chỉ a[1,n] mà còn nhận được không chỉ a[1,n] mà còn cả cách tính tích M tối ưu nhất.cả cách tính tích M tối ưu nhất.
124124
Các đường đi ngắn nhấtCác đường đi ngắn nhất
Bài toánBài toán: Cho đồ thị có hướng G=(V,E). : Cho đồ thị có hướng G=(V,E). Mỗi cạnh e Mỗi cạnh e ЄЄ E có độ dài l(e). Tìm E có độ dài l(e). Tìm đường đi ngắn nhất giữa các cặp đỉnh đường đi ngắn nhất giữa các cặp đỉnh của G.của G.
Ký hiệuKý hiệu: V={1,2,…,n}: V={1,2,…,n}
L[i,i] = 0, L[i,j] = l(e) nếu e=(i,j)L[i,i] = 0, L[i,j] = l(e) nếu e=(i,j)
L[i,j] = ∞ nếu không có cạnh (i,j) .L[i,j] = ∞ nếu không có cạnh (i,j) .
125125
Ý tưởng thuật toánÝ tưởng thuật toán
1.1. Nếu k nằm trên 1 đường đi ngắn nhất Nếu k nằm trên 1 đường đi ngắn nhất từ i đến j thì đoạn từ i đến k và từ k từ i đến j thì đoạn từ i đến k và từ k đến j cũng là những đường đi ngắn đến j cũng là những đường đi ngắn nhất.nhất.
2.2. Xây dựng D[i,j] độ dài min từ i đến j:Xây dựng D[i,j] độ dài min từ i đến j:1.1. Lúc đầu: D=LLúc đầu: D=L
2.2. Sau bước thứ k, D[i,j] là độ dài min từ i đến Sau bước thứ k, D[i,j] là độ dài min từ i đến j (mà chỉ đi qua các đỉnh 1,2,..,k)j (mà chỉ đi qua các đỉnh 1,2,..,k)
3.3. Sau n bước, D[i,j] là độ dài min từ i đến j.Sau n bước, D[i,j] là độ dài min từ i đến j.
126126
Ví dụVí dụ
0 5 ∞ ∞0 5 ∞ ∞D0=L= 50 0 15 5D0=L= 50 0 15 5 30 ∞ 0 1530 ∞ 0 15 15 ∞ 5 015 ∞ 5 0 0 5 ∞ ∞0 5 ∞ ∞D1= 50 0 15 5D1= 50 0 15 5 30 35 0 1530 35 0 15 15 20 5 015 20 5 0
0 5 20 10 0 5 20 10 0 5 15 100 5 20 10 0 5 20 10 0 5 15 10D2= 50 0 15 5 D3= 50 0 15 5 D4= 20 0 10 5 D2= 50 0 15 5 D3= 50 0 15 5 D4= 20 0 10 5 30 35 0 15 30 35 0 15 30 35 0 1530 35 0 15 30 35 0 15 30 35 0 15 15 20 5 0 15 20 5 0 15 20 5 015 20 5 0 15 20 5 0 15 20 5 0
1
2 3
415
5 50
5
30
15 5
15
127127
Thuật toán FloydThuật toán Floyd
FloydFloyd(L){(L){array D = L;array D = L;forfor (k=1 (k=1 toto n) n) dodo
for for (i=1 (i=1 toto n) n) do do forfor (j=1 (j=1 toto n) n) dodo
D[i,j]= min(D[i,j],D[i,k]+D[k,j]);D[i,j]= min(D[i,j],D[i,k]+D[k,j]);returnreturn D; D;
}}
128128
Bài tậpBài tập
1.1. Tìm độ phức tạp của thuật toán FloydTìm độ phức tạp của thuật toán Floyd2.2. Chứng minh tính đúng đắn của thuật Chứng minh tính đúng đắn của thuật
toántoán3.3. Nếu muốn biết không chỉ độ dài mà Nếu muốn biết không chỉ độ dài mà
cả đường đi ngắn nhất, phải thêm gì cả đường đi ngắn nhất, phải thêm gì vào thuật toán ?vào thuật toán ?
4.4. Viết thuật toán xác định xem có Viết thuật toán xác định xem có đường đi giữa các cặp đỉnh của G.đường đi giữa các cặp đỉnh của G.
129129
Người đưa hàngNgười đưa hàng
Bài toánBài toán: Cho một đồ thị có hướng, : Cho một đồ thị có hướng, các cạnh có độ dài. Tìm một chu các cạnh có độ dài. Tìm một chu trình ngắn nhất bắt đầu và kết thúc trình ngắn nhất bắt đầu và kết thúc tại một đỉnh, và đi qua mỗi đỉnh còn tại một đỉnh, và đi qua mỗi đỉnh còn lại đúng một lần.lại đúng một lần.
G=(V,E), V={1,2,..,n}, L[i,j]: độ dài G=(V,E), V={1,2,..,n}, L[i,j]: độ dài cạnh.cạnh.
130130
Ý tưởng thuật toánÝ tưởng thuật toán
1.1. Chu trình bắt đầu từ đỉnh 1.Chu trình bắt đầu từ đỉnh 1.Min chu trình bắt đầu từ 1Min chu trình bắt đầu từ 1
= min (L[1,j]+ min đường từ j đến 1) = min (L[1,j]+ min đường từ j đến 1) 2.2. Cho S tập con của VCho S tập con của V\{1}, i \{1}, i ЄЄ V\S: V\S:
g(i,S)=min (đường từ i đến 1 qua S đúng 1 lần)g(i,S)=min (đường từ i đến 1 qua S đúng 1 lần)3.3. Min chu trình = g(1, V\{1})Min chu trình = g(1, V\{1})
= min(L[1,j]+g(j,V\{1,j}))= min(L[1,j]+g(j,V\{1,j})) 2≤j≤n2≤j≤n
4.4. g(i,S)= min (L[i,j] + g(j,S\{j}))g(i,S)= min (L[i,j] + g(j,S\{j})) jjЄЄSS
5.5. g(i,Ø)=L[i,1], i=2,3,..,ng(i,Ø)=L[i,1], i=2,3,..,n
131131
Ví dụVí dụ
0 10 15 200 10 15 20 5 0 9 105 0 9 10
L = 6 13 0 12L = 6 13 0 12 8 8 9 08 8 9 0
1.1. Tính g(j,Tính g(j,Ø); j= 2,3,4Ø); j= 2,3,42.2. Tính g(j,S) với |S|=1;j=2,3,4Tính g(j,S) với |S|=1;j=2,3,43.3. Tính g(j,S) với |S|=2;j=2,3,4Tính g(j,S) với |S|=2;j=2,3,44.4. Tính g(1,{2,3,4})Tính g(1,{2,3,4})
4 3
1 210
5
20 8 913
12
9
810
6 15
132132
Bài tậpBài tập
1.1. Viết thuật toán tính chu trình ngắn nhất Viết thuật toán tính chu trình ngắn nhất theo ý tưởng đã trình bày.theo ý tưởng đã trình bày.
2.2. Tính toán độ phức tạp và bộ nhớ cần cho Tính toán độ phức tạp và bộ nhớ cần cho t.t.t.t.
3.3. Tính xem thực chất có bao nhiêu giá trị Tính xem thực chất có bao nhiêu giá trị g(i,S) cần phải tính ?g(i,S) cần phải tính ?
4.4. Có thể cải thiện t.t. trên để tiết kiệm số Có thể cải thiện t.t. trên để tiết kiệm số lần tính g(i,S) không (mỗi giá trị tính lần tính g(i,S) không (mỗi giá trị tính đúng 1 lần) ?đúng 1 lần) ?
133133
Hàm nhớHàm nhớ
Thuật toán đơn giản tính g(i,S)Thuật toán đơn giản tính g(i,S)
function g(i,S){function g(i,S){if (S=if (S=Ø) then return L[i,1];Ø) then return L[i,1];min = ∞;min = ∞;for (jfor (jЄЄS) do {S) do { d=L[i,j]+g(j,S\{j});d=L[i,j]+g(j,S\{j});
if (d<min) then min =d;}if (d<min) then min =d;}return min;return min;
}}
Số lần gọi các hàm g là Số lần gọi các hàm g là ΩΩ((n-1)!), nhiều giá trị được tính lại ((n-1)!), nhiều giá trị được tính lại nhiều lầnnhiều lần
134134
Hàm nhớ (tiếp)Hàm nhớ (tiếp)
1.1. Lập một bảng gtab[.,.] để nhớ những giá trị g[i,S] đã được Lập một bảng gtab[.,.] để nhớ những giá trị g[i,S] đã được tính. tính.
2.2. Khi gọi hàm g(i,S), sẽ kiểm tra xem g(i,S) đã được tính Khi gọi hàm g(i,S), sẽ kiểm tra xem g(i,S) đã được tính chưachưa
3.3. Lúc đầu gtab[i,S] = -1 với mọi i, S.Lúc đầu gtab[i,S] = -1 với mọi i, S.
function g(i,S){function g(i,S){if (S=if (S=Ø) then return L[i,1];Ø) then return L[i,1];if (gtab[i,S]≥0) then return gtab[i,S];if (gtab[i,S]≥0) then return gtab[i,S];min = ∞;min = ∞;for (jfor (jЄЄS) do {S) do { d=L[i,j]+g(j,S\{j});d=L[i,j]+g(j,S\{j});
if (d<min) then min =d;}if (d<min) then min =d;}gtab[i,S]= min; return min;gtab[i,S]= min; return min;
}}
135135
So sánhSo sánh
1.1. Thời gian t.t. đơn giản: n!Thời gian t.t. đơn giản: n!2.2. Thời gian t.t. cải tiến: n^2 2^nThời gian t.t. cải tiến: n^2 2^n3.3. Bộ nhớ t.t. cải tiến: n 2^nBộ nhớ t.t. cải tiến: n 2^n
nn n!n! n^2 2^nn^2 2^n n 2^nn 2^n55 120120 800800 1601601010 36288003628800 102400102400 10240102401515 1,3 x 10^121,3 x 10^12 73728007372800 4915204915202020 2,4 x 10^182,4 x 10^18 419430400419430400
29715202971520
136136
Chương 6: Thuật toán trên đồ Chương 6: Thuật toán trên đồ thịthị
I.I. Giới thiệu chungGiới thiệu chung
II.II. Khám phá cây Khám phá cây
III.III. Khám phá theo chiều rộngKhám phá theo chiều rộng
IV.IV. Khám phá theo chiều sâuKhám phá theo chiều sâu
V.V. ““Branch and bound”Branch and bound”
137137
Giới thiệu chungGiới thiệu chung
1.1. Đồ thị biểu diễn nhiều vấn đề:Đồ thị biểu diễn nhiều vấn đề:1.1. Mạng, trò chơi, sơ đồ,…Mạng, trò chơi, sơ đồ,…2.2. Cấu trúc dữ liệu: đỉnh là một số bit bộ Cấu trúc dữ liệu: đỉnh là một số bit bộ
nhớ, cạnh là các con trỏ,…nhớ, cạnh là các con trỏ,…
2.2. Biểu diễn đồ thị, có nhiều cách:Biểu diễn đồ thị, có nhiều cách:1.1. Ma trận: a[i,j]=1 nếu có cạnh (i,j), =0 Ma trận: a[i,j]=1 nếu có cạnh (i,j), =0
nếu khôngnếu không2.2. Dãy liên hệ: Adj[i] là một dãy các cạnh Dãy liên hệ: Adj[i] là một dãy các cạnh
được nối với i, i là các đỉnh của đồ thị.được nối với i, i là các đỉnh của đồ thị.
138138
Khám phá cây Khám phá cây
Xét các cây nhị phân, có 3 cách khám phá:Xét các cây nhị phân, có 3 cách khám phá:1.1. Thứ tự trước (prefix)Thứ tự trước (prefix)2.2. Thứ tự giữa (infix)Thứ tự giữa (infix)3.3. Thứ tự sau (suffix)Thứ tự sau (suffix)
Visit_prefix Visit_prefix (r){ //r là gốc của cây(r){ //r là gốc của cây print (r.value);print (r.value);
if (r.left<>Null) then visit_prefix(r.left);if (r.left<>Null) then visit_prefix(r.left);if (r.right<>Null) then visit_prefix(r.right);if (r.right<>Null) then visit_prefix(r.right);}}
Chứng minh độ phức tạp tính toán của t.t. là O(n)Chứng minh độ phức tạp tính toán của t.t. là O(n)
139139
Khám phá theo chiều rộng Khám phá theo chiều rộng (Breadth-first search)(Breadth-first search)
1.1. Chọn một đỉnh nguồn s, và thăm các đỉnh Chọn một đỉnh nguồn s, và thăm các đỉnh khác theo thứ tự từ gần đến xa skhác theo thứ tự từ gần đến xa s
2.2. Thăm u: thăm tất cả các lân cận của u, sau Thăm u: thăm tất cả các lân cận của u, sau đó mới thăm lân cận của các đỉnh nàyđó mới thăm lân cận của các đỉnh này
3.3. Xây dựng cây có gốc s.Xây dựng cây có gốc s.4.4. Tô màu các đỉnh:Tô màu các đỉnh:
1.1. Lúc đầu tất cả màu trắngLúc đầu tất cả màu trắng2.2. Bắt đầu thăm u, tô u màu vàngBắt đầu thăm u, tô u màu vàng3.3. Nếu đã thăm mọi lân cận của u, tô u màu đỏNếu đã thăm mọi lân cận của u, tô u màu đỏ
5.5. Một xâu nhớ (FIFO) Q lưu trữ các đỉnh vàng Một xâu nhớ (FIFO) Q lưu trữ các đỉnh vàng
140140
Ví dụVí dụ
141141
Thuật toánThuật toán
BFS (G,s){BFS (G,s){for for (u (u ЄЄ V\{s}) V\{s}) dodo { {
color[u]= T ; d[u]=∞; p[u]=Null;}color[u]= T ; d[u]=∞; p[u]=Null;}color[s]= V ; d[s]=0; p[s]=Null; Q={s};color[s]= V ; d[s]=0; p[s]=Null; Q={s};whilewhile (Q<>Ø) (Q<>Ø) do do {{
u=head(Q);u=head(Q);for for (v (v ЄЄ Adj[u]) Adj[u]) dodo{ {
ifif (color[v]=T) (color[v]=T) thenthen { {color[v]=V; d[v]=d[u]+1; color[v]=V; d[v]=d[u]+1; p[v]=u; p[v]=u; addadd(Q,v);}}(Q,v);}}
supsup(Q);(Q);color[u]=Đ;}color[u]=Đ;}
}}
142142
Phân tíchPhân tích
11 Định lýĐịnh lý: Nếu đồ thị liên thông. Sau : Nếu đồ thị liên thông. Sau BFS, ta nhận được cây gốc s và BFS, ta nhận được cây gốc s và đường đi từ s đến u là 1 đường đi đường đi từ s đến u là 1 đường đi ngắn nhất từ s đến u trong G.ngắn nhất từ s đến u trong G.
22 Tính độ phức tạp và bộ nhớ cho t.t. Tính độ phức tạp và bộ nhớ cho t.t. BFSBFS
143143
Khám phá theo chiều sâuKhám phá theo chiều sâu(Deep-first search)(Deep-first search)
1.1. Thăm u, rồi thăm 1 lân cận v của u, rồi Thăm u, rồi thăm 1 lân cận v của u, rồi thăm 1 lân cận của v, …thăm 1 lân cận của v, …
2.2. Hàm thăm này được gọi đệ qui.Hàm thăm này được gọi đệ qui.
3.3. Sau mỗi lệnh thăm v lân cận của u, nếu u Sau mỗi lệnh thăm v lân cận của u, nếu u còn lân cận nào, thì lại thăm,…còn lân cận nào, thì lại thăm,…
4.4. Nếu bắt đầu từ s, sau khi thăm s, còn các Nếu bắt đầu từ s, sau khi thăm s, còn các đỉnh, ta lại chọn một đỉnh mới để thăm.đỉnh, ta lại chọn một đỉnh mới để thăm.
5.5. Xây dựng được một rừng.Xây dựng được một rừng.
144144
Ký hiệuKý hiệu
1.1. d[u]: thời điểm bắt đầu thăm ud[u]: thời điểm bắt đầu thăm u
2.2. f[u]: t.đ. Kết thúc thăm uf[u]: t.đ. Kết thúc thăm u
3.3. p[u]: cha của up[u]: cha của u
4.4. color[u] =T trước d[u], color[u] =T trước d[u],
= V đang thăm u= V đang thăm u
= Đ sau f[u]= Đ sau f[u]
145145
Ví dụVí dụ
146146
Thuật toánThuật toán
DFS(G){DFS(G){for (u for (u ЄЄ V) do { color[u]=T; V) do { color[u]=T; p[u]=Null;}p[u]=Null;}
time=0;time=0;
for (u for (u ЄЄ V) do V) do
if (color[u]=T) then DFS-visit(u);if (color[u]=T) then DFS-visit(u);
}}
147147
Thuật toán (tiếp)Thuật toán (tiếp)
DFS-visitDFS-visit(u){(u){color[u]=V; d[u]=time=time+1;color[u]=V; d[u]=time=time+1;for (vfor (vЄЄAdj[u]) do {Adj[u]) do {
if (color[v]=T) then { if (color[v]=T) then { p[v]=u; DFS-visit(v);}p[v]=u; DFS-visit(v);}
}}color[u]=Đ;color[u]=Đ;f[u]=time=time+1;f[u]=time=time+1;
}}
148148
Phân tíchPhân tích
1.1. Tính độ phức tạp và bộ nhớ cần cho Tính độ phức tạp và bộ nhớ cần cho DFSDFS
2.2. Định lýĐịnh lý: Các ngoặc (d[u],f[u]) lập : Các ngoặc (d[u],f[u]) lập thành một bộ ngoặc đơn tốt (hai thành một bộ ngoặc đơn tốt (hai ngoặc hoặc là trong nhau hoặc là ngoặc hoặc là trong nhau hoặc là rời nhau)rời nhau)
149149
Sắp xếp topologySắp xếp topology
Bài toánBài toán: Cho G là đồ thị có hướng, không chu : Cho G là đồ thị có hướng, không chu trình. Một trình. Một sắp xếp topologysắp xếp topology của G của G là một là một cách xếp tuyến tính các đỉnh của G sao cho cách xếp tuyến tính các đỉnh của G sao cho i trước j nếu (i,j) là cạnh.i trước j nếu (i,j) là cạnh.
Ứng dụngỨng dụng::- Sắp xếp các công việc thỏa mãn một số thứ Sắp xếp các công việc thỏa mãn một số thứ
tự.tự.- Biểu diễn tập có thứ tự bộ phậnBiểu diễn tập có thứ tự bộ phận
150150
Thuật toán sắp xếp Thuật toán sắp xếp topologytopology
Topological-Sort(G){Topological-Sort(G){DFS(G);DFS(G);
Xếp vào theo thứ tự f[u] giảmXếp vào theo thứ tự f[u] giảm
}}
Vấn đềVấn đề: chứng minh tính đúng đắn : chứng minh tính đúng đắn của t.t. và tính độ phức tạp.của t.t. và tính độ phức tạp.
151151
Ví dụVí dụ
152152
Thành phần liên thông Thành phần liên thông mạnhmạnh
Định nghĩaĐịnh nghĩa: Đồ thị có hướng là : Đồ thị có hướng là liên liên thông mạnhthông mạnh nếu giữa hai đỉnh luôn có nếu giữa hai đỉnh luôn có đường đi.đường đi.
Một đồ thị có hướng bất kỳ được phân Một đồ thị có hướng bất kỳ được phân thành cácthành các t.p.l.t.m.t.p.l.t.m., mỗi t.p. là một đồ , mỗi t.p. là một đồ thị con lớn nhất liên thông mạnh.thị con lớn nhất liên thông mạnh.
Bài toánBài toán: phân tích G thành các t.p.l.t.m.: phân tích G thành các t.p.l.t.m.
153153
Thuật toán tính các t.p.l.t.mThuật toán tính các t.p.l.t.m
Tpltm (G){Tpltm (G){1.1. DFS(G) để tính f[u];DFS(G) để tính f[u];2.2. Tính G’Tính G’3.3. DFG(G’), các đỉnh của G’ được xếp theo f giảmDFG(G’), các đỉnh của G’ được xếp theo f giảm4.4. Mỗi cây trong rừng từ bước 3 là một t.p.l.t.mMỗi cây trong rừng từ bước 3 là một t.p.l.t.m}}
G’=(V,E’); E’={(u,v): (v,u) G’=(V,E’); E’={(u,v): (v,u) ЄЄ E} E}
Vấn đềVấn đề: chứng minh tính đúng đắn của t.t. và tính : chứng minh tính đúng đắn của t.t. và tính độ phức tạp của nó.độ phức tạp của nó.
154154
Ví dụVí dụ
155155
Branch and boundBranch and bound
So sánh các cách tìm kiếm trong đồ thị:So sánh các cách tìm kiếm trong đồ thị:1.1. Theo chiều rộng: thăm hết các lân cận + Theo chiều rộng: thăm hết các lân cận +
một FIFO chứa các đỉnh đang thăm một FIFO chứa các đỉnh đang thăm 2.2. Theo chiều sâu: thăm hết các con đường Theo chiều sâu: thăm hết các con đường
+ một FILO chứa các đỉnh đang thăm + một FILO chứa các đỉnh đang thăm 3.3. B.A.B.: thăm các đỉnh hứa hẹn nhất + B.A.B.: thăm các đỉnh hứa hẹn nhất +
một dãy chứa các đỉnh đang thăm một dãy chứa các đỉnh đang thăm
156156
B.A.B: người đưa hàngB.A.B: người đưa hàng
Bài toánBài toán: Cho một đồ thị có hướng, : Cho một đồ thị có hướng, các cạnh có độ dài. Tìm một chu các cạnh có độ dài. Tìm một chu trình ngắn nhất bắt đầu và kết thúc trình ngắn nhất bắt đầu và kết thúc tại một đỉnh, và đi qua mỗi đỉnh còn tại một đỉnh, và đi qua mỗi đỉnh còn lại đúng một lần.lại đúng một lần.
G=(V,E), V={1,2,..,n}, L[i,j]: độ dài G=(V,E), V={1,2,..,n}, L[i,j]: độ dài cạnh.cạnh.
157157
Ví dụ: ý tưởngVí dụ: ý tưởng
0 14 4 10 200 14 4 10 2014 0 7 8 714 0 7 8 7
L= L= 4 5 0 7 164 5 0 7 1611 7 9 0 211 7 9 0 2
18 7 17 4 0 18 7 17 4 0
1.1. Tìm chu trình đơn ngắn nhất từ đỉnh 1 đến đỉnh 1Tìm chu trình đơn ngắn nhất từ đỉnh 1 đến đỉnh 12.2. Xây dựng cây gốc (1). Xây dựng cây gốc (1). 3.3. Mỗi nốt là một đường từ 1: (1,3), (1,3,4),…Mỗi nốt là một đường từ 1: (1,3), (1,3,4),…4.4. Các con của mỗi nốt là các đường thêm vào một đỉnhCác con của mỗi nốt là các đường thêm vào một đỉnh5.5. Với mỗi nốt, tính cận dưới của chu trình đi qua đường Với mỗi nốt, tính cận dưới của chu trình đi qua đường
tương ứngtương ứng
158158
Ví dụ (tiếp): cách tính cận Ví dụ (tiếp): cách tính cận dướidưới
Tính cận dưới (inf):Tính cận dưới (inf):
1.1. Khoảng cách L[i,j] chia 2: một nửa Khoảng cách L[i,j] chia 2: một nửa đường từ i, một nửa đường đến jđường từ i, một nửa đường đến j
2.2. inf từ i = min của các đường từ iinf từ i = min của các đường từ i
3.3. inf qua i = min (từ i) + min (đến i)inf qua i = min (từ i) + min (đến i)
4.4. inf của nốt = tổng các inf để tạo ra inf của nốt = tổng các inf để tạo ra chu trình qua nốt chu trình qua nốt
159159
Ví dụ (tiếp): tính cụ thểVí dụ (tiếp): tính cụ thể
1.1. inf(1)=inf(từ 1) + inf(đến 1) + inf(1)=inf(từ 1) + inf(đến 1) +
inf(qua 2)+inf(qua 3)+inf(qua inf(qua 2)+inf(qua 3)+inf(qua 4)+inf(qua 5) = 2+2+6+4+3+3=204)+inf(qua 5) = 2+2+6+4+3+3=20
160160
Ví dụ (tiếp): xây dựng câyVí dụ (tiếp): xây dựng cây1
inf 20
1,2inf 31
1,3inf 24
1,4inf 29
1,5inf 41
1,3,2inf 24
1,3,4inf 30,5
1,3,5inf 40,5
1,3,2,4=1,3,2,4,5,1
value=37
1,4,2inf 40
1,4,3inf 41,5
1,4,5inf 29
1,3,2,5=1,3,2,5,4,1
value=31
1,4,5,2=1,4,5,2,3,1
value=30
1,4,5,3=1,4,5,3,2,1
value=48
161161
Chương 7: Giới thiệu về Chương 7: Giới thiệu về phương pháp xác suấtphương pháp xác suất
I.I. Giới thiệu chungGiới thiệu chung
II.II. Phân loại các thuật toán xác suấtPhân loại các thuật toán xác suất
III.III. Thuật toán xác suất sốThuật toán xác suất số
IV.IV. Thuật toán SherwoodThuật toán Sherwood
V.V. Thuật toán Las VegasThuật toán Las Vegas
VI.VI. Thuật toán Monte CarloThuật toán Monte Carlo
162162
Giới thiệu chungGiới thiệu chung
Khái niệmKhái niệm: Thuật toán xác xuất là : Thuật toán xác xuất là thuật toán sử dụng đầu vào là các số thuật toán sử dụng đầu vào là các số ngẫu nhiên.ngẫu nhiên.
Nhận xétNhận xét: :
- Đầu vào này phải hữu ích- Đầu vào này phải hữu ích
- Các số này là “giả ngẫu nhiên”- Các số này là “giả ngẫu nhiên”
163163
Ví dụVí dụ
Thuật toán sắp xếp Quicksort:Thuật toán sắp xếp Quicksort:- Phần tử so sánh được chọn ở đầu bảng:- Phần tử so sánh được chọn ở đầu bảng:- Độ phức tạp xấu nhất là 0(n^2)- Độ phức tạp xấu nhất là 0(n^2)- Độ phức tạp trung bình là 0(n lg n)- Độ phức tạp trung bình là 0(n lg n)
Vấn đềVấn đề: nếu bảng đã gần xếp đúng, không : nếu bảng đã gần xếp đúng, không hiệu quả.hiệu quả.
Giải quyếtGiải quyết: Chọn phần tử so sánh một cách : Chọn phần tử so sánh một cách ngẫu nhiên trong bảng.ngẫu nhiên trong bảng.
164164
Phân loại các thuật toán xác Phân loại các thuật toán xác suấtsuất
Thuật toán xác suất số:Thuật toán xác suất số:- Dùng trong việc tính toán xấp xỉ các bài Dùng trong việc tính toán xấp xỉ các bài
toán số.toán số.- Độ chính xác trung bình tỷ lệ với thời Độ chính xác trung bình tỷ lệ với thời
gian chạygian chạy
-- Dùng trong các ví dụ: tính toán thời gian Dùng trong các ví dụ: tính toán thời gian chay TB của một hệ phức tạp, cách tính chay TB của một hệ phức tạp, cách tính chính xác là rất phức tạp (hoặc không chính xác là rất phức tạp (hoặc không thể)thể)
165165
Phân loại các thuật toán xác Phân loại các thuật toán xác suất (tiếp)suất (tiếp)
Thuật toán Monte Carlo:Thuật toán Monte Carlo:
-- Có thể dùng trong các bài toán quyết Có thể dùng trong các bài toán quyết định: đúng/sai, phân tích thừa số ng. định: đúng/sai, phân tích thừa số ng. tố,…tố,…
- Luôn cho câu trả lời rõ ràng nhưng Luôn cho câu trả lời rõ ràng nhưng - Kết quả có thể không đúngKết quả có thể không đúng- Xác xuất thành công tỷ lệ với thời gian Xác xuất thành công tỷ lệ với thời gian
chạychạy
166166
Phân loại các thuật toán xác suất Phân loại các thuật toán xác suất (tiếp)(tiếp)
Thuật toán Las Vegas:Thuật toán Las Vegas:- Không bao giờ cho câu trả lời saiKhông bao giờ cho câu trả lời sai- Có thể không cho câu trả lờiCó thể không cho câu trả lời- Xác xuất thành công tỷ lệ với thời gian chạy Xác xuất thành công tỷ lệ với thời gian chạy - Dù vấn đề nào, xác xuất hỏng cũng có thể Dù vấn đề nào, xác xuất hỏng cũng có thể
nhỏ tùy ýnhỏ tùy ý
* Cho trả lời chính xác với độ phức tạp trung * Cho trả lời chính xác với độ phức tạp trung bình có giới hạnbình có giới hạn
167167
Phân loại các thuật toán xác suất Phân loại các thuật toán xác suất (tiếp)(tiếp)
Thuật toán Sherwood:Thuật toán Sherwood:
- Luôn cho câu trả lời, trả lời luôn đúng- Luôn cho câu trả lời, trả lời luôn đúng
- Dùng trong các bài toán đã có thuật - Dùng trong các bài toán đã có thuật toán, với ĐPTTB nhỏ và ĐPT xấu toán, với ĐPTTB nhỏ và ĐPT xấu nhất lớnnhất lớn
- Biễn ngẫu nhiên là để giảm sự khác - Biễn ngẫu nhiên là để giảm sự khác nhau giữa hai trường hợp nàynhau giữa hai trường hợp này
168168
Thuật toán Monte CarloThuật toán Monte Carlo
Bài toán ví dụ: Thử xem một số có Bài toán ví dụ: Thử xem một số có nguyên tố hay không.nguyên tố hay không.
Ý nghĩa: trong mật mã cần tìm các số Ý nghĩa: trong mật mã cần tìm các số nguyên tố lớn.nguyên tố lớn.
169169
Thuật toán đơn giảnThuật toán đơn giản
Tính nguyên tố (n) {Tính nguyên tố (n) {while (i< n) do {while (i< n) do {
if (n chia hết cho i) return sai;if (n chia hết cho i) return sai;i = i+1;i = i+1;
}}return đúng;return đúng;
}}
Nhận xét: cho I chạy đến sqrt(n)Nhận xét: cho I chạy đến sqrt(n)- Để thử tính chia hết: thời gian nhiều.- Để thử tính chia hết: thời gian nhiều.
170170
Phép thử Miller RabinPhép thử Miller Rabin
Nguyên tắc:Nguyên tắc:
a)a) n nguyên tố, a < n n nguyên tố, a < n
=> a^{n-1} = 1 (mod n)=> a^{n-1} = 1 (mod n)
b)b) n nguyên tố, a <n : n nguyên tố, a <n :
a^2 = 1 (mod n) =>a = 1, -1 (mod n)a^2 = 1 (mod n) =>a = 1, -1 (mod n)
Câu hỏi:Câu hỏi: viết thuật toán viết thuật toán test (n,a)test (n,a) thử hai thử hai điều kiên trên. Độ p.t.t.t = ?điều kiên trên. Độ p.t.t.t = ?
171171
Thuật toán Miller-Rabin Thuật toán Miller-Rabin
M-R(n) {M-R(n) {i=1; chọn a ngẫu nhiên < n;i=1; chọn a ngẫu nhiên < n;while (i<k and test (n,a)=false) do {while (i<k and test (n,a)=false) do {
chọn a ngẫu nhiên < n;chọn a ngẫu nhiên < n;i = i+1;}i = i+1;}
return test(n,a);return test(n,a);}}- Số lần chọn các số ngẫu nhiên a là k lần.Số lần chọn các số ngẫu nhiên a là k lần.- Tính độ p.t.t.tTính độ p.t.t.t
172172
Xác xuất của thuật toánXác xuất của thuật toán
Tính chất: Nếu n lẻ, thì có ít nhất ¾ số Tính chất: Nếu n lẻ, thì có ít nhất ¾ số a < n sẽ cho kết quả test(n,a)= true a < n sẽ cho kết quả test(n,a)= true nếu n không nguyên tố.nếu n không nguyên tố.
Như vậy sau k lần thì xác xuất không Như vậy sau k lần thì xác xuất không tìm thấy a cho test(n,a)=true là tìm thấy a cho test(n,a)=true là (1/4)^k. Và ta có thể cho xac suất (1/4)^k. Và ta có thể cho xac suất này nhỏ tùy ý.này nhỏ tùy ý.
173173
Thuật toán Las-VegasThuật toán Las-Vegas
Bài toán: Bầu một người chủ.Bài toán: Bầu một người chủ.
Có n người, cần chọn ra một người. Có n người, cần chọn ra một người.
Đòi hỏi: các lần chạy t.t. khác nhau, chọn ra Đòi hỏi: các lần chạy t.t. khác nhau, chọn ra những người khác nhau.những người khác nhau.
Ý nghĩa: Trong bài toán mạng, tránh tình Ý nghĩa: Trong bài toán mạng, tránh tình trạng tắc nghẽn khi các máy cùng đến một trạng tắc nghẽn khi các máy cùng đến một lúc.lúc.
174174
Thuật toánThuật toán
1.1. Mỗi người chọn một số ngẫu nhiên từ 1 Mỗi người chọn một số ngẫu nhiên từ 1 đến m (số người chọn)đến m (số người chọn)
2.2. Nếu không có ai chọn số 1, quay về bước Nếu không có ai chọn số 1, quay về bước 2.2.
3.3. Nếu có ít nhất 2 người chọn số 1, thì Nếu có ít nhất 2 người chọn số 1, thì những người này tiếp tục, quay về bước những người này tiếp tục, quay về bước 1.1.
4.4. Nếu chỉ có 1 người chọn số 1 thì người Nếu chỉ có 1 người chọn số 1 thì người này là chủ.này là chủ.
175175
Tính chất của thuật toánTính chất của thuật toán
- Thuật toán không chắc chắn là sẽ Thuật toán không chắc chắn là sẽ dừngdừng
- Nhưng nếu dừng nó luôn cho kết quả Nhưng nếu dừng nó luôn cho kết quả đúng.đúng.
176176
Phân tích thuật toánPhân tích thuật toán
Xác xuất để có k người vào vòng 2 là:Xác xuất để có k người vào vòng 2 là:
p(n,k) = C^k_n (1/n)^k (1-1/n)^(n-k)p(n,k) = C^k_n (1/n)^k (1-1/n)^(n-k)
P(n,0) = (1-1/n)^n.P(n,0) = (1-1/n)^n.
Xác xuất để vòng 1 lặp l lần là Xác xuất để vòng 1 lặp l lần là (1-1/n)^{nl}(1-1/n)^{nl}
Xác xuất để t.t. không dừng là = 0Xác xuất để t.t. không dừng là = 0
177177
Chương 8: Về độ phức tạp tính Chương 8: Về độ phức tạp tính toántoán
I.I. Cây quyết địnhCây quyết định
II.II. Qui dẫnQui dẫn
III.III. Giới thiệu về NP- đầy đủGiới thiệu về NP- đầy đủ1)1) Lớp P và NPLớp P và NP
2)2) Một số bài toán NP- đầy đủMột số bài toán NP- đầy đủ
3)3) Định lý CookĐịnh lý Cook
4)4) Một số qui dẫnMột số qui dẫn
178178
Cây quyết địnhCây quyết định
Vấn đềVấn đề: Có một bảng n phần tử cần : Có một bảng n phần tử cần được sắp xếp tăng dần. Cần tối thiểu được sắp xếp tăng dần. Cần tối thiểu bao nhiêu phép so sánhbao nhiêu phép so sánh để thực hiện để thực hiện thuật toán ?thuật toán ?
Chú ýChú ý: chỉ tính so sánh các phần tử, : chỉ tính so sánh các phần tử, không tính so sánh các chỉ số.không tính so sánh các chỉ số.
179179
Định nghĩa cây quyết địnhĐịnh nghĩa cây quyết định
Định nghĩaĐịnh nghĩa: : một cây quyết địnhmột cây quyết định là một cây nhị phân là một cây nhị phân có hướng và được dán nhãn,có hướng và được dán nhãn,
- mỗi đỉnh trong chứa một phép so sánh 2 phần tử mỗi đỉnh trong chứa một phép so sánh 2 phần tử cần được xếpcần được xếp
- Mỗi lá chứa một hoán vị các phần tửMỗi lá chứa một hoán vị các phần tử
Cho một thứ tự, một Cho một thứ tự, một đường đi trong câyđường đi trong cây bắt đầu từ bắt đầu từ gốc, và đặt các câu hỏi mà nó gặp: nếu trả lới gốc, và đặt các câu hỏi mà nó gặp: nếu trả lới “đúng” thì rẽ trái, nếu “không” thì rẽ phải. Đường “đúng” thì rẽ trái, nếu “không” thì rẽ phải. Đường kết thúc ở một lá. Lá này chứa kết quả ứng với kết thúc ở một lá. Lá này chứa kết quả ứng với thứ tự vào.thứ tự vào.
180180
Tính chấtTính chất
- Một cây quyết định là đúngMột cây quyết định là đúng để sắp để sắp xếp n phần tử nếu với mọi thứ tự vào xếp n phần tử nếu với mọi thứ tự vào đều cho ra kết quả đúng cới thứ tự đều cho ra kết quả đúng cới thứ tự đó.đó.
- Một cây quyết định là gọnMột cây quyết định là gọn nếu không nếu không có đường nào mâu thuẫn, tức là mọi có đường nào mâu thuẫn, tức là mọi lá đều nhận được từ gốc qua một dãy lá đều nhận được từ gốc qua một dãy các quyết định đúng.các quyết định đúng.
181181
Ví dụ cây quyết định sắp 3 Ví dụ cây quyết định sắp 3 sốsố
A<B
A<CA<C
B<CB<C
A < B < C
A < C ≤ B C ≤ A< B B ≤ A <C B < C < A
C ≤ B ≤ A
182182
Thuật toánThuật toán
Mọi cây quyết định đúng để sắp xếp n số sẽ Mọi cây quyết định đúng để sắp xếp n số sẽ cho một thuật toán tương ứng để sắp xếp cho một thuật toán tương ứng để sắp xếp n số đó.n số đó.
Bài tập: 1. Viết thuật toán tương ứng với cây Bài tập: 1. Viết thuật toán tương ứng với cây quyết định đã cho.quyết định đã cho.
2. Vẽ cây quyết định gọn tương ứng cho các 2. Vẽ cây quyết định gọn tương ứng cho các t.t. sắp xếp chèn vào, lựa chọn, xen kẽ với t.t. sắp xếp chèn vào, lựa chọn, xen kẽ với 3 số. 3 số.
183183
Nhận xétNhận xét
- Vẽ cây quyết định cho thuật toán sắp Vẽ cây quyết định cho thuật toán sắp xếp vun đống cho 3 số.xếp vun đống cho 3 số.
- Nhận xét gì về cây này: có bao nhiêu Nhận xét gì về cây này: có bao nhiêu lá ? Có các phép so sánh thừa hay lá ? Có các phép so sánh thừa hay không ? Cây có gọn không ?không ? Cây có gọn không ?
184184
- Nhận xét gì về độ cao của các cây Nhận xét gì về độ cao của các cây quyết định ?quyết định ?
- Độ dài lớn nhất từ đỉnh tới một lá nói Độ dài lớn nhất từ đỉnh tới một lá nói lên điều gì ?lên điều gì ?
185185
Thời gian tối đaThời gian tối đa
Bổ đề 1Bổ đề 1: Mọi cây nhị phân k lá có độ cao ít : Mọi cây nhị phân k lá có độ cao ít nhất là bằng [lg k]nhất là bằng [lg k]
Bổ đề 2Bổ đề 2: Mọi cây quyết định đúng để xếp n : Mọi cây quyết định đúng để xếp n số có ít nhất k! lásố có ít nhất k! lá
Định lýĐịnh lý: Mọi thuật toán để xếp n số bằng các : Mọi thuật toán để xếp n số bằng các phép so sánh sẽ mất thời gian là phép so sánh sẽ mất thời gian là ΩΩ(n lg n) (n lg n) trong trường hợp xấu nhấttrong trường hợp xấu nhất
186186
Thời gian trung bìnhThời gian trung bình
Định nghĩaĐịnh nghĩa: độ cao trung bình của cây nhị phân : độ cao trung bình của cây nhị phân A là tổng độ sâu của các lá chia cho số lá A là tổng độ sâu của các lá chia cho số lá
Bổ đề 3Bổ đề 3: Mọi cây nhị phân k lá có độ cao trung : Mọi cây nhị phân k lá có độ cao trung bình ít nhất là bằng [lg k]bình ít nhất là bằng [lg k]
Định lýĐịnh lý: Mọi thuật toán để xếp n số bằng các : Mọi thuật toán để xếp n số bằng các phép so sánh sẽ mất thời gian trung bình là phép so sánh sẽ mất thời gian trung bình là ΩΩ(n lg n).(n lg n).
187187
Bài tậpBài tập
1.1. Tìm công thức chính xác cho số các Tìm công thức chính xác cho số các phép so sánh trong trường hợp xấu phép so sánh trong trường hợp xấu nhất của t.t. xếp chèn vào và lựa nhất của t.t. xếp chèn vào và lựa chọn.chọn.
2.2. Tìm công thức chính xác cho số các Tìm công thức chính xác cho số các phép so sánh tính trung bình của phép so sánh tính trung bình của t.t. xếp chèn vào và lựa chọn.t.t. xếp chèn vào và lựa chọn.
3.3. So sánh hai kết quả này.So sánh hai kết quả này.
188188
Một ví dụ nhỏMột ví dụ nhỏ
function sort(T[1..n]){function sort(T[1..n]){i = min (T); j = max(T);i = min (T); j = max(T);table C[i..j]=0;table C[i..j]=0;for (k=1 to n) do C[T[k]]=C[T[k]]+1;for (k=1 to n) do C[T[k]]=C[T[k]]+1;k=1;k=1;for (p=i to j) do for (p=i to j) do
for (q=1 to C[p]) do {T[k]=p; for (q=1 to C[p]) do {T[k]=p; k=k+1;}k=k+1;}
}}
189189
Câu hỏiCâu hỏi
1.1. Chạy t.t. trên cho bảng T[1..10] = Chạy t.t. trên cho bảng T[1..10] = {3,1,4,1,5,9,2,6,5,3}{3,1,4,1,5,9,2,6,5,3}
2.2. Tính xem để xếp n số, t.t. này thực Tính xem để xếp n số, t.t. này thực hiện bao nhiêu phép so sánh giữa hiện bao nhiêu phép so sánh giữa các sốcác số
190190
Thời gian đa thức: Vấn đề trừu Thời gian đa thức: Vấn đề trừu tượngtượng
Vấn đề trừu tượng Q: là một quan hệ hai ngôi Vấn đề trừu tượng Q: là một quan hệ hai ngôi trên tập các trạng thái I và tập các lời giải S.trên tập các trạng thái I và tập các lời giải S.
Bài toán quyết định: là có một lời giải Co’/KhôngBài toán quyết định: là có một lời giải Co’/Không
Bài toán tối ưu: có một đại lượng cần cực tiểu Bài toán tối ưu: có một đại lượng cần cực tiểu (đại) hóa(đại) hóacó thể đưa về bài toán quyết định: đặt một giá có thể đưa về bài toán quyết định: đặt một giá trị biên.trị biên.
191191
Mã hóaMã hóa
- Một mã hóa của một tập S các đối Một mã hóa của một tập S các đối tượng trừu tượng là một ánh xạ e từ tượng trừu tượng là một ánh xạ e từ S vào các dãy nhị phân.S vào các dãy nhị phân.
- Một t.t. máy tính giải một vấn đề trừu Một t.t. máy tính giải một vấn đề trừu tượng sẽ nhận một mã hóa của một tượng sẽ nhận một mã hóa của một trạng thái như là đầu vào.trạng thái như là đầu vào.
- Vấn đề cụ thể: là vấn đề mà các Vấn đề cụ thể: là vấn đề mà các trạng thái là các dãy nhị phân. trạng thái là các dãy nhị phân.
192192
Thuật toán thời gian đa thứcThuật toán thời gian đa thức
Thuật toán giải một vấn đề cụ thể trong thời Thuật toán giải một vấn đề cụ thể trong thời gian O(T(n)) nếu: mỗi đầu vào i có độ dài n, gian O(T(n)) nếu: mỗi đầu vào i có độ dài n, t.t. cho kết quả trong thời gian = O(T(n)).t.t. cho kết quả trong thời gian = O(T(n)).
Một vấn đề cụ thể giải được trong thời gian đa Một vấn đề cụ thể giải được trong thời gian đa thức nếu tồn tại t.t. giải nó trong t.g. O(n^k), thức nếu tồn tại t.t. giải nó trong t.g. O(n^k), k hằng số.k hằng số.
Lớp P = {vấn đề cụ thể giải được trong t.g.đ.t.}Lớp P = {vấn đề cụ thể giải được trong t.g.đ.t.}
193193
Mã hóa chuẩnMã hóa chuẩn
- Một vấn đề trừu tượng có thể có nhiều Một vấn đề trừu tượng có thể có nhiều cách mã hóa thành vấn đề cụ thể.cách mã hóa thành vấn đề cụ thể.
- Mã hóa chuẩn: các số tự nhiên theo biểu Mã hóa chuẩn: các số tự nhiên theo biểu diễn (tương đương đa thức với) nhị phân.diễn (tương đương đa thức với) nhị phân.
- Một tập phần tử được mã theo dãy các mã Một tập phần tử được mã theo dãy các mã của các phần tử.của các phần tử.
- Đồ thị, công thức, … được mã tương tựĐồ thị, công thức, … được mã tương tự
* Ta có thể xét vấn đề trừu tượng như vấn * Ta có thể xét vấn đề trừu tượng như vấn đề cụ thểđề cụ thể
194194
Ngôn ngữNgôn ngữ
Bảng chữ cáiBảng chữ cái A: tập A: tập hữu hạn hữu hạn các ký tự.các ký tự.
TừTừ: 1 dãy các chữ cái của A.: 1 dãy các chữ cái của A.
Một Một ngôn ngữngôn ngữ L trên A: 1 tập các từ L trên A: 1 tập các từ trên A.trên A.
Từ rỗng: Từ rỗng: εε
Ngôn ngữ rỗng: Ngôn ngữ rỗng: ØØ
Ngôn ngữ gồm tất cả các từ trên A: Ngôn ngữ gồm tất cả các từ trên A: A*A*
195195
Các phép toán trên các ngôn Các phép toán trên các ngôn ngữngữ
- Hợp, giao, Hợp, giao, - phần bù phần bù Ḹ = A* \ LḸ = A* \ L- dán (concatenation): dán (concatenation):
L=L1.L2 = {xy: x L=L1.L2 = {xy: x ЄЄ L1, y L1, y ЄЄ L2} L2}- Bao đóng Kleene: Bao đóng Kleene:
L*={L*={εε} U L U L^2 U L^3 U …} U L U L^2 U L^3 U …
196196
Bài toán - ngôn ngữBài toán - ngôn ngữ
ΣΣ = {0,1}. = {0,1}.Bài toán quyết đinh Q Bài toán quyết đinh Q Ngôn ngữ L = {x Ngôn ngữ L = {x ЄЄ ΣΣ*: Q(x) = 1}*: Q(x) = 1}
Thuật toán A Thuật toán A chấp nhậnchấp nhận một từmột từ x x ЄЄ ΣΣ*: nếu với đầu vào x, *: nếu với đầu vào x, A cho kết quả A(x) = 1.A cho kết quả A(x) = 1.
A A loại bỏloại bỏ x nếu A(x) = 0 x nếu A(x) = 0Ngôn ngữ L được chấp nhận bởi A:L={x Ngôn ngữ L được chấp nhận bởi A:L={x ЄЄ ΣΣ*:A(x)=1}*:A(x)=1}L được chấp nhận bởi A L được chấp nhận bởi A trong t.g.đ.t.trong t.g.đ.t. nếu có hằng k: mọi nếu có hằng k: mọi
từ x độ dài n được A chấp nhận trong t.g O(n^k)từ x độ dài n được A chấp nhận trong t.g O(n^k)
- Chú ý:- Chú ý: nếu x |nếu x |ЄЄ L, A có thể không loai bỏ x, mà chạy L, A có thể không loai bỏ x, mà chạy không dừng.không dừng.
197197
Ngôn ngữ được quyết địnhNgôn ngữ được quyết định
Một ngôn ngữ L được quyết định bởi t.t. Một ngôn ngữ L được quyết định bởi t.t. A:A: nếu x thuộc L nếu x thuộc L A chấp nhận x A chấp nhận x
và x không thuộc L và x không thuộc L A loại bỏ x. A loại bỏ x.
L được quyết định bởi A L được quyết định bởi A trong t.g.đ.t.trong t.g.đ.t. nếu có hằng k: mọi từ x độ dài n nếu có hằng k: mọi từ x độ dài n được A quyết định trong t.g O(n^k)được A quyết định trong t.g O(n^k)
198198
Lớp PLớp P
P = {L ngôn ngữ trên P = {L ngôn ngữ trên ΣΣ: có t.t. A : có t.t. A quyết quyết đinhđinh L trong t.g.đ.t.} L trong t.g.đ.t.}
Định lý:Định lý:
P = {L ngôn ngữ trên P = {L ngôn ngữ trên ΣΣ: có t.t. A ch L : có t.t. A ch L chấp nhậnchấp nhận L trong t.g.đ.t.} L trong t.g.đ.t.}
199199
Thuật toán kiểm chứngThuật toán kiểm chứng
Thuật toán kiểm chứng: là một t.t. A hai Thuật toán kiểm chứng: là một t.t. A hai biến, một biến bình thướng là một xâu nhị biến, một biến bình thướng là một xâu nhị phân đàu vào x, và một biến là xâu nhị phân đàu vào x, và một biến là xâu nhị phân y (được gọi là xâu kiểm chứng).phân y (được gọi là xâu kiểm chứng).
T.t A kiểm chứng x nếu tồn tại xâu kiểm T.t A kiểm chứng x nếu tồn tại xâu kiểm chứng y để A(x,y) =1.chứng y để A(x,y) =1.
Ngôn ngữ L được kiểm chứng bởi A là:Ngôn ngữ L được kiểm chứng bởi A là:L = {x L = {x ЄЄ ΣΣ*: tồn tại y *: tồn tại y ЄЄ ΣΣ*: A(x,y)=1 }*: A(x,y)=1 }
200200
Lớp NPLớp NP
Lớp độ phức tạp tính toán NP là lớp các Lớp độ phức tạp tính toán NP là lớp các ngôn ngữ được kiểm chứng trong thời gian ngôn ngữ được kiểm chứng trong thời gian đa thức.đa thức.
L L ЄЄ NP NP tồn tại t.t. 2 biến t.g.đ.t. A và tồn tại t.t. 2 biến t.g.đ.t. A và hằng số c sao cho:hằng số c sao cho:
L= L= {x {x ЄЄ ΣΣ*: tồn tại y *: tồn tại y ЄЄ ΣΣ*, |y|=O(|x|^c): *, |y|=O(|x|^c): A(x,y)=1 }A(x,y)=1 }
Ta nói: A kiểm chứng L trong t.g.đ.t.Ta nói: A kiểm chứng L trong t.g.đ.t.
201201
Ví dụVí dụ
Bài toán: chu trình Hamilton: Bài toán: chu trình Hamilton:
HAM-CYCLE HAM-CYCLE ЄЄ NP NP
202202
Lớp co-NPLớp co-NP
- L L ЄЄ co-NP co-NP ΣΣ*\L *\L ЄЄ NP NP- 4 trường hợp có thể xảy ra:4 trường hợp có thể xảy ra:
203203
Phép qui dẫnPhép qui dẫn
Ngôn ngữ L1 qui dẫn được về ngôn Ngôn ngữ L1 qui dẫn được về ngôn ngữ L2 trong t.g.đ.t. (L1 ≤_P L2) nếu ngữ L2 trong t.g.đ.t. (L1 ≤_P L2) nếu tồn tại một hàm tính được trong tồn tại một hàm tính được trong t.g.đ.t.t.g.đ.t.
f: f: ΣΣ* -> * -> ΣΣ* sao cho x * sao cho x ЄЄ L1 L1 f(x) f(x) ЄЄ L2 L2
f: hàm qui dẫnf: hàm qui dẫn
T.t. F t.g.đ.t. tính f: t.t. qui dẫnT.t. F t.g.đ.t. tính f: t.t. qui dẫn
204204
Bài tậpBài tập
1.1. Chứng minh rằng quan hệ qui dẫn Chứng minh rằng quan hệ qui dẫn là một quan hệ thứ tự.là một quan hệ thứ tự.
2.2. Chứng minh bổ đề:Chứng minh bổ đề:
Bổ đề: Cho 2 ngôn ngữ L1, L2Bổ đề: Cho 2 ngôn ngữ L1, L2, nếu L1 , nếu L1 ≤ L2 thì ≤ L2 thì
L2 L2 ЄЄ P kéo theo L1 P kéo theo L1 ЄЄ P. P.
205205
Lớp NP- đầy đủLớp NP- đầy đủ
Ngôn ngữ L là NP-đầy đủ (NPC) nếu:Ngôn ngữ L là NP-đầy đủ (NPC) nếu:
1.1. L L ЄЄ NP, và NP, và
2.2. Với mọi L’ Với mọi L’ ЄЄ NP thì L’ NP thì L’ ≤≤_P L._P L.
Ngôn ngữ L là NP-khó nếu L thỏa mãn Ngôn ngữ L là NP-khó nếu L thỏa mãn đk 2 (nhưng không nhất thiết đk 1).đk 2 (nhưng không nhất thiết đk 1).
206206
P versus NPP versus NP
Định lý: Nếu có một bài toán NP-đầy Định lý: Nếu có một bài toán NP-đầy đủ nào giải được trong t.g.đ.t. thì P = đủ nào giải được trong t.g.đ.t. thì P = NP.NP.
Nếu có một bài toán trong NP nào mà Nếu có một bài toán trong NP nào mà không giải được trong t.g.đ.t. thì tất không giải được trong t.g.đ.t. thì tất cả các bài toán NP-đầy đủ đều không cả các bài toán NP-đầy đủ đều không giải được trong t.g.đ.t. giải được trong t.g.đ.t.
207207
Chứng minh tính NP-đầy đủChứng minh tính NP-đầy đủ
1. Bổ đề: Nếu L là một ngôn ngữ sao cho 1. Bổ đề: Nếu L là một ngôn ngữ sao cho L’ ≤_P L với L’ L’ ≤_P L với L’ ЄЄ NPC, thì L là NP-khó. Hơn NPC, thì L là NP-khó. Hơn nữa, nếu L nữa, nếu L ЄЄ NP thì L NP thì L ЄЄ NPC. NPC.
2. Để chứng minh L 2. Để chứng minh L ЄЄ NPC: NPC:- chứng minh L - chứng minh L ЄЄ NP NP- chọn một ngôn ngữ L’ - chọn một ngôn ngữ L’ ЄЄ NPC NPC- tìm một t.t. F tính hàm f chuyển mối trạng thái - tìm một t.t. F tính hàm f chuyển mối trạng thái của L’ về một trạng thái của Lcủa L’ về một trạng thái của L- chứng minh f thỏa mãn: x - chứng minh f thỏa mãn: x ЄЄ L’ L’ f(x) f(x) ЄЄ L với mọi L với mọi x x ЄЄ ΣΣ**- chứng minh t.t. F chạy trong t.g.đ.t.- chứng minh t.t. F chạy trong t.g.đ.t.
208208
Circuit satisfiabilityCircuit satisfiability
Combinational element: một dãy các phần Combinational element: một dãy các phần tử có môt số cố định các phần tử vào và ra tử có môt số cố định các phần tử vào và ra và hoàn thành tính toán một hàm.và hoàn thành tính toán một hàm.
Boolean combinational element: đầu vào và Boolean combinational element: đầu vào và ra là thuộc {0,1} (0: sai, 1: đúng)ra là thuộc {0,1} (0: sai, 1: đúng)
Một boolean combinational element dùng để Một boolean combinational element dùng để tính 1 hàm boolean đơn được gọi là một tính 1 hàm boolean đơn được gọi là một logic gate.logic gate.
209209
Boolean combinational circuit xây Boolean combinational circuit xây dựng từ các boolean combinational dựng từ các boolean combinational elements (được nối với nhau bằng elements (được nối với nhau bằng các dây(wire))các dây(wire))
210210
1. Circuit input (đầu vào): các dây không nối với 1. Circuit input (đầu vào): các dây không nối với một phần tử vào nàomột phần tử vào nào
Circuit output (đàu ra): các dây không nối với một Circuit output (đàu ra): các dây không nối với một phần tử ra nàophần tử ra nào
Ta xét các circuit chỉ có một đầu ra.Ta xét các circuit chỉ có một đầu ra.
2. Một phép gán giá trị của một circuit là một tập 2. Một phép gán giá trị của một circuit là một tập các giá trị đầu vào.các giá trị đầu vào.
3. Môt circuit là satisfiable (thỏa mãn) nếu có một 3. Môt circuit là satisfiable (thỏa mãn) nếu có một phép gán giá trị đầu vào sao cho đàu ra của phép gán giá trị đầu vào sao cho đàu ra của circuit là 1.circuit là 1.
211211
Ví dụVí dụ
212212
Bài toán Circuit satisfiabilityBài toán Circuit satisfiability
““Cho một boolean combinational circuit gồm Cho một boolean combinational circuit gồm các cổng AND, OR, NOT; nó có thỏa mãn các cổng AND, OR, NOT; nó có thỏa mãn hay không ?”hay không ?”
Độ dài của circuit: số các boolean Độ dài của circuit: số các boolean combinational elements + số các wirescombinational elements + số các wires
Ngôn ngữ:Ngôn ngữ:CIRCUIT-SAT={<C>: C là một satisfiable CIRCUIT-SAT={<C>: C là một satisfiable
boolean combinational circuit}boolean combinational circuit}
213213
CIRCUIT-SAT CIRCUIT-SAT ЄЄ NP-đầy đủ NP-đầy đủ
Bổ đề: CIRCUIT-SAT Bổ đề: CIRCUIT-SAT ЄЄ NP NP
Bổ đề: Bổ đề: CIRCUIT-SAT CIRCUIT-SAT là NP-khólà NP-khó
Định lý: Định lý: CIRCUIT-SAT CIRCUIT-SAT ЄЄ NP-đầy đủ NP-đầy đủ
214214
SATSAT
Một trạng thái của bài toán SAT là một công thức Một trạng thái của bài toán SAT là một công thức boolean boolean ΦΦ gồm: gồm:
1.1. Các biến boolean: x1, x2, …Các biến boolean: x1, x2, …2.2. Các liên kết boolean: các hàm boolean một hoặc hai Các liên kết boolean: các hàm boolean một hoặc hai
biến: AND, OR, NOT, ->, biến: AND, OR, NOT, ->, 3.3. Các dấu ngoặcCác dấu ngoặc
Một công thức Một công thức ΦΦ là satisfiable (thỏa mãn được )nếu là satisfiable (thỏa mãn được )nếu có một phép gán giá trị để giá trị ra của có một phép gán giá trị để giá trị ra của ΦΦ là 1. là 1.
SAT = {<SAT = {<ΦΦ>: >: ΦΦ là một công thức thỏa mãn được} là một công thức thỏa mãn được}
215215
SAT SAT ЄЄ NP-đầy đủ NP-đầy đủ
Đinh lý: SAT Đinh lý: SAT ЄЄ NP-đầy đủ NP-đầy đủ Chứng minh: Chứng minh:
- SAT - SAT ЄЄ NP NP
- Qui dẫn CIRCUIT-SAT về SAT.- Qui dẫn CIRCUIT-SAT về SAT.
216216
3-CNF SAT3-CNF SAT
1 literal trong một công thức boolean là một 1 literal trong một công thức boolean là một biến x hoặc biến x hoặc ¬x.¬x.
1 công thức boolean là có dạng hợp chuẩn 1 công thức boolean là có dạng hợp chuẩn (conjunctive normal form, CNF), nếu nó được (conjunctive normal form, CNF), nếu nó được biểu diễn như là một phép AND của các biểu diễn như là một phép AND của các clause, mỗi clause là một phép OR của các clause, mỗi clause là một phép OR của các literal.literal.
1 công thức boolean là một dạng 3-CNF nếu 1 công thức boolean là một dạng 3-CNF nếu mỗi clause của nó có đúng 3 literal khác mỗi clause của nó có đúng 3 literal khác nhau.nhau.
3-CNF-SAT={Ф Є 3-CNF và là công thức thoả 3-CNF-SAT={Ф Є 3-CNF và là công thức thoả mãn được}mãn được}
217217
Định lý: 3-CNF-SAT Định lý: 3-CNF-SAT Є NP-đầy đủЄ NP-đầy đủ
Chứng minh:Chứng minh:
- - 3-CNF-SAT 3-CNF-SAT Є NPЄ NP
- Qui dẫn SAT về 3-CNF-SAT- Qui dẫn SAT về 3-CNF-SAT
3-CNF-SAT 3-CNF-SAT Є NP-đầy đủЄ NP-đầy đủ
218218
3-CNF-SAT là NP-khó3-CNF-SAT là NP-khó
Ý tưởngÝ tưởng: chứng minh SAT ≤: chứng minh SAT ≤P P 3-CNF-SAT: 3-CNF-SAT: Với mỗi công thức boolean Với mỗi công thức boolean ΦΦ, ta tìm tương , ta tìm tương
ứng một công thức f(ứng một công thức f(ΦΦ) ) ЄЄ 3-CNF. 3-CNF. Xây dựng f(Xây dựng f(ΦΦ) theo 3 bước:) theo 3 bước:
1.1. ΦΦ’: là công thức gồm phép AND của các clause’: là công thức gồm phép AND của các clause2.2. ΦΦ’’: có dạng chuẩn CNF’’: có dạng chuẩn CNF3.3. ΦΦ’’’: có dạng chuẩn 3-CNF. f(’’’: có dạng chuẩn 3-CNF. f(ΦΦ)= )= ΦΦ’’’ ’’’
Chứng minh: Chứng minh: ΦΦ thỏa mãn được thỏa mãn được f( f(ΦΦ) thỏa mãn được) thỏa mãn được
Chứng minh f(Chứng minh f(ΦΦ) có độ dài đa thức và f có ) có độ dài đa thức và f có tgđttgđt
219219
Bước 1: Bước 1: ΦΦ -> -> ΦΦ’’
220220
Xây dựng cây nhị phân:Xây dựng cây nhị phân: Các lá là các literal của Các lá là các literal của ΦΦ Các nốt trong là các toán tử của Các nốt trong là các toán tử của ΦΦ Thêm một biến yThêm một biến yi i cho mỗi nốt trongcho mỗi nốt trong
ΦΦ’: là phép AND của gốc và các ’: là phép AND của gốc và các clause tương ứng với các nốt trong clause tương ứng với các nốt trong (mỗi clause có ≤ 3 literal)(mỗi clause có ≤ 3 literal)
221221
ΦΦ’ -> ’ -> ΦΦ’’’’
Với mỗi clause C của Với mỗi clause C của ΦΦ’:’: Viết bảng giá trị của C theo các biếnViết bảng giá trị của C theo các biến Hợp các giá trị 0 lại, được dạng chuẩn DNF của Hợp các giá trị 0 lại, được dạng chuẩn DNF của
¬C¬C Theo luật De Morgan, AND -> OR, OR ->AND: Theo luật De Morgan, AND -> OR, OR ->AND:
được dạng chuẩn CNF của C (C là AND của các được dạng chuẩn CNF của C (C là AND của các clause, mỗi clause là gồm các phép OR)clause, mỗi clause là gồm các phép OR)
ΦΦ’’: là AND của các tất cả clause ’’: là AND của các tất cả clause nhận được (mỗi clause có ≤ 3 literal)nhận được (mỗi clause có ≤ 3 literal)
222222
ΦΦ’’ -> ’’ -> ΦΦ’’’’’’
ΦΦ’’ = C’’ = C1 1 ٨٨ CC2 2 ٨٨ … … ٨٨ CCkk
Nếu CNếu Ci i có:có: 3 literal: để nguyên3 literal: để nguyên 2 literal C2 literal Ci i = x = x ٧٧ y = (x y = (x ٧٧ y y ٧٧ p) p) ٨٨ (x (x ٧٧ y y ٧٧
¬p) ¬p) 1 literal 1 literal CCi i = x = x = (x = (x ٧٧ p p ٧٧ q) q) ٨٨ (x (x ٧٧ p p ٧٧ ¬q) ¬q)
٨٨ (x (x ٧٧ ¬p ¬p ٧٧ q) q) ٨٨ (x (x ٧٧ ¬p ¬p ٧٧ ¬q) ¬q) ΦΦ’’’: nhận được ’’’: nhận được ЄЄ 3-CNF 3-CNF
223223
Chứng minh tính đúng đắnChứng minh tính đúng đắn
ΦΦ thỏa mẫn được thỏa mẫn được ΦΦ’’’ thỏa mãn ’’’ thỏa mãn đượcđược
ΦΦ’’’: độ dài đa thức’’’: độ dài đa thức Tính Tính ΦΦ’’’: trong thời gian đa thức’’’: trong thời gian đa thức
224224
Bài toán chu trình HamiltonBài toán chu trình Hamilton
Cho đồ thị G=(V,E) vô hướngCho đồ thị G=(V,E) vô hướng Một chu trình Hamilton trong G là một chu trình Một chu trình Hamilton trong G là một chu trình
đơn và đi qua tất cả các đỉnh của G (qua mỗi đỉnh đơn và đi qua tất cả các đỉnh của G (qua mỗi đỉnh đúng một lần, trừ đỉnh đầu trùng đỉnh cuối).đúng một lần, trừ đỉnh đầu trùng đỉnh cuối).
Đồ thị G được gọi là đồ thị Hamilton nếu nó có Đồ thị G được gọi là đồ thị Hamilton nếu nó có chu trình Hamilton, nếu không nó được gọi là đồ chu trình Hamilton, nếu không nó được gọi là đồ thi không phải Hamilton.thi không phải Hamilton.
Bài toán chu trình Hamilton: đồ thị G có chu trình Bài toán chu trình Hamilton: đồ thị G có chu trình Hamilton hay không ? Hamilton hay không ?
HAM-CYCLE = {<G>: G là đồ thị Hamilton}HAM-CYCLE = {<G>: G là đồ thị Hamilton}
225225
HAM-CYLCE HAM-CYLCE ЄЄ NP-đầy đủ NP-đầy đủ
HAM-CYCLE HAM-CYCLE ЄЄ NP NP 3-CNF-SAT ≤3-CNF-SAT ≤PP HAM-CYCLE: HAM-CYCLE:
Xây dựng hàm f: Xây dựng hàm f:
ΦΦ ЄЄ 3-CNF -> đồ thị G=(V,E) 3-CNF -> đồ thị G=(V,E)
Sao cho Sao cho ΦΦ thỏa mãn được thỏa mãn được G là đồ G là đồ thị Hamilton.thị Hamilton.
226226
Ý tưởngÝ tưởng
ΦΦ: các biến x: các biến x11, …, x, …, xnn; các clause: C; các clause: C11,…,C,…,Ckk
Đồ thị G gồm hai phần: trái, phải:Đồ thị G gồm hai phần: trái, phải:
1.1. Trái: mỗi CTrái: mỗi Cii: xây dựng một widget dạng B. : xây dựng một widget dạng B. Nối bNối bi4i4 với b với bi+1,1, i+1,1, i=1,2,…,k-1 i=1,2,…,k-1
2.2. Phải: mỗi xPhải: mỗi xmm: x’: x’m m và x’’và x’’m m nối bằng e nối bằng em m và và ¬e¬emm: e: emm ЄЄ h h x xm m = 1 = 1
3.3. Nối (bNối (b1111 , x , x11’) và (b’) và (bk4k4, x, xnn’’) ’’) 4.4. Nối các clause với các biến có liên quan Nối các clause với các biến có liên quan
bằng các widget dạng A.bằng các widget dạng A.
227227
Chứng minh tính đúng đắnChứng minh tính đúng đắn
G G ЄЄ HAM-CYCLE => HAM-CYCLE => ΦΦ ЄЄ 3-CNF-SAT: 3-CNF-SAT:
Chu trình h trong G: Chu trình h trong G:
1.1. (b(b1111 , x , x11’) và (b’) và (bk4k4, x, xnn’’) ’’) ЄЄ h h
2.2. Bên trái: đi qua các widget BBên trái: đi qua các widget B
3.3. Bên phải: qua hoặc eBên phải: qua hoặc emm hoặc ¬e hoặc ¬emm
Gán giá trị cho Gán giá trị cho ΦΦ như sau: như sau:
Nếu eNếu emm ЄЄ h: x h: xmm= 1, nếu ¬e= 1, nếu ¬emm ЄЄ h: x h: xmm = 0 = 0
228228
ΦΦ ЄЄ 3-CNF-SAT => 3-CNF-SAT => G G ЄЄ HAM-CYCLE HAM-CYCLE
Xây dựng h như sau:Xây dựng h như sau:
1.1. Nếu xNếu xmm= 1: e= 1: emm ЄЄ h, nếu x h, nếu xmm = 0: ¬e = 0: ¬emm ЄЄ h h
2.2. (b(bijij, b, bịj+1ịj+1) ) ЄЄ h h literal thứ j của C literal thứ j của Cii = = 00
229229
Thời gian đa thứcThời gian đa thức
Dễ thấy:Dễ thấy:
1.1. G độ dài đa thứcG độ dài đa thức
2.2. Tính G trong thời gian đa thứcTính G trong thời gian đa thức
230230
Bài toán Người đưa hàngBài toán Người đưa hàng
Bài toán: Cho đồ thị G đầy đủ và có Bài toán: Cho đồ thị G đầy đủ và có trong số c(i,j) cho mỗi cạnh (i,j). Tìm trong số c(i,j) cho mỗi cạnh (i,j). Tìm chu trình Hamilton có trọng số nhỏ chu trình Hamilton có trọng số nhỏ nhất.nhất.
Đưa về bài toán quyết định:Đưa về bài toán quyết định:
TSP={<G,c,k>: G=(V,E) đồ thị đầy đủ, c TSP={<G,c,k>: G=(V,E) đồ thị đầy đủ, c hàm số V*V -> Z, k hàm số V*V -> Z, k ЄЄ Z và G có chu Z và G có chu trình người đưa hàng có trọng số ≤ k} trình người đưa hàng có trọng số ≤ k}
231231
TSP TSP ЄЄ NP-đầy đủ NP-đầy đủ
1.1. TSP TSP ЄЄ NP: dễ chứng minh NP: dễ chứng minh2.2. Qui dẫn HAM-CYCLE về TSP:Qui dẫn HAM-CYCLE về TSP:
- Cho G=(V,E) - Cho G=(V,E) ЄЄ HAM-CYCLE, xây dựng HAM-CYCLE, xây dựng một trạng thái của TSP như sau:một trạng thái của TSP như sau:G’=(V,E’): E’=V*V; và c là:G’=(V,E’): E’=V*V; và c là:c(i,j) = 1 nếu (i,j) c(i,j) = 1 nếu (i,j) ЄЄ E, =0 nếu (i,j) ¬ E, =0 nếu (i,j) ¬ЄЄ E E<G’,c,0> <G’,c,0> ЄЄ TSP TSP <G> <G> ЄЄ HAM-CYCLE. HAM-CYCLE.- <G’,c,0> có độ dài đa thức và được tính - <G’,c,0> có độ dài đa thức và được tính trong tgđt. trong tgđt.