Bài 10: Thực Hành Giải Toán Bằng Kĩ Thuật Chia Để Trị | Chuyên đề học tập Tin học 11 (Định hướng khoa học máy tính) | Chuyên Đề 2: Thực Hành Thiết Kế Thuật Toán Theo Kĩ Thuật Chia Để Trị - Lớp 11 - Kết Nối Tri Thức Với Cuộc Sống

Chuyên đề học tập Tin học 11 - Bài 10: Thực Hành Giải Toán Bằng Kĩ Thuật Chia Để Trị - Thiết kế và viết chương trình giải bài toán đếm số cặp nghịch đảo trong dãy số bằng kĩ thuật chia để trị.

Nội Dung Chính

  1. NHIỆM VỤ 1

(Trang 45)

Sau bài này em sẽ:

  • Biết cách thiết kế và viết chương trình giải một bài toán theo phương pháp chia để trị.

hinh-anh-bai-10-thuc-hanh-giai-toan-bang-ki-thuat-chia-de-tri-13826-0

Khi làm việc với các danh sách/mảng, nhiều trường hợp đòi hỏi cần kiểm ra các danh sách mảng đã được sắp thứ tự để áp dụng thuật toán phù hợp. Cho một dãy số, theo em làm thế nào đề xác định dãy số đã được sắp xếp theo thứ tự tăng dần hoặc giảm dần?

hinh-anh-bai-10-thuc-hanh-giai-toan-bang-ki-thuat-chia-de-tri-13826-1

NHIỆM VỤ 1

Đếm số cặp nghịch đảo (inversion) của dãy số.

Cho một dãy số A bất kì. Hãy đếm số cặp nghịch đảo của dãy số đó. Một cặp phần tử A[i] và A[j] được gọi là nghịch đảo nếu i < j và A[i] > A[j].

Ví dụ dãy  A = [4, 5, 2, 10, 4] sẽ có 4 cặp nghịch đảo là: (4, 2), (5, 2), (5, 4), (10, 4).

Hướng dẫn:

Cách 1. Phương pháp duyệt đơn giản

Ý tưởng:

- Duyệt lần lượt từng phần tử của dãy số.

- Với mọi phần tử đang xét A[i], thực hiện so sánh với tất cả các phần tử đứng sau nó A[j], nếu A[i] > A[j] ta sẽ tăng số cặp nghịch đảo lên 1 đơn vị.

Chương trình 1.

1       def getInvCount(A):

2                  n = len(A)

3                  inv_count = 0

4                  for i in range(n-1):

5                            forin range(i+1, n):

6                                        if A[i] > A[j]:

7                                                    inv_count = inv_count + 1

8                  return inv_count

Thuật toán trên sử dụng hai vòng for lồng nhau tại dòng 4 và 5, do đó thời gian chạy là O(n²).

Cách 2. Sử dụng phương pháp chia để trị dựa trên thuật toán sắp xếp trộn mergesort

Ý tưởng: Thực hiện thuật toán sắp xếp trộn trên dãy đã cho, trong quá trình trộn sẽ đồng thời tiến hành đếm số các cặp nghịch đảo.

(Trang 45)

Các bước thực hiện giải bài toán này như sau:

Chia dãy thành hai phần bằng nhau cho đến khi mỗi dãy chỉ còn 1 phần tử.

Khi tiến hành hàm trộn hai dãy sẽ đồng thời đếm số các cặp nghịch đảo của hai dãy này. Kết quả vẫn tạo được dãy trộn như đã mô tả trong thuật toán sắp xếp trộn, vừa đếm được số nghịch đảo.

Gọi đệ quy đếm số cặp nghịch đảo cho hai nửa bên trái và bên phải, tính tổng số cặp nghịch đảo khi trộn hai dãy. Kết quả sẽ thu được tổng số cặp nghịch đảo cần tìm.

Chương trình chính như sau:

1         def getInvCount(A, left, right):

2                 if left >= right:

3                          return 0

4                 else:

5                          mid = (left + right)//2

6                          countL = getInvCount(A, left, mid)

7                          countR = getInvCount(A, mid + 1, right)

8                          countM = merge(A, left, mid, right)

9                 return countL + countR + countM

Lưu ý:

   - countL là số các cặp nghịch đảo của dãy con bên trái (A, left, mid).

   - countR là số các cặp nghịch đảo của dãy con bên phải (A, mid+1, right).

   - countM là số cặp nghịch đảo mà chỉ số đầu nằm bên trái, chỉ số sau nằm bên phải.

Tổng số các giá trị trên chính là đáp án cần tìm.

Chương trình sau sẽ tiến hành trộn hai nửa dãy A từ left đến mid và từ mid + 1 đến right, đồng thời đếm được số các cặp nghịch đảo đang (i, j), trong đó i nằm trong [left, mid] và j nằm trong khoảng [mid + 1, right]. Mảng phụ temp_arr[] dùng để lưu và cập nhật các thay đổi trên dãy A.

1        def merge(A, left, mid, right):

2               i = left

3               j = mid + 1

4               k = left

5               inv_count = 0

6               while i <= mid and j <= right:

7                        if A[i] <= A[j]:

8                             temp_arr[k] = A[i]

9                             k = k + 1

10                           i = i + 1

11                        else:

12                          temp_arr[k] = A[j]

13                          inv_count = inv_count + (mid - i + 1)

14                          k = k + 1

15                          j = j + 1

(Trang 47)

16                 while i <= mid:

17                          temp_arr[k] = A[i]

18                          k = k + 1

19                          i = i + 1

20                  while j <= right:

21                           temp_arr[k] = A[j]

22                            k = k + 1

23                            j = j + 1

24                   for k in range(left, right + 1):

25                            A[k] = temp_arr[k]

26                   return inv_count

Lưu ý:

- Nếu gộp trường hợp A[i] > A[j], thì sẽ suy ra tất cả các số A[i], A[i + 1], ..., A[mid] đều lớn hơn A[j], do đó tất cả các cặp (i, j), (i + 1, j), ..., (mid, j) đều là nghịch đảo. Vậy suy ra số lượng cặp chỉ số nghịch đảo sẽ tăng lên (mid - i + 1) tại thời điểm này. Điều này được mô tả bằng dòng lệnh 13.

- Các dòng lệnh 24, 25 sẽ cập nhật lại dãy A từ dãy tạm temp_arr sau khi đã tiến hành trộn. Dãy temp_arr được cập nhật trong quá trình trộn tại các lệnh 8, 12, 17, 21.

Lệnh gọi trong chương trình chính:

1         A = [4, 4-7]

2         n = len(A)

3         temp_arr = *n

4         result = getInvCount(A, 0, n - 1)

Phân tích thời gian chạy của thuật toán mergesort thuật toán getInvCount trên có độ phức tạp là O(nlogn).

hinh-anh-bai-10-thuc-hanh-giai-toan-bang-ki-thuat-chia-de-tri-13826-2

LUYỆN TẬP

Nâng cấp chương trình của nhiệm vụ 1 với yêu cầu bổ sung: Cần đưa ra kết quả là số lượng các cặp nghịch đảo và toàn bộ dãy các cặp chỉ số nghịch đảo đã tìm thấy. Ví dụ với A = thì chương trình sẽ đưa ra giá trị 4 và dãy [(4, 2), (5, 2), (5, 4), (10, 4)].

hinh-anh-bai-10-thuc-hanh-giai-toan-bang-ki-thuat-chia-de-tri-13826-3

VẬN DỤNG

1. Cho dãy số A, cần tìm phần tử từ một (mode) của A. Phần tử mốt là phần tử có số lần xuất hiện nhiều nhất trong A. Nếu tồn tại nhiều thì chỉ yêu cầu tìm ra một phần tử mốt. Yêu cầu sử dụng kĩ thuật chia để trị.

2. Cho một dãy số bất kì A[0], A[1]....,A[n – 1]. Một tổng con được định nghĩa là tổng của một dãy con liên tục dạng S(i, j) = A[i] + A[i + 1] + ... + A[j]. Bài toán yêu cầu tìm i và j chi ra một tổng con và dãy con tương ứng có giá trị lớn nhất. Yêu cầu sử dụng kĩ thuật chia để trị.

Tin tức mới


Đánh giá

Bài 10: Thực Hành Giải Toán Bằng Kĩ Thuật Chia Để Trị | Chuyên đề học tập Tin học 11 (Định hướng khoa học máy tính) | Chuyên Đề 2: Thực Hành Thiết Kế Thuật Toán Theo Kĩ Thuật Chia Để Trị - Lớp 11 - Kết Nối Tri Thức Với Cuộc Sống

Tổng số sao của bài viết là: 5 trong 1 đánh giá
Xếp hạng: 5 / 5 sao

Bình Luận

Để Lại Bình Luận Của Bạn

Tin tức mới

Môn Học Lớp 11 - Kết Nối Tri Thức Với Cuộc Sống

Chuyên đề học tập Mĩ thuật 11

Chuyên đề học tập Toán 11

Chuyên đề học tập Ngữ văn 11

Chuyên đề học tập Vật lí 11

Chuyên đề học tập Hóa học 11

Chuyên đề học tập Sinh học 11

Chuyên đề học tập Giáo dục Kinh tế và Pháp luật 11

Chuyên đề học tập Lịch Sử 11

Chuyên đề học tập Địa lí 11

Chuyên đề học tập Âm nhạc 11

Toán tập 1

Chuyên đề học tập Công nghệ 11 (Công nghệ Cơ khí)

Chuyên đề học tập Công nghệ 11 (Công nghệ chăn nuôi)

Chuyên đề học tập Tin học 11 (Định hướng tin học ứng dụng)

Chuyên đề học tập Tin học 11 (Định hướng khoa học máy tính)

Toán tập 2

Vật lí

Hoá Học

Sinh Học

Ngữ Văn Tập 1

Ngữ Văn Tập 2

Lịch sử

Địa Lý

Công Nghệ

Công Nghệ Công Nghệ Cơ Khí

Giáo Dục Quốc Phòng Và An Ninh 11

Giáo dục Kinh Tế và Pháp Luật

GDTC_Cầu Lông

Giáo dục Thể Chất Bóng Chuyền

GDTC Bóng Đá

Âm Nhạc

Hoạt động trải nghiệm hướng nghiệp

GDTC_Bóng Rổ

Mỹ Thuật Điêu Khắc

Mỹ Thuật Đồ Hoạ_Tranh in

Mỹ Thuật Hội Hoạ

Mỹ Thuật Kiến Trúc

Mỹ Thuật Thiết Kế Công Nghiệp

Tin Học

Mỹ Thuật Thiết Kế Đa Phương Tiện

Tin học 11 - Định hướng khoa học máy tính

Mỹ Thuật Thiết Kế Đồ Hoạ

Mỹ Thuật Thiết Kế Sân Khấu Điện Ảnh

Mỹ Thuật Thiết Kế Thời Trang

Mỹ Thuật_Lý Luận Và Lịch Sử Mỹ Thuật

Giải bài tập Toán 11 Tập 1

Giải bài tập Toán 11 Tập 2

Giải bài tập Vật lý 11

Giải bài tập Hóa học 11

Giải bài tập Sinh học 11

Bộ Sách Lớp 11

Giáo Dục Việt Nam

Bộ Sách Giáo Khoa của Nhà Xuất Bản Giáo Dục Việt Nam

Tài liệu học tập

Đây là tài liệu tham khảo hỗ trợ trong quá trình học tập

Global Success & Bộ Giáo Dục - Đào Tạo

Bộ sách Global Success & Bộ Giáo Dục - Đào Tạo là sự kết hợp giữa ngôn ngữ Tiếng Anh theo lối giảng dạy truyền thống và cập nhật những phương thức quốc tế

Cánh Diều

Bộ sách giáo khoa của Nhà xuất bản Cánh Diều

Kết Nối Tri Thức Với Cuộc Sống

Sách giáo khoa của nhà xuất bản Kết Nối Tri Thức Với Cuộc Sống

Sách Kết Nối Tri Thức Với Cuộc Sống

Lớp 1

Sách giáo khoa dành cho lớp 1

Lớp 6

Sách giáo khoa dành cho lớp 6

Lớp 5

Sách giáo khoa dành cho lớp 5

Lớp 4

Sách giáo khoa dành cho lớp 4

Lớp 2

Sách giáo khoa dành cho lớp 2

Lớp 3

Sách giáo khoa dành cho lớp 3

Lớp 7

Sách giáo khoa dành cho lớp 7

Lớp 8

Sách giáo khoa dành cho lớp 8

Lớp 9

Sách giáo khoa dành cho lớp 9

Lớp 10

Sách giáo khoa dành cho lớp 10

Lớp 11

Sách giáo khoa dành cho lớp 11

Lớp 12

Sách giáo khoa dành cho lớp 12

Liên Kết Chia Sẻ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.