(SKKN mới NHẤT) sử dụng cấu trúc dữ liệu set, map, pair và một số hàm trong c++ trong bồi dưỡng học sinh giỏi cho bài toán tìm kiếm, sắp xếp với độ phức tạp o(n) hoặc o(logn)
Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 49 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
49
Dung lượng
1,61 MB
Nội dung
SỞ GIÁO DỤC & ĐÀO TẠO NGHỆ AN TRƯỜNG THPT ĐÔ LƯƠNG ……………………………… SÁNG KIẾN KINH NGHIỆM Đề tài: Sử dụng cấu trúc liệu set, map, pair số hàm C++ bồi dưỡng học sinh giỏi cho tốn tìm kiếm, xếp với độ phức tạp O(n) O(logn) Lĩnh vực: Tin học Người thực hiện: Nguyễn Thị Hà (Giáo viên 1) Hoàng Thị Hương (Giáo viên 2) Tổ mơn: Tốn - Tin Đơn vị: Trường THPT Đô Lương Số điện thoại: 0855974950 0983666458 Email: thuhadl1@gmail.com NĂM HỌC: 2021 – 2022 TIEU LUAN MOI download : skknchat@gmail.com MỤC LỤC PHẦN I ĐẶT VẤN ĐỀ Lý chọn đề tài 2 Mục đích nghiên cứu 3 Nhiệm vụ phạm vi nghiên cứu 3.1 Nhiệm vụ nghiên cứu 3.2 Phạm vi nghiên cứu Đối tượng nghiên cứu Phương pháp nghiên cứu 5.1 Nhóm phương pháp nghiên cứu lý luận 5.2 Nhóm phương pháp nghiên cứu thực tiễn 5.3 Phương pháp thực nghiệm Tính đóng góp đề tài PHẦN II NỘI DUNG Cơ sở lý luận 1.1 Lý luận chương trình phổ thơng 1.2 Lý luận dạy học dạy học lập trình C++ 1.3 Lý luận độ phức tạp thuật toán Cơ sở thực tiễn 2.1 Thực trạng trước thực giải pháp sáng kiến 2.2 Thực trạng giáo viên học sinh dạy học đội tuyển học sinh giỏi 2.4 Thực trạng học tin lập trình học sinh trường trung học phổ thông Nội dung 3.1 Kiểu liệu map 3.2 Kiểu liệu Set 23 3.3 Kiểu liệu pair 29 3.4 Các hàm lower_bound; upper_bound 43 Áp dụng dạy thực nghiệm 46 Kết áp dụng thực nghiệm 46 PHẦN III KẾT LUẬN 47 Kết luận 47 Đề xuất phạm vi 47 PHẦN IV TÀI LIỆU THAM KHẢO 48 TIEU LUAN MOI download : skknchat@gmail.com PHẦN I ĐẶT VẤN ĐỀ Lý chọn đề tài Chương trình giáo dục phổ thơng 2018 có nhiều thay đổi nội dung phương pháp dạy học Nhưng thay đổi phải nói đến môn tin học Môn tin học môn bắt buộc bậc tiểu học bậc trung học sở Đối bậc trung học phổ thông giai đoạn giáo dục hướng nghề nghiệp nên từ lớp 10 đưa vào Chủ đề F Giải vấn đề với trợ giúp máy tính với dự kiến 32 tiết học Đây chủ đề địi hỏi lập trình tốn để máy tính giải Năm học 2020-2021 năm học 2021- 2022 hầu hết tất trường từ bậc trung học sở đến bậc trung học phổ thông đội tuyển học sinh giỏi giải tốn lập trình ngơn ngữ C++ không dùng ngôn ngữ Pascal năm trước Vậy có chuyển đổi ngơn ngữ C++ ngồi kiểu liệu chuẩn học sinh biết kiểu số nguyên; kiểu số thực; kiểu kí tự; kiểu logic số kiểu liệu có cấu trúc kiểu mảng kiểu xâu cịn có số cấu trúc liệu như: map, set, pair sử dụng tốn tìm kiếm, xếp dễ dàng Ngồi C++ có sẵn số hàm cho phép sử dụng số dạng tốn tìm kiếm tính tốn đơn giản lập trình Nhằm nâng cao trình độ lập trình học sinh nói chung đáp ứng yêu cầu thi học sinh giỏi cấp nói riêng học sinh lập trình ln trọng đến tối ưu thuật tốn Hay nói cách khác làm để độ phức tạp toán nhỏ tốt Khi có input output phải xác, đồng thời kết thời gian chạy ngắn nhất, độ phức tạp nhỏ thường O(n) O(logn) Với tốn tìm kiếm, xếp thường toán mảng chiều, liên quan dãy liên tiếp kết toán yêu cầu đưa thành phần giá trị số Vì tốn dạng sử dụng cấu trúc liệu map, pair, set dễ giải với độ phức tạp toán O(n) O(logn) với liệu lớn Cấu trúc đề thi học sinh giỏi đề cập đến tốn tìm kiếm biết khai thác tối đa ngôn ngữ C++ tìm kiếm với số hàm có sẵn như: find; lower_bound; upper_bound viết code cách nhanh chóng, hữu dụng Thực tế dạy học đội tuyển cấp tỉnh môn tin học giáo viên học sinh khơng lập trình tốn mà cần u cầu thời gian chạy Nói cách khác test yêu cầu chạy tối đa khơng q giây lúc có kết cao Tuy nhiên thực tế học sinh lập trình toán thường thời gian Một lỗi vượt thời gian thường xảy thuật tốn chưa tối ưu Muốn độ phức tạp cho toán với kiểu liệu lớn thường từ 104 trở lên phải O(n) O(logn) Do cần biết vận dụng điểm mạnh ngôn ngữ C++ cấu trúc liệu, kiểu liệu hàm có sẵn TIEU LUAN MOI download : skknchat@gmail.com Vì q trình giảng dạy tơi đúc rút số kinh nghiệm để giúp học sinh tiếp cận nội dung dễ dàng hơn, tạo nhiều đam mê cho học sinh Để rèn lực kỹ lập trình cho học sinh khá, giỏi mơn Tin học Qua kinh nghiệm bồi dưỡng học sinh giỏi đội tuyển tỉnh tơi có kết định Cụ thể năm học 2021-2022 mạnh dạn bồi dưỡng em dự thi cấp tỉnh đạt 2, có em đạt 17/20 Với lý đưa đưa đề tài “Sử dụng cấu trúc liệu set, map, pair số hàm C++ bồi dưỡng học sinh giỏi cho tốn tìm kiếm, xếp với độ phức tạp O(n) O(logn)” Mục đích nghiên cứu Trong q trình nghiên cứu giảng dạy, tơi nhận thấy ngơn ngữ lập trình C++ cung cấp nhiều thư viện nên tiện lợi trình lập trình giải toán, đồng thời lớp toán tìm kiếm xếp vận dụng nhiều lập trình Vì vậy, tơi viết đề tài với mục đích: - Thứ nhất, trao đổi với đồng nghiệp việc vận dụng ngôn ngữ C++ việc lập trình - Thứ hai, tài liệu cho giáo viên phục vụ giảng dạy, bồi dưỡng HSG Nhiệm vụ phạm vi nghiên cứu 3.1 Nhiệm vụ nghiên cứu Đề tài chủ yếu nghiên cứu hệ thống lớp toán ứng dụng cấu trúc liệu map, set, pair số hàm có sẵn lập trình ngơn ngữ C++ Giúp độc giả tiếp cận cách dạy, cách học cách có hệ thống 3.2 Phạm vi nghiên cứu Đề tài nghiên cứu trình dạy đội tuyển học sinh giỏi tỉnh học trường THPT Đô Lương Đề tài có khả áp dụng rộng rãi vào giảng dạy, bồi dưỡng học sinh giỏi Tin học cho giáo viên học sinh THCS, THPT địa bàn toàn tỉnh Nghệ An Đối tượng nghiên cứu - Chương trình giáo dục phổ thơng - Ngơn ngữ lập trình C++ - Cấu trúc đề thi học sinh giỏi tỉnh môn tin tỉnh Nghệ An - Các kiểu liệu cấu trúc - Một số hàm tìm kiếm - Đối tượng học sinh đội tuyển tin học sinh giỏi trường tỉnh TIEU LUAN MOI download : skknchat@gmail.com Phương pháp nghiên cứu 5.1 Nhóm phương pháp nghiên cứu lý luận Nghiên cứu chương trình giáo dục phổ thông 2018 Các Nghị Đảng, Nhà nước, Bộ giáo dục đào tạo, Sở giáo dục đào tạo tỉnh liên quan đến đề tài nghiên cứu - Nghiên cứu, phân tích cấu trúc nội dung chương trình tin học THPT đặc biệt cấu trúc đề thi học sinh giỏi cấp trường cấp tỉnh khối THCS THPT môn tin học Các tài liệu liên quan đến ngơn ngữ lập trình C++ cấu trúc liệu nâng cao C++ 5.2 Nhóm phương pháp nghiên cứu thực tiễn - Thực tiễn qua dạy học bồi dưỡng đội tuyển học sinh giỏi tỉnh ôn luyện học sinh giỏi cấp trường 5.3 Phương pháp thực nghiệm - Thực nghiệm qua bồi dưỡng học sinh giỏi tỉnh kết đạt đội tuyển tỉnh qua tham dự kỳ thi HSG tỉnh Nhất năm 2021-2022 lập trình ngơn ngữ C++ Tính đóng góp đề tài - Giúp học sinh đội tuyển học sinh giỏi biết cấu trúc liệu nâng cao Các hàm có sẵn C++ Vận dụng đặc trưng cấu trúc liệu vào giải toán cách đơn giản Như toán tần số, tốn tìm kiếm tốn xếp - Là tài liệu cho học sinh giỏi cấp trường cấp tỉnh tham khảo Đồng thời tài liệu cho giáo viên dạy đội tuyển bậc THCS THPT môn tin học PHẦN II NỘI DUNG Cơ sở lý luận 1.1 Lý luận chương trình phổ thơng Mục tiêu cấp trung học phổ thơng: Chương trình mơn Tin học cấp trung học phổ thông giúp học sinh củng cố nâng cao lực tin học hình thành, phát triển giai đoạn giáo dục bản, đồng thời cung cấp cho học sinh tri thức mang tính định hướng nghề nghiệp thuộc lĩnh vực tin học ứng dụng tin học, cụ thể là: - Giúp học sinh có hiểu biết hệ thống máy tính, số kĩ thuật thiết kế thuật toán, tổ chức liệu lập trình; củng cố phát triển cho học TIEU LUAN MOI download : skknchat@gmail.com sinh tư giải vấn đề, khả đưa ý tưởng chuyển giao nhiệm vụ cho máy tính thực - Giúp học sinh có khả ứng dụng tin học, tạo sản phẩm số phục vụ cộng đồng nâng cao hiệu cơng việc; có khả lựa chọn, sử dụng, kết nối thiết bị số, dịch vụ mạng truyền thông, phần mềm tài nguyên số khác - Giúp học sinh có khả hồ nhập thích ứng với phát triển xã hội số, ứng dụng công nghệ thông tin truyền thơng học tự học; tìm kiếm trao đổi thông tin theo cách phù hợp, tuân thủ pháp luật, có đạo đức, ứng xử văn hố có trách nhiệm; có hiểu biết thêm số ngành nghề thuộc lĩnh vực tin học, chủ động tự tin việc định hướng nghề nghiệp tương lai thân 1.2 Lý luận dạy học dạy học lập trình C++ - Học lập trình C++ xu hướng ngành lập trình Bởi C++ ngơn ngữ phổ biến đứng thứ Có nhiều ứng dụng phổ biến viết loại ngôn ngữ Photoshop, Chrome, Cho nên có sức ảnh hưởng lớn xu hướng ngơn ngữ lập trình - Điểm mạnh C++ với ngôn ngữ lập trình khác + Ngơn ngữ C++ ngơn ngữ cấp trung Nó có kết hợp tính ngôn ngữ cấp cao thấp C++ sử dụng cho lập trình để giúp người dùng thâm nhập vào phần cứng Hỗ trợ chức ngơn ngữ lập trình bậc cao + C++ ngơn ngữ lập trình có cấu trúc cho phép chương trình phức tạp chia thành chương trình đơn giản nhỏ Đó gọi hàm Nó cịn cho phép di chuyển liệu dễ dàng hàm Mà bạn thường xuyên thấy ngôn ngữ lập trình đại ngày + Có nhiều tính khác Nó cho phép người dùng truy cập trực tiếp vào API phần cứng máy, xuất phiên dịch Đặc biệt sử dụng tài nguyên máy cấp phát nhớ Đó tối ưu ứng dụng trình điều khiển hệ thống nhúng Ngơn ngữ lập trình vơ hiệu tiện dụng Nó sử dụng cho hệ thống Nó nằm hệ thống lớn hệ điều hành Windows, Unix,… + Là ngôn ngữ lập trình đa mục đích Có thể ứng dụng trực tiếp vào ứng dụng doanh nghiệp, game, đồ họa,… -Ngơn ngữ lập trình C++ nhanh hầu hết ngơn ngữ khác Python, Java Đó lý mà người dùng thường thích sử dụng ngôn ngữ so với ngôn ngữ khác Vậy việc học lập trình C++ ln điều mà người lập trình muốn hướng tới TIEU LUAN MOI download : skknchat@gmail.com 1.3 Lý luận độ phức tạp thuật toán - Giả sử ta có hai thuật tốn P1 P2 với thời gian thực tương ứng T1(n) = 100n2 (với tỷ suất tăng n2) T2(n) = 5n3 (với tỷ suất tăng n3) Khi n > 20 T1 < T2 Sở dĩ tỷ suất tăng T1 nhỏ tỷ suất tăng T2 Như cách hợp lý ta xét tỷ suất tăng hàm thời gian thực chương trình thay xét thân thời gian thực Cho hàm T(n), T(n) gọi có độ phức tạp f(n) tồn C, N0 cho T(n) ≤ Cf(n) với n ≥ N0 (tức T(n) có tỷ suất tăng f(n)) kí hiệu T(n) O(f(n)) (đọc “ô f(n)”) Các hàm thể độ phức tạp có dạng thường gặp sau: log2n, n, nlog2n, n2, n3,2n, n!, nn Trong cách viết, ta thường dùng logn thay cho log2n cho gọn Khi ta nói đến độ phức tạp thuật tốn ta nói đến hiệu thời gian thực chương trình nên xem việc xác định thời gian thực chương trình xác định độ phức tạp thuật toán Cơ sở thực tiễn 2.1 Thực trạng trước thực giải pháp sáng kiến Học sinh giải toán với nhiều cách khác Nhưng để đảm bảo theo yêu cầu đề chạy giây theo liệu đề học sinh thường vất phải lỗi Vậy làm để giải tốn tối ưu nhất? Có giải pháp cho tốn Chúng ta tìm hiểu vận dụng hàm có sẵn C++ kiểu liệu có cấu trúc với tốn xếp, tìm kiếm tần suất 2.2 Thực trạng giáo viên học sinh dạy học đội tuyển học sinh giỏi - Học sinh đa số làm quen với ngôn ngữ Pacal, nên chuyển sang ngơn ngữ C++ em cịn bỡ ngỡ Đồng thời chương trình tin học cũ lớp 11 kiểu liệu có cấu trúc nâng cao ghi giảm tải có kiểu mảng, xâu Nên giải số tốn gặp khó khăn - Các tài liệu viết cách chung chung Để tìm tài liệu chi tiết, đầy đủ, dễ đọc áp dụng khó Mặt khác thuật tốn tương đối khó nên phải dành nhiều thời gian cho việc ngồi máy tính để lập trình Trong em cịn nhiều kiến thức phải học môn khác - Giáo viên dạy đội tuyển đầu tư tìm tịi Tuy nhiên giáo viên chưa làm việc nhiều với ngơn ngữ C++ nên gặp khó khăn Đồng thời hàm có sẵn C+ kiểu liệu có cấú trúc khơng có sẵn nội dung sách giáo khoa nên bắt buộc giáo viên phải nghiên cứu nhiều biết vận dụng toán - Tài liệu ơn thi đội tuyển thật khó tìm để phù hợp học sinh giáo viên TIEU LUAN MOI download : skknchat@gmail.com 2.4 Thực trạng học tin lập trình học sinh trường trung học phổ thơng - Các em học sinh có cách nhìn chung mơn tin lập trình khó Vừa phải biết ngơn ngữ, vừa phải hiểu chất tốn học Đồng thời biết tìm thuật tốn tối ưu cho tốn - Mơn tin học khơng áp dụng thi tốt nghiệp hay đại học nên em theo xu hướng thi học Nên chọn học sinh vào đội tuyển để em dành thời gian học nghiên cứu mơn tin lập trình khó khăn Muốn đạt kết cao kì thi học sinh giỏi tỉnh giáo viên ngồi cần phải trang bị đầy đủ, chi tiết kiến thức phần lí thuyết Cịn phải đưa tập phù hợp để cố, trang bị kiến thức, nâng cao kĩ vận dụng cụ thể Nhất tìm lợi điểm mạnh C++ chương trình có sẵn Các cáu trúc liệu nâng cao vận dụng dễ dàng để giải toán Nội dung 3.1 Kiểu liệu map Trong trình học tập tìm hiểu, bạn quen thuộc hay sử dụng phép toán mảng, xâu kí tự Trong viết này, giới thiệu với bạn cấu trúc liệu mạnh, giúp giải nhiều toán với tốc độ cao cách cài đặt đơn giản map a, Map Map C++ tập hợp phần tử xếp theo thứ tự cụ thể, mà phần tử hình thành kết hợp cặp khóa giá trị (key & value), với khóa map Trong map, khóa (key) sử dụng để xếp xác định giá trị (value) tương ứng liên kết với Các cấu trúc liệu mảng hay xâu kí tự, truy xuất liệu bạn sử dụng tham số gọi số, ví dụ arr[1], str[2], … Đối với cấu trúc liệu map, để truy xuất liệu bạn sử dụng tham số gọi key Cấu trúc liệu kiểu map cấu trúc liệu ánh xạ gọi khoá (key) sang giá trị khố (gọi value) Trong cấu trúc liệu này, key nhận giá trị khác TIEU LUAN MOI download : skknchat@gmail.com b, Khai báo map Cú pháp: map someMap; Trong đó: + kiểu liệu key thường string số nguyên + kiểu liệu value thường giá trị số int, float, v.v ; + someMap: tên bạn muốn đặt cho map Ví dụ khai báo map sau: map m; Trong đó: m tên map c, Sử dụng map Có phương thức map: * Phương thức 1: Thêm cặp key- value cách gán key với giá trị Cấu trúc: Tên map [key]=value; Ví dụ 1: m[100]=200 ; Nghĩa thêm cặp (key-value) vào map Ngoài để thêm cặp (key- value) vào map bạn sử dụng tên map.insert({key, value}); Ví dụ 2: m.inser({300,400}); TIEU LUAN MOI download : skknchat@gmail.com m.inser({400,500}); Như ta thêm cặp giá trị vào map gồm ({100,200};{300,400};{400,500}) Ví dụ 3: khai báo map them cặp giá trị vào map map A; // Khởi tạo map A // Thêm vào map A số phần tử A["One"] = 1; A["Two"] = 2; A["Three"] = 3; Phương thức 2: Truy suất giá trị thơng qua khóa(key); Để duyệt qua phần tử map bạn dùng for(auto it:tên map) cout