BÀI TẬP NGHIÊN CỨU BẰNG PHƯƠNG PHÁP LÀM MỊN DẦN

16 1.1K 8
BÀI TẬP NGHIÊN CỨU BẰNG PHƯƠNG PHÁP LÀM MỊN DẦN

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCAL ĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCALĐỀ TÀI NHÓM GIÚP CỤ THỂ HÓA PP DẠY HỌC BẰNG PASCAL

Giải vấn đề phương pháp làm mịn dần TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN TRUNG TÂM GDTX TỈNH LONG AN GVHD: ThS Nguyễn Chí Trung SVTH: Phạm Ngọc Trọng Hà Thị Thùy Vân Nguyễn Thị Hồng Nhung Nguyễn Thị Kim Ngân Nguyễn Ngọc Lan Lớp: Sư phạm tin học K3 LONG AN_NĂM 2016 Giải vấn đề phương pháp làm mịn dần Khái niệm làm mịn dần – Làm mịn dần chiến lược giải vấn đề theo tiếp cận chia để trị (devide and conquer): “Phân tích toán/thuật toán thành toán/thuật toán đơn giản Quá trình phân tích diễn đến nhận toán/thuật toán sơ cấp (dễ giải biết cách giải quyết).” – Có hai cách tiếp cận làm mịn dần: Từ xuống (top-down) từ lên (bottom-up) Ví dụ: Input: Tọa độ đỉnh tứ giác; Output: Diện tích tứ giác – Làm mịn dần từ xuống dưới: o S(tứ giác) → S(tam giác) → Dodaicanh(A, B) – Làm mịn dần từ lên: o Dodaicanh(A, B) → S(tam giác) →S(tứ giác)  Hình ảnh “Làm mịn dần từ vào trong” Giải vấn đề phương pháp làm mịn dần Các bước dạy học thuật toán theo phương pháp làm mịn dần  Bước Làm thô: thuật toán phân tích thành thuật toán dạng “đóng gói” Biểu diễn thuật toán thể mức tổng thể, “thô” (kém “mịn” nhất)  Bước Làm mịn dần: Thực trình xây dựng thuật toán theo cách làm thuật toán Quá trình thực đến nhận xây dựng thuật toán sơ cấp  Bước Làm mịn hoàn toàn: Thực trình thay dần gói thuật toán biểu diễn chi tiết chúng tìm bước Khi thuật toán biểu diễn chi tiếp thuật toán chính, ta nói “mở ra” Lưu ý: Mỗi bước xchúng em giai đoạn có nhiều bước nhỏ bên Dạy học thuật toán xếp làm mịn dần • Ví dụ 1: Thuật toán xếp Chọn trực tiếp (selection sort)  Bước 1: Làm thô  Xét mảng a gồm n phần tử a[1], a[2], …, a[n]  Gọi Q(i) thuật toán tìm vị trí k phần tử bé dãy từ a[i] đến a[n]  Và Swap(i, k) thuật toán hoán đổi giá trị hai phần tử a[i] a[k]  Giả sử Q(i) Swap(i, k) coi biết Gọi P thuật toán xếp tăng dần mảng a Khi P biểu diễn sau: Phiên giả mã: Với giá trị i từ đến n-1, thực thuật toán  Q(i, k), k ≠ i tiến hành tiếp thuật toán Swap(i, k) Phiên Pascal: Thuật toán P (dạng thô) for i:=1 to n-1 begin Q(i); if i k then Swap(i, k); end; Giải vấn đề phương pháp làm mịn dần  Bước 2: Làm mịn dần a) Xét thuật toán Swap(i, k) Đây thuật toán hoán đổi giá trị hai biến mà ta biết: Thuật toán Swap(i, k) tg := a[i]; a[i] := a[k]; a[k] := tg; Xét thuật toán Q(i) Thuật toán thực chất thuật toán tìm kiếm tuần tự: Tìm vị trí nhỏ phần tử dãy a[i], a[i+1], …, a[n]: Thuật toán Q(i) k := i; {Giả sử i phần tử bé nhất, k = i} for j:= i + to n {xét phần tử dãy} if a[j] < a[k] then {nếu gặp phần tử a[j] bé a[k]} k := j; {tiến hành gán lại k vị trí j phần tử bé đó}  Bước 3: Làm mịn hoàn toàn Ghép thuật toán Q(i) Swap(i,k) vào thuật toán P ta nhận toàn thuật toán xếp tăng dần mảng a: Selection Sort For i:= to n – begin k := i; for j:= i + to n if a[j] < a[k] then k := j; if i k then begin tg := a[i]; a[i] := a[k]; a[k] := tg; end; end; Giải vấn đề phương pháp làm mịn dần  Ví dụ minh chứng cho thuật toán: Cho dãy số a={ 12, 2, 8, 5, 1, 6, 4, 15} + Khi xét i=1 Q(1) Swap(1,5) 1, 2, 8, 5, 12, 6, 4, 15 Swap(2,2) 1, 2, 8, 5, 12, 6, 4, 15 Swap(3,7) 1, 2, 4, 5, 12, 6, 8, 15 Swap(4,4) 1, 2, 4, 5, 12, 6, 8, 15 k=5 + Khi xét i=2 Q(2) k=2 + Khi xét i=3 Q(3) k=7 + Khi xét i=4 Q(4) k=4 + Khi xét i=5 k=6 Giải vấn đề phương pháp làm mịn dần Q(5) + Khi xét Swap(4,6) 1, 2, 4, 5, 6, 12, 8, 15 Swap(6,7) 1, 2, 4, 5, 6, 8, 12, 15 i=6 Q(6) k=7 Dãy số nhận a={1, 2, 4, 5, 6, 8, 12, 15} Kết chạy chương trình Pascal: • Ví dụ 2: Thuật toán xếp kiểu bọt (buble sort)  Bước 1: Làm thô  Xét mảng a gồm n phần tử a[1], a[2], …, a[n]  Gọi Q(i) thuật toán đưa phần tử nhỏ dãy từ a[i-1] đến a[n] vị trí i-1 (đầu dãy) theo phương pháp bọt  Giả sử Q(i) biết Gọi P thuật toán xếp tăng dần mảng a Khi P biểu diễn sau: Phiên giả mã: Thực dãy thuật toán Q(2), Q(3), …, Q(n) Phiên Pascal: Thuật toán P (dạng thô) for i:=2 to n Q(i);   Bước 2: Làm mịn dần Giải vấn đề phương pháp làm mịn dần – Xét thuật toán Q(i) Thuật toán Q(i) for j:= n down to i if a[j] < a[j-1] then Swap(j, j-1)  Bước 3: Làm mịn hoàn toàn – Ghép thuật toán Q(i) Swap(i, k) vào thuật toán P ta nhận toàn thuật toán xếp tăng dần mảng a: – Bubble Sort for i:= to n for j:= n downto i if a[j] < a[j-1] then begin tg := a[j]; a[j] := a[j-1]; a[j-1] := tg; end; Giải vấn đề phương pháp làm mịn dần  Ví dụ minh chứng cho thuật toán: Cho dãy số a=(12, 2, 8, 5, 1, 6, 4, 15) Giải vấn đề phương pháp làm mịn dần Kết chạy chương trình Pascal: • Ví dụ 3: Thuật toán xếp kiểu chèn trực tiếp (insertion sort)  Bước 1: Làm thô – Xét mảng a gồm n phần tử a[1], a[2], …, a[n] – Gọi Q(x, a, m) thuật toán chèn phần tử x vào dãy m phần tử a[1], a[2], … a[m] xếp để nhận dãy m+1 phần tử a[1], a[2], … a[m], a[m+1] xếp – Giả sử Q(x, a, m) biết – Gọi P thuật toán xếp tăng dần mảng a Khi P biểu diễn sau: Giải vấn đề phương pháp làm mịn dần Phiên giả mã: Thực dãy thuật toán Q(a[2], a, 1); Q(a[3], a, 2); Q(a[4], a, 3); … Q(a[n], a, n-1); Phiên Pascal: Thuật toán P (dạng thô) for i:=2 to n Q(a[i], a, i-1);  Bước 2: Làm mịn dần Thuật toán Q(x, a, m) j := m + 1; while (a[j-1] < x ) and (j > ) begin a[j] := a[j-1]; j := j – 1; end; a[j] := x;  Bước 3: Làm mịn hoàn toàn – Ghép thuật toán Q(i, a, k) Swap(i, k) vào thuật toán P ta nhận toàn thuật toán xếp tăng dần mảng a: – Insertion Sort for i:= to n begin j := i + 1; x:= a[i]; while (a[j-1] < x ) and (j > ) begin a[j] := a[j-1]; j := j – 1; end; a[j] := x; end;  Ví dụ minh chứng cho thuật toán: Cho dãy số a={ 3, 7, 22, 3, 1, 5, 8, 4, 3, 9} Giải vấn đề phương pháp làm mịn dần Kết chạy chương trình Pascal: • Ví dụ 4: Thuật toán kiểm tra tính nguyên tố dãy số nguyên dương  Bước 1: Làm thô - Xét mảng a gồm n phần tử a[1], a[2], …, a[n] - Gọi Q(i) thuật toán tìm vị trí k phần tử số nguyên tố dãy từ a[i] đến a[n] - Giả sử Q(i) coi biết - Gọi P thuật toán tìm kiếm số nguyên tố mảng a Khi P biểu diễn sau: Phiên giả mã: Với giá trị i từ đến n, thực thuật toán Q(i) Phiên Pascal: Thuật toán P (dạng thô) for i:=1 to n begin Q(i); end;  Bước 2: Làm mịn dần Xét thuật toán Q(i) Thuật toán thực chất thuật toán tìm số nguyên tố dãy a[i], a[i+1], …, a[n]: Thuật toán Q(i) for i:= to n {xét phần tử dãy} If (a[i]=0) or (a[i]=1) then {nếu gặp phần tử a[i] 1} Writeln(a[i],' Khong phai la so nguyen to') {Xuất kết quả} k := 1; {Giả sử ta có k =1} k := k+1; {tăng k lên giá trị} Repeat k:= k+1; Until (a[i] mod k= 0) or (k*k>=a[i]); Giải vấn đề phương pháp làm mịn dần If k*k>a[i] then Writeln (a[i],' la so nguyen to') { Nếu a[i] ước số phạm vi từ đến phần nguyên bậc hai a[i] a[i] số nguyên tố  Bước 3: Làm mịn hoàn toàn for i:=1 to n begin If (a[i]=0) or (a[i]=1) then Writeln(a[i],' Khong phai la so nguyen to') Else Begin k:=1; Repeat k:= k+1; Until (a[i] mod k= 0) or (k*k>=a[i]); If k*k>a[i] then Writeln (a[i],' la so nguyen to') else Writeln (a[i],' khong phai la so nguyen to'); end; end;  Ví dụ minh chứng thuật toán Giả sư bạn muốn nhập vào phần tử gồm: a={ 4, 23, 1, 7, 8} Theo thuật toán ta tính sau: + Khi i:=1 a[1]:=4 khác nên ta thực gán: k a[1] mod k k*k>=a[1] False True do (4 mod 2= 0) (2*2>=4) nên a[1]:=4 số nguyên tố + Tăng i:=2 a[2]:=23 khác nên ta thực gán: k a[2] mod k 23 do (5*5>=23) nên a[2]:=23 số nguyên tố k*k>=a[2] False False False False True Tương tự ta có : số nguyên tố số nguyên tố; Kết chạy chương trình nhận sau: Giải vấn đề phương pháp làm mịn dần • Ví dụ 5: Thuật toán kiểm tra tính phương dãy số nguyên dương  Bước 1: Làm thô - Xét mảng a gồm n phần tử a[1], a[2], …, a[n] - Gọi Q(i) thuật toán tìm vị trí k phần tử số phương dãy từ a[i] đến a[n] - Giả sử Q(i) coi biết - Gọi P thuật toán tìm kiếm số phương mảng a Khi P biểu diễn sau: Phiên giả mã: Với giá trị i từ đến n, thực thuật toán Q(i) Phiên Pascal: Thuật toán P (dạng thô) for i:=1 to n begin Q(i); end;  Bước 2: Làm mịn dần Xét thuật toán Q(i) Thuật toán thực chất thuật toán tìm số phương dãy a[i], a[i+1], …, a[n] Thuật toán Q(i) for i:= to n {xét phần tử dãy} x:=trunc(sqrt(A[i])); {gán x phần nguyên bặc hai a[i]} if sqr(x)=a[i] then {Nếu bình phương x a[i] a[i] số phương} Write(A[i]:4); {Xuất a[i]: số phương}  Bước 3: Làm mịn hoàn toàn For i:=1 to n Begin x:=trunc(sqrt(a[i])); Giải vấn đề phương pháp làm mịn dần if sqr(x):=a[i] then Write(a[i]:4); End;  Ví dụ minh chứng thuật toán Giả sư bạn muốn nhập vào phần tử gồm: a={ 1, 7, 9, 16, 3, 2} Theo thuật toán ta tính sau: + Khi i:=1 a[1]:=1 ta thực tính: x:=trunc(sqrt(a[1])) sqr(x):=a[1] True do sqr(1)=a[1]nên a[1]:=1 số phương Từ đó, ta xác định số phương Ta gán thêm điều kiện a[i]=1; + Tăng i:=2 a[2]:=7 ta thực tính: x:=trunc(sqrt(a[1])) sqr(x):=a[1] False do sqr(3)>a[2]nên a[2]:=7 số phương + Tăng i:=3 a[3]:=9 ta thực tính: x:=trunc(sqrt(a[1])) sqr(x):=a[1] True do sqr(3)=a[3]nên a[3]:=9 số phương Tương tự ta có : 16 số phương; không số phương Kết chạy chương trình nhận sau: Giải vấn đề phương pháp làm mịn dần • Ví dụ 6: Thuật toán tìm ước chung lớn  Bước 1: Làm thô - Xét hai số M, N; - Gọi Q(i) thuật toán tính ước số chung số dãy từ a[i] đến a[n] - Và selection_sort: xếp giảm dần - Giả sử Q(i) selection_sort coi biết - Gọi P thuật toán tìm ước chung lớn mảng a Khi P biểu diễn sau: Phiên giả mã: Với giá trị i từ đến n-1, thực thuật toán Q(i, k), k ≠ i tiến hành tiếp thuật toán selection_sort Phiên Pascal: While a[1]a[n] begin Q(i); selection_sort; end;  Bước 2: Làm mịn dần Xét thuật toán Q(i) Thuật toán phép gán thay đổi giá trị cho phần từ thứ a[1] Thuật toán Q(i): a[1]:=a[1]-a[n]; { gán a[1] a[1] trừ cho a[n];  Bước 3: Làm mịn hoàn toàn While a[1]a[n] begin a[1]:=a[1]-a[n]; selection_sort; end; UCLN:=a[1];  Ví dụ minh chứng thuật toán Tìm ước chung lớn dãy a:={16, 32, 8, 36} + Đầu tiên mảng xếp lại sau: a={36, 32, 16, 8} a[1]-a[4]:=36-8=28 a:={28, 32, 16, 8}sắp xếp lại: a:={32, 28, 16, 8} + Tiếp tục a[1]-a[4]:=32-8=24 a:={24, 28, 16, 8}sắp xếp lại: a:={28, 24, 16, 8} + Tiếp tục a[1]-a[4]:=28-8=20 a:={20, 24, 16, 8}sắp xếp lại: a:={24, 20, 16, 8} Giải vấn đề phương pháp làm mịn dần + Tiếp tục a[1]-a[4]:=24-8=16 a:={16, 20, 16, 8}sắp xếp lại: a:={20, 16, 16, 8} + Tiếp tục a[1]-a[4]:=20-8=12 a:={12, 16, 16, 8}sắp xếp lại: a:={16, 16, 12, 8} + Tiếp tục a[1]-a[4]:=16-8=8 a:={8, 16, 12, 8}sắp xếp lại: a:={16, 12, 12, 8, 8} + Tiếp tục a[1]-a[4]:=16-8=8 a:={8, 16, 12, 8}sắp xếp lại: a:={16, 16, 12, 8} Vòng lặp tiếp tục ta nhận mảng a:={4, 4, 4, 4} Khi ta có Ước chung lớn dãy cho  Kết chạy chương trình hình sau:

Ngày đăng: 23/07/2016, 20:36

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan