
Bài giảng Thuật toán ứng dụng: Bài thực hành số 3 - TS. Bùi Quốc Trung, TA. Đặng Xuân Vương
lượt xem 1
download

Bài thực hành "Thuật toán ứng dụng - Bài thực hành số 3: Chia để trị" tập trung vào việc áp dụng kỹ thuật chia để trị để giải quyết các bài toán phức tạp. Bài thực hành sử dụng các ví dụ minh họa như PIE và FIBWORDS để giúp sinh viên hiểu rõ hơn về nguyên lý chia để trị và cách áp dụng vào thực tế. Sinh viên sẽ được thực hành trên các bài toán này, nắm vững cách phân chia bài toán thành các bài toán con nhỏ hơn và kết hợp kết quả để tìm lời giải.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Thuật toán ứng dụng: Bài thực hành số 3 - TS. Bùi Quốc Trung, TA. Đặng Xuân Vương
- Thuật toán ứng dụng Bài thực hành số 3: Chia để trị TS. Đinh Viết Sang, TA. Đặng Xuân Vương Trường Đại học Bách khoa Hà Nội Viện Công nghệ thông tin và Truyền thông Ngày 23 tháng 11 năm 2020 SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 1 / 15
- Mục lục 1 PIE 2 FIBWORDS SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 2 / 15
- Mục lục 1 PIE 2 FIBWORDS SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 3 / 15
- 04. PIE (VUONGDX) Có N cái bánh và F + 1 người. Mỗi cái bánh có hình tròn, bán kính r và chiều cao là 1. Mỗi người chỉ được nhận một miếng bánh từ một chiếc bánh. Cần chia bánh sao cho mọi người có lượng bánh bằng nhau (có thể bỏ qua vụn bánh). Tìm lượng bánh lớn nhất mỗi người nhận được. SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 4 / 15
- Thuật toán Gọi p[i] là số người ăn chiếc bánh thứ i. Lượng bánh mỗi người nhận được là mini { V [i] } với V [i] là thể tích của chiếc bánh thứ i. p[i] Cách 1 - Tìm kiếm theo mảng p: Tìm kiếm vét cạn mọi giá trị của p. Cách 2 - Tìm kiếm theo lượng bánh mỗi người nhận được: Thử từng kết quả, với mỗi kết quả, kiểm tra xem có thể chia bánh cho tối đa bao nhiêu người. Tối ưu cách 2: Sử dụng thuật toán tìm kiếm nhị phân để tìm kiếm kết quả. Cho một số x bất kỳ, nếu có thể chia bánh sao cho mỗi người có lượng bánh là x thì cũng có thể chia bánh sao cho mỗi người có lượng bánh là x , ∀x < x. Tương tự, nếu không thể chia bánh sao cho mỗi người có lượng bánh là x thì cũng không thể chia bánh sao cho mỗi người có lượng bánh là x , ∀x > x. SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 5 / 15
- Cài đặt Điều kiện dừng của tìm kiếm nhị phân thông thường (trên miền số nguyên) không xảy ra: Tìm kiếm trên miền số thực nên không có giá trị nhỏ nhất lớn hơn một giá trị cho trước (hoặc giá trị lớn nhất nhỏ hơn một giá trị cho trước). low và high không bao giờ bằng nhau. Sai số khoảng giảm dần: Mỗi lần tìm kiếm nhị phân làm khoảng giá trị giảm đi 2 lần. Kết quả tìm được có sai số không vượt quá khoảng tìm kiếm chứa nó. Cần giảm khoảng giá trị (high − low ) xuống 10−6 . Dùng 100 bước lặp có thể giảm khoảng giá trị ban đầu đi 1030 lần. Lưu ý khi sử dụng hằng số PI: Sử dụng hằng số của thư viện hoặc dùng giá trị đủ chính xác (Ví dụ: 3.14159265358979323846264338327950288). Sắp xếp bánh theo kích thước: Khi kiểm tra, duyệt từ chiếc bánh to nhất trước giúp tăng cơ hội kết thúc hàm kiểm tra sớm hơn. SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 6 / 15
- Code 1 // r [ i ]: binh phuong ban kinh cua moi chiec banh 2 sort (r , r + N ); 3 4 double lo = 0 , hi = M_PI * max ( r ) , mi ; 5 6 while ( hi - lo > EPS ){ 7 mi = ( lo + hi ) / 2; 8 9 int cont = 0; 0 1 for ( int i = N - 1; 2 i >= 0 && cont F ) lo = mi ; 7 else hi = mi ; 8 } SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 7 / 15
- Mục lục 1 PIE 2 FIBWORDS SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 8 / 15
- 04. FIBWORDS (vuongdx) Dãy Fibonacci Words của xâu nhị phân được định nghĩa như sau: 0, if n = 0 F (n) = 1, if n = 1 F (n − 1) + F (n − 2), if n ≥ 2 Cho n và một xâu nhị phân p. Đếm số lần p xuất hiện trong F (n) (các lần xuất hiện này có thể chồng lên nhau). Giới hạn: 0 ≤ n ≤ 100, p có không quá 100000 ký tự, kết quả không vượt quá 263 . SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 9 / 15
- Thuật toán I Thuật toán 1 - Vét cạn: So sánh xâu p với mọi xâu f (n)[i..(i + len(p)]. Thuật toán 2 - Chia để trị: Xâu f (n) gồm 2 xâu con là f (n − 1) và f (n − 2). Đếm số lần p xuất hiện trong f (n − 1), f (n − 2). Đếm số lần p xuất hiện ở đoạn giữa của xâu f (n) (đoạn đầu của p là đoạn cuối của f (n − 1), đoạn cuối của p là đoạn đầu của f (n − 2)). SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 10 / 15
- Thuật toán II Đếm số lần p xuất hiện trong f (i) với i nhỏ: Sử dụng thuật toán 1. Đếm số lần p xuất hiện ở đoạn giữa xâu f (n): Giả sử 2 xâu f (i − 1) và f (i) có độ dài lớn hơn độ dài xâu p, f (i − 1) có dạng x..a, f (i) có dạng y ..b, trong đó x, y , a, b có độ dài bằng độ dài của p (x và a hay y và b có thể chồng lên nhau). Nhận xét 1: x = y . Nhận xét 2: Nếu n ≡ i(mod2) thì đoạn giữa của f (n) là ..ax.., ngược lại, đoạn giữa của f (n) là ..bx... SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 11 / 15
- Thuật toán III Cài đặt: void preprocessing(): Tính trước các xâu fibonacci word, 2 xâu cuối cùng có độ dài không nhỏ hơn 105 . long long count(string s, string p): Đếm số lần p xuất hiện trong s theo thuật toán 1. long long count(int n, string p): Đếm số lần p xuất hiện trong f (n) theo thuật toán 2. long long solve(int n, string p): Xử lý trường hợp f (n) có độ dài nhỏ hơn độ dài của p. Khởi tạo mảng c - c[i] là số lần xuất hiện của p trong f (i). Sử dụng hàm count(s, p) để đếm số lần xuất hiện của p trong f (i) và f (i − 1) với f (i − 1) là fibonacci word đầu tiên có độ dài không nhỏ hơn độ dài của p rồi lưu vào mảng c. Sử dụng hàm count(s, p) để đếm số lần xuất hiện của p trong ax và bx, lưu vào mảng mc. Sử dụng hàm count(n, p) để đếm số lần xuất hiện của p trong f (n). SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 12 / 15
- Code 9 long long solve ( int n , string p ) { 0 int lp = p . size (); 1 if ( n < n_prepare && l [ n ] < lp ) { return 0;} 2 for ( int j = 0; j
- Code 6 long long count ( int n , string p ) { 7 if ( c [ n ] < 0) { 8 c [ n ] = count ( n - 1 , p ) 9 + count ( n - 2 , p ) 0 + mc [ n % 2]; 1 } 2 return c [ n ]; 3 } SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 14 / 15
- Thuật toán ứng dụng Bài thực hành số 3: Chia để trị TS. Đinh Viết Sang, TA. Đặng Xuân Vương Trường Đại học Bách khoa Hà Nội Viện Công nghệ thông tin và Truyền thông Ngày 23 tháng 11 năm 2020 SangDV, VuongDX (HUST) Chia để trị Ngày 23 tháng 11 năm 2020 15 / 15

CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Thuật toán ứng dụng: Quy hoạch động - Trương Xuân Nam
25 p |
51 |
8
-
Bài giảng Thuật toán ứng dụng: Thuật toán tham lam
42 p |
17 |
7
-
Bài giảng Thuật toán ứng dụng: Thuật toán Tham lam - Trương Xuân Nam
23 p |
77 |
7
-
Bài giảng Thuật toán ứng dụng: Đệ quy quay lui
66 p |
61 |
7
-
Bài giảng Thuật toán ứng dụng: Thuật toán xử lý xâu
89 p |
14 |
5
-
Bài giảng Thuật toán ứng dụng: Thuật toán cơ bản trên đồ thị không trọng số
182 p |
11 |
5
-
Bài giảng Thuật toán ứng dụng: Tiếp cận chia để trị - Trương Xuân Nam
21 p |
46 |
5
-
Bài giảng Thuật toán ứng dụng: Lý thuyết NP-đầy-đủ
53 p |
17 |
4
-
Bài giảng Thuật toán ứng dụng: Chương 1 - Đỗ Phan Thuận
46 p |
37 |
4
-
Bài giảng Thuật toán ứng dụng: Graphs
141 p |
29 |
4
-
Bài giảng Thuật toán ứng dụng: Đệ qui và nhánh cận
48 p |
20 |
4
-
Bài giảng Thuật toán ứng dụng: Tư duy thuật toán và cấu trúc dữ liệu, kỹ năng lập trình
55 p |
14 |
4
-
Bài giảng Thuật toán ứng dụng: Thuật toán và Phân tích Thuật toán - Trương Xuân Nam
34 p |
66 |
3
-
Bài giảng Thuật toán ứng dụng: Chương 3 - Đỗ Phan Thuận
32 p |
32 |
3
-
Bài giảng Thuật toán ứng dụng: Chương 2 - Đỗ Phan Thuận
45 p |
24 |
3
-
Bài giảng Thuật toán ứng dụng (Tư duy thuật toán và cấu trúc dữ liệu + kỹ năng lập trình) - Bùi Quốc Trung
754 p |
1 |
1
-
Bài giảng Thuật toán ứng dụng - Đỗ Phan Thuận
438 p |
2 |
1
-
Bài giảng Thuật toán ứng dụng: Bài thực hành số 1.1 - TS. Bùi Quốc Trung, TA. Đặng Xuân Vương
60 p |
3 |
1


Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn
