Thit k thut ton T tng tip cn
- Slides: 23
Thiết kế thuật toán
Tư tưởng tiếp cận Phương pháp giải quyết tuần tự (gia tăng – incremental): Giải quyết tuần tự từng bước theo một thứ tự nào đó cho đến bước cuối cùng, hoặc cho đến khi thực hiện xong yêu cầu (không nhất thiết đến bước cuối cùng) Phương pháp “chia để trị”: Chia bài toán đã cho thành các bài toán nhỏ hơn (phạm vi giải quyết, miền dữ liệu). Giải quyết các bài toán nhỏ, sau đó tổng hợp lại để có lời giải bài toán ban đầu. 2021 -09 -06 Dao Thanh Tinh 2
Phương pháp tuần tự Bài toán: Cho dãy số X = {x 1, x 2, …, xn} (1) Sắp xếp X thành dãy không giảm: x 1 x 2 …. xn (2) Ý tưởng: Bắt đầu từ đoạn có một (hoặc vài) phần tử, mở rộng dần đoạn được sắp cho đến khi toàn bộ dãy số được sắp xếp. 2021 -09 -06 Dao Thanh Tinh 3
Phương pháp tuần tự Ví dụ: Sắp xếp chọn, chèn, nổi bọt Ở mỗi bước (thứ i, với i=1, 2, . . , n-1) sắp xếp đoạn từ x 1, x 2, . . , xi thành đoạn không giảm: x 1 . . . ≤ xi-1, xi, …. , xn Các trường hợp: 1) 2) 2021 -09 -06 x 1 . . . ≤ xi-1 ≤ xj, với xj {xi, . . . , xn} x 1 . . . ≤ xi-1 không rõ quan hệ xj, j {i, . . . , n} với đoạn đã được sắp Dao Thanh Tinh 4
Phương pháp tuần tự x 1 . . . ≤ xi-1, 1) xi, …. , xn x 1 . . . ≤ xi-1 ≤ xj, với xj {xi, . . . , xn} chọn xi = min {xi, . . . , xn} đoạn đã sắp được mở rộng x 1 . . . ≤ xi-1 ≤ xi a) Sắp xếp chọn: chọn xk = min {xi, . . . , xn}, đổi chỗ (xk, xi) b) Sắp xếp nổi bọt: đổi chỗ các phần tử (từng cặp nghịch thế: xj-1 > xj) để các phần tử bé được đưa dần lên trước, phần tử bé nhất lên đầu xi ≤ xj, xj {xi, . . , xn} for j = n downto i+1 if (xj-1 > xj) đổi chỗ (xj-1, xj) 2021 -09 -06 Dao Thanh Tinh 5
Phương pháp tuần tự x 1 . . . ≤ xi-1, 1) xi, …. , xn Giả thiết là đoạn đầu rỗng: i=1 a) Sắp xếp chọn: for i=1 to n-1 chọn xk = min {xi, . . . , xn}, đổi chỗ (xk, xi) b) Sắp xếp nổi bọt: for i=1 to n-1 for j = n downto i+1 if (xj-1 > xj) đổi chỗ (xj-1, xj) 2021 -09 -06 Dao Thanh Tinh 6
Phương pháp tuần tự x 1 . . . ≤ xi-1, 2) xi, …. , xn x 1 . . . ≤ xi-1 không rõ quan hệ xj, j {i, . . . , n} với đoạn đã được sắp Sắp xếp chèn: Xét đoạn mở rộng: x 1, . . . , xi-1, xi cần sắp lại để sao cho: x 1 ≤. . . xi-1 ≤ xi a) {x 1, . . . , xi-1} ≤ xi b) xi < {x 1, . . . , xi-1} c) x 1 < xi-1 j = i; tg = xi; while (j>1) & (tg < xj-1) {xj = xj-1; j=j-1; } xj = tg; 2021 -09 -06 Dao Thanh Tinh 7
Divide and Conquer (chia để trị) Divide and Conquer là thuật toán được thiết kế tổng quát theo lược đồ: Divide: Chia tập dữ liệu đầu vào S thành các tập con S 1, S 2, …, Sm. Với m 2. Recur: Giải đệ quy bài toán trên các tập dữ liệu con Si, i=1, 2, . . , m. Conquer: Tổ hợp lời giải trên các tập dữ liệu con S 1, S 2, …, Sm tạo lời giải bài toán trên tập S. • Phân chia bài toán S ban đầu thành các bài toán con Si, i=1, …, m. • Giải đệ quy các bài toán con Si, i=1, …, m • Tổ hợp lời giải các bài toán con tạo lời giải bài toán S ban đầu 2021 -09 -06 Dao Thanh Tinh 8
Divide and Conquer (2) Ví dụ 1: Merge. Sort(xd, …, xc) if (c-d > 0) Divide: m : = (d+c)/2; Chia S={xd, . . , xc} thành 2 dãy con S 1={xd, . . , xm}, S 2={xm+1, …xc} Recur: Giải đệ quy các bài toán con Merge. Sort(xd, …, xm); Merge. Sort(xm+1, …, xc); 4 Conquer: Tổ hợp lời giải từ {xd … xm} và {xm+1 …xc} 4 4 4 2021 -09 -06 i=d; j: =m+1; k: =d; while (i m) & (j c) a) if xi < xj { zk : = xi; i++} else { zk : = xj; j++} b) k++; if (i>m) for t = j to c zk+t-j : = xt; else for t = i to m zk+t-i : = xt; x[d. . c] : = z[d. . c]; Dao Thanh Tinh 9
Divide and Conquer (3) 4 Remark: – Divide form: – Thủ tục divide khá phức tạp – Thủ tục conquer thường là đơn giản – Conquer form: – Thủ tục divide khá đơn giản – Thủ tục conquer thường là phức tạp 2021 -09 -06 Dao Thanh Tinh 10
Divide and Conquer (4) Ví dụ 2 (divide form): Quick. Sort(xd, …, xc) if (c-d > 0) 4 Divide: M : = xd; i: =d+1; j: =c; while (i j)&(xi M) i: =i+1; while (i j)&(xj M) j: =j-1; if (i<j) swap(xi, xj); swap(xd, xj); Các tập con S 1={xd, . . , xj-1}, S 2={xj}, S 3={xj+1, …xc} có tính chất, với a S 1 và b S 3: a xj b 4 Recur: Quick. Sort(xd, …, xj-1); Quick. Sort(xj+1, …, xc); 4 Conquer: 2021 -09 -06 Dao Thanh Tinh 11
Divide and Conquer (5) Remark: Simple Divide: Xét trường hợp X={Xd, …, Xc} được chia thành 2 phần X’={Xd, …, Xc-1} và X”={Xc} Recur: Sắp xếp X’ và X” Conquer: Vì X” có 1 phần tử nên có thể sử dụng hòa nhập đơn giản j = c; tg = Xc; while ((j>d)&(Xj>tg)) { Xj=Xj-1; j=j-1; } Xj = tg; 2021 -09 -06 Dao Thanh Tinh 12
Divide and Conquer (6) Pc(Xd, . . . , Xc) Simple Divide: X’={Xd, …, Xc-1}, X”={Xc} Recur: Sắp xếp X’: Pc(Xd, . . . Xc-1); Conquer: j = c; tg = Xc; while ((j>d)&(Xj>tg)) { Xj=Xj-1; j=j-1; } Xj = tg; 2021 -09 -06 Pc(Xd, . . . , Xc) if (c>d) Pc(Xd, . . . Xc-1); j = c; tg = Xc; while ((j>d)&(Xj>tg)) { Xj=Xj-1; j=j-1; } Xj = tg; Dao Thanh Tinh 13
Divide and Conquer (7) Pc(Xd, . . . , Xc) if (c>d) for k=d+1 to c j = k; tg = Xk; while ((j>d)&(Xj>tg)) { Xj=Xj-1; j=j-1; } Xj = tg; 2021 -09 -06 Insertion Sort Pc(Xd, . . . , Xc) for k=d+1 to c j = k; tg = Xk; while ((j>d)&(Xj>tg)) { Xj=Xj-1; j=j-1; } Xj = tg; Dao Thanh Tinh 14
Divide and Conquer (8) Divide form: Quick. Sort(xd, …, xc) if (c-d > 0) Divide: M : = xd; i: =d+1; j: =c; while (i j)&(xi M) i: =i+1; while (i j)&(xj M) j: =j-1; if (i<j) swap(xi, xj); swap(xd, xj); Các tập con S 1={xd, . . , xj-1}, S 2={xj}, S 3={xj+1, …xc} a S 1 và b S 3: a xj Selection b Recur: Divide form: QS 2 (xd, …, xc) if (c-d > 0) Divide: Find xj = min {Xd, . . . , Xc} swap(xd, xj); Các tập con S 2={xj}, S 3={xj+1, …xc} a S 2 và b S 3: a b Recur: QS 2(xj+1, …, xc); Sort Quick. Sort(xd, …, xj-1); Quick. Sort(xj+1, …, xc); for k=d to c-1 xj =min{xk, . . . , xc}; swap(xk, xj); Conquer: 2021 -09 -06 Dao Thanh Tinh 15
Ví dụ Cho dãy số X={xd, xd+1, . . . , xc}. Tìm phần tử lớn nhất của dãy. Tuần tự: Xét đến phần tử thứ i-1: Tìm k, xk = max {xd, . . . , xi-1} Xét đến phần tử thứ i: if (xk < xi) k = i; Thuật toán: k = d; for i=d+1 to c if (xk<xi) k = i; 2021 -09 -06 Chia để trị: Chia đoạn xd, xd+1, . . . , xc làm 2 phần xd, . . . , xm và xm+1, . . . , xc Tìm xt = max{ xd, . . . , xm} xf = max{ xm+1, . . . , xc} if (xt > xf) k = t; else k = f; Thuật toán: int max(chỉ số d, c) if (d==c) return d; else { m= (d+c)/2; t = max(d, m); f=max(m+1, c); if (xt>xf) return t; else return f; } Dao Thanh Tinh 16
Độ phức tạp tính toán (1) Insertion Sort (từ Divide and Conquer) Pc(Xd, . . . , Xc) Simple Divide: X’={Xd, …, Xc-1}, X”={Xc} Recur: Sắp xếp X’: Pc(Xd, . . . Xc-1); Conquer: j = c; tg = Xc; while ((j>d)&(Xj>tg)) { Xj=Xj-1; j=j-1; } Xj = tg; 2021 -09 -06 Insertion Sort (X 1, . . . , Xn) for k=2 to n j = k; tg = Xk; while ((j>d)&(Xj>tg)) { Xj=Xj-1; j=j-1; } 4 Xj = tg; Conquer(k) trong trường hợp xấu nhất là O(k), k=2, . . . , n. Tổng thể, Insertion Sort có độ phức tạp về thời gian là O(n 2). Dao Thanh Tinh 17
Độ phức tạp tính toán (2) Merge. Sort(xd, …, xc) if (c-d > 0) m : = (d+c)/2; Merge. Sort(xd, …, xm); Merge. Sort(xm+1, …, xc); i=d; j: =m+1; k: =d; while (i m) & (j c) a) if xi < xj { zk : = xi; i++} else { zk : = xj; j++} b) k++; if (i>m) for t = j to c zk+t-j : = xt; else for t = i to m zk+t-i : = xt; x[d. . c] : = z[d. . c]; k>log 2 n => n/2 k <1. => T(n) n. log 2 n 2021 -09 -06 Dao Thanh Tinh Ký hiệu T(n) là hàm thời gian của thuật toán. T(1) = 1. T(n) = 2 T(n/2) + n T(n) =2 T(n/2)+n =2{2 T(n/4)+n/2} + n = 22 T(n/22) + 2 n/2 + n =22{2 T(n/23) + n/22} + 2 n =23 T(n/23) + 3 n =. . =2 k. T(n/2 k) + kn. 18
Độ phức tạp tính toán (3) Comparison-based sorting algorithms đạt giới hạn (về lý thuyết) là O(nlogn). Xét cây nhị phân quyết định (mỗi phép so sánh quyết định tới việc di chuyển một phần tử): o Số lá của cây quyết định là n! o Chiều cao bé nhất của cây là log 2 n! o Số phép so sánh bằng độ dài đường đi từ gốc đến lá kết quả. o log 2 n! < log 2 nn = nlog 2 n 2021 -09 -06 Dao Thanh Tinh 19
Độ phức tạp tính toán (4) Divide form: QS 2 (xd, …, xc) if (c-d > 0) Divide: Find xj = min {xd, . . . , xc} swap(xd, xj); Các tập con S 2={xj}, S 3={xj+1, …xc} a S 2 và b S 3: a b Recur: QS 2(xj+1, …, xc); Heap Sort(xd, . . . , xc); Find xj = max {xd, . . . , xc} swap(xj, xc); Heap. Sort(xd, . . . , xc-1); Viết lại: for k: = c downto d+1 Find xj = max {xd, . . . , xk}; swap(xj, xk); for k: = c downto d+1 Đảo {xd, . . . , xk} sao cho xd = max{xd, . . . , xk}; swap(xd, xk); 2021 -09 -06 Dao Thanh Tinh 20
Độ phức tạp tính toán (5) for k: = c downto d+1 Đảo {xd, . . . , xk} sao cho xd = max{xd, . . . , xk}; swap(xd, xk); Giả thiết {xd, . . . , xk} là heap: xt max{x 2 t, x 2 t+1}, t = d, . . . , k/2; xd = max{xd, . . . , xk} Tổ chức H = {temp = xk, xd+1, . . . , xk-1} thành heap: a) t = d; b) if (2 t k-1) j=2 t; if (j<k-1)&(xj+1>xj) j=j+1; if (temp <xj) {swap(xt, xj); t: =j; goto b); } Số bước vòng lặp b) bằng log 2(k-d) Suy ra dộ phức tạp của thuật toán vun đống là: (c-d)log 2(c-d) hay O(nlogn) 2021 -09 -06 Dao Thanh Tinh 21
Bài tập 1. Có 1000 phiếu thu tiền điện thoại và 1000 biên lai thu tiền (trong đó có ghi số điện thoại của thuê bao). Cần xác định có hay không người chưa trả tiền. 2. Cho một danh sách gồm tên sách, tác giả, số điện thoại và nhà xuất bản tất cả sách trong thư viện và một danh sách khác khoảng 30 nhà xuất bản. Tính số sách có trong thư viện của mỗi nhà xuất bản. 3. Cho ma trận Am n trong đó các phần tử trên từng cột, hàng đã được sắp xếp không giảm. Cho giá trị x, xác định có hay không một phần tử của A bằng x. Đánh giá số phép so sánh phải thực hiện. 2021 -09 -06 Dao Thanh Tinh 22
Tài liệu http: //fit. mta. edu. vn/~tinhdt/admin-coursedoc-6 -2013 -1 -198. aspx 2021 -09 -06 Dao Thanh Tinh 23
- Quả thịt có đặc điểm gì
- Slide hồn trương ba da hàng thịt
- Bài thơ mẹ đi làm từ sáng sớm
- 0 856m = cm
- Jelaskan tentang konsep angka indeks
- Que ton aliment soit ton médicament
- Gama compusa desen
- Sıcak evin direği tıp tıp eder yüreği
- How to solve an anagram
- Bangluong.tng.v
- Tng galati
- Sop tng.vn
- Bangluong.tng.v
- Logo tng
- Số nhân chi tiêu
- Bảng lương.tng.vn 2021
- Bangluong.tng.v
- "tng"
- Starlogo tng
- Tng
- Bangluong.tng.v
- Logo tng
- O pere je suis ton paroles
- V marketing