Đề giải 26 câu của Nhập Môn Thuật Toán của Trường Đại Học Quy Nhơn

41 5 0
Đề giải 26 câu của Nhập Môn Thuật Toán của Trường Đại Học Quy Nhơ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

đề giải 26 câu Nhập Môn Thuật Toán gồm 26 được giải thích chi tiết và cấc hoạt động của thuật toán..................................................................................................................................................................................................................................

Câu hỏi phương pháp: Trình bày phương pháp Chia để trị thiết kế thuật toán Phương pháp "Chia để trị" (Divide and Conquer) phương pháp thiết kế thuật toán phổ biến sử dụng để giải toán phức tạp cách chia chúng thành toán nhỏ hơn, giải tốn cách đệ quy, kết hợp kết để tạo kết cuối Trình bày phương pháp Quy hoạch động thiết kế thuật toán Phương pháp Quy hoạch động (Dynamic Programming) phương pháp thiết kế thuật toán mạnh mẽ sử dụng để giải toán tối ưu hóa Phương pháp thường áp dụng cho tốn có cấu trúc đệ quy, ta chia tốn thành tốn nhỏ lưu trữ kết tốn để sử dụng lại q trình giải tốn gốc Trình bày phương pháp Tham lam thiết kế thuật toán Là phương pháp sử dụng để giải toán tối ưu tìm trình tự tốt thực cơng việc , tìm đường ngắn đồ thị, v.v **Bài tập minh hoạ cho phương pháp Câu 1: Cho ví dụ minh hoạ thiết kế thuật toán phương pháp Chia để trị bao gồm: toán, áp dụng phương pháp, thuật toán giải Bài tốn: Tìm kiếm phần tử mảng xếp tăng dần Áp dụng phương pháp Chia để trị: Bước Chia: Chia mảng thành hai nửa (hoặc nhiều phần) mục trung tâm Ta so sánh phần tử mục trung tâm với giá trị cần tìm Nếu phần tử trung tâm lớn giá trị cần tìm, ta chia mảng thành nửa bên trái phần tử trung tâm, ngược lại, ta chia mảng thành nửa bên phải phần tử trung tâm Bước Trị: Đệ quy tìm kiếm nửa mảng chia Bước Kết hợp: Trả kết tìm kiếm từ phần tử tìm kiếm Thuật toán giải: Tong(arr, n, m, t): if n > m: return -1 # Khơng tìm thấy mục tiêu mảng i = (n + m) // if arr[i] = = t: #Nếu tập hợp i = t return i # Phần tử tìm thấy else if arr[i] > t: Nếu tập hợp i > t return Tong(arr, n, i - 1, t) # Tìm nửa bên trái mảng else: return Tong(arr, i + 1, m, t) # Tìm nửa bên phải mảng Câu 2: Cho dãy số a = (5, 8, 1, 4, 9, 7, 4, 2, 5, 6) Hãy trình bày bước áp dụng thuật tốn xếp trộn để dãy a theo thứ tự tăng Cho biết phương pháp Chia để trị áp dụng cho thuật toán điểm nào? Bước Chia: Chia dãy số a thành hai nửa cách tìm mục trung tâm mid = (low + high) / 2, low mục dãy high mục cuối dãy a = (5, 8, 1, 4, 9) | (7, 4, 2, 5, 6) Đệ quy chia nửa dãy tiếp tục chia nhỏ a = (5) | (8, 1, 4, 9) | (7) | (4, 2, 5, 6) Tiếp tục chia nửa lại a = (5) | (8) | (1, 4, 9) | (7) | (4) | (2, 5, 6) Bước Kết hợp: Trộn nửa lại với theo thứ tự tăng dần để tạo dãy xếp a = (5, 8) | (1, 4, 9) | (4, 7) | (2, 5, 6) Tiếp tục trộn dãy thu dãy số xếp a = (1, 4, 5, 8, 9) | (2, 4, 5, 6, 7) Trộn hai dãy xếp lại với để thu dãy a xếp theo thứ tự tăng dần a = (1, 2, 4, 4, 5, 5, 6, 7, 8, 9) Phương pháp Chia để trị áp dụng Bước Chia ta chia dãy số thành nửa con, Bước Kết hợp ta trộn dãy lại với theo thứ tự tăng dần Câu 3: Cho dãy số a = (5, 8, 1, 4, 9, 7, 4, 2, 5, 6) Hãy trình bày bước áp dụng thuật toán Quick Sort để dãy a theo thứ tự tăng Cho biết phương pháp Chia để trị áp dụng cho thuật toán điểm nào? Dãy số a = (5, 8, 1, 4, 9, 7, 4, 2, 5, 6) Bước Chia: Chọn phần tử làm phần tử chốt (pivot) Trong ví dụ này, chọn phần tử cuối dãy làm pivot a = (5, 8, 1, 4, 9, 7, 4, 2, 5, 6) | Pivot = Chia dãy số thành hai phần, phần chứa phần tử nhỏ pivot phần chứa phần tử lớn pivot Sử dụng kỹ thuật "Partitioning" a = (5, 1, 4, 4, 2, 5) | Pivot = | (8, 9, 7) Đệ quy áp dụng thuật toán Quick Sort cho hai phần chia a = (1, 4, 4, 2, 5) | Pivot = | (5, 6) a = (1, 4, 4, 2) | Pivot = | (5) a = (1, 4, 4) | Pivot = | () a = (1, 4) | Pivot = | () a = (1) | Pivot = | (4) Bước Kết hợp: Kết hợp phần tử xếp lại với để tạo dãy xếp a = (1, 4) | (1, 4) | (1, 2, 4) | (1, 2, 4, 5) | (5, 6, 8, 9) Dãy a xếp theo thứ tự tăng dần Phương pháp Chia để trị thuật toán Quick Sort áp dụng trình chia dãy số thành phần tử con, tìm pivot áp dụng đệ quy cho phần tử Câu 4: Cho dãy số tăng a = (1, 5, 9, 14, 19, 27, 34, 42, 55, 66) Hãy trình bày bước áp dụng thuật tốn tìm nhị phân để tìm số 55 có dãy a khơng? Cho biết phương pháp Chia để trị áp dụng cho thuật toán điểm nào? Dãy số tăng a = (1, 5, 9, 14, 19, 27, 34, 42, 55, 66) Bước 1: Đặt low = high = độ dài dãy - low = 0, high = Bước 2: Tìm mục trung tâm mid = (low + high) / mid = (0 + 9) / = Bước 3: So sánh phần tử vị trí mid với số cần tìm (55) a[mid] = 19 < 55 Bước 4: Vì a[mid] < 55, nên số cần tìm nằm nửa bên phải dãy Đặt low = mid + low = 5, high = Bước 5: Tìm lại mục trung tâm mid = (5 + 9) / = Bước 6: So sánh phần tử vị trí mid với số cần tìm (55) a[mid] = 42 < 55 Bước 7: Vì a[mid] < 55, nên số cần tìm nằm nửa bên phải dãy Đặt low = mid + low = 8, high = Bước 8: Tìm lại mục trung tâm mid = (8 + 9) / = Bước 9: So sánh phần tử vị trí mid với số cần tìm (55) a[mid] = 55 Bước 10: Phần tử vị trí mid trùng khớp với số cần tìm (55) Tìm kiếm kết thúc Số 55 có dãy a Phương pháp Chia để trị không áp dụng thuật tốn tìm nhị phân Trong thuật tốn này, ta tiến hành chia mảng thành nửa tìm kiếm dựa việc so sánh phần tử mảng với số cần tìm để xác định nửa mảng cần xem xét Quá trình tiếp tục tìm thấy phần tử xác định phần tử khơng có mảng Câu 5: Cho dãy a = (2, -15, 6, 2, 9, -4, 7, 3, -5, 2), trình bày bước tìm đoạn có tổng lớn dãy a thuật toán chia để trị Cho biết phương pháp chia để trị áp dụng cho thuật toán điểm nào? Bước 1: Đặt hai biến max_so_far max_ending_here giá trị phần tử dãy max_a = max_b = Bước 2: Duyệt qua phần tử từ phần tử thứ đến phần tử cuối dãy - Với phần tử, cập nhật max_b tổng max_b phần tử - Nếu max_b âm 0, gán max_b = (bắt đầu tính lại tổng từ phần tử tiếp theo) - So sánh max_a với max_b cập nhật max_a cần Các bước cụ thể sau: 2: max_b = 2, max_a= (max_so_far không thay đổi) -15: max_b = max_b + (-15) = -13, max_a = (max_a không thay đổi) 6: max_b = max_b + = -7, max_a = (max_a không thay đổi) 2: max_b = max_b + = -5, max_a = (max_a không thay đổi) 9: max_b = max_b + = 4, max_a = (max_a cập nhật) -4: max_b = max_b + (-4) = 0, max_a = (max_a không thay đổi) 7: max_b = max_b + = 7, max_a = (max_a cập nhật) 3: max_b = max_b + = 10, max_a = 10 (max_a cập nhật) -5: max_b = max_b + (-5) = 5, max_a = 10 (max_a không thay đổi) 2: max_b = max_b + = 7, max_a = 10 (max_a không thay đổi) Bước 3: Kết cuối giá trị max_so_far 10 Đoạn có tổng lớn dãy a (7, 3) Trong thuật tốn Kadane, phương pháp chia để trị khơng áp dụng trực tiếp việc tìm đoạn có tổng lớn Thay vào đó, thuật tốn Kadane sử dụng phương pháp tận dụng tính chất tích lũy đoạn để tìm đoạn có tổng lớn Cụ thể, thuật toán Kadane bước duyệt qua phần tử dãy, tính tổng lũy kế (max_ending_here) đoạn kết thúc phần tử so sánh với tổng lớn biết (max_so_far) Nếu tổng lũy kế lớn tổng lớn biết, tổng lớn cập nhật Nếu tổng lũy kế âm 0, tổng lũy kế thiết lập bắt đầu tính tổng từ phần tử Phương pháp chia để trị khơng áp dụng trực tiếp thuật tốn Kadane, mà thuật tốn Kadane tận dụng tính chất tích lũy đoạn để tìm tổng lớn Câu 6: Cho dãy a = (2, -15, 6, 2, -9, -4, 7, 3, -5, 2), trình bày bước tìm đoạn có tổng nhỏ dãy a thuật toán chia để trị Cho biết phương pháp chia để trị áp dụng cho thuật toán điểm nào? Chia dãy thành hai phần nhau: Chọn số trung điểm mid = (low + high) / 2, với low số bắt đầu high số kết thúc dãy cần xét Gọi đệ quy để tìm đoạn có tổng nhỏ dãy bên trái, từ low đến mid: findMinSubarray(arr, low, mid) Gọi đệ quy để tìm đoạn có tổng nhỏ dãy bên phải, từ mid+1 đến high: findMinSubarray(arr, mid+1, high) Tìm đoạn có tổng nhỏ chứa điểm trung điểm: Tính tổng từ mid đến low (từ trái sang phải) gán cho sumLeft Tính tổng từ mid+1 đến high (từ phải sang trái) gán cho sumRight Tìm tổng nhỏ đoạn con: So sánh sumLeft sumRight, chọn tổng nhỏ So sánh tổng nhỏ vừa tìm với tổng nhỏ đoạn bên trái đoạn bên phải tìm bước Trả tổng nhỏ đoạn Câu 7: Trình bày thuật tốn tìm nhị phân dùng để tìm phần tử mảng xếp Cho biết phương pháp Chia để trị áp dụng cho thuật toán điểm nào? Dưới trình bày thuật tốn tìm kiếm nhị phân phương pháp chia để trị áp dụng cho thuật toán này: Khởi tạo biến low = (chỉ số đầu mảng) high = n - (chỉ số cuối mảng), với n kích thước mảng Lặp lại low right_max, trả left_max số lớn Ngược lại, trả right_max số lớn Thuật tốn sử dụng tính chất đệ quy Chia để trị để chia nhỏ toán thành tốn nhỏ sau kết hợp kết từ toán để đưa kết cuối Trong trường hợp này, chia mảng ban đầu thành mảng nhỏ hơn, tìm số lớn mảng sau so sánh kết để tìm số lớn toàn mảng Câu 9: Cho trước dãy số nguyên a có n phần tử phần tử có giá trị x, mơ tả thuật toán chia để trị để đếm số lần phần tử x xuất dãy a (có thể x khơng xuất dãy a) Hãy mơ tả thuật tốn chia để trị để tính số lần xuất phần tử x = dãy số a = 2, 15, 6, 2, 9, 4, 7, 3, 5, Cách làm :

Ngày đăng: 23/06/2023, 17:20

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

Tài liệu liên quan