Thit k thut ton T tng tip cn

  • Slides: 23
Download presentation
Thiết kế thuật toán

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):

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

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

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, ….

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, ….

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, ….

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

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 >

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á

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

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

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, …,

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

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 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

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, .

Độ 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)

Độ 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ý

Độ 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

Độ 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,

Độ 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

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

Tài liệu http: //fit. mta. edu. vn/~tinhdt/admin-coursedoc-6 -2013 -1 -198. aspx 2021 -09 -06 Dao Thanh Tinh 23