1 Đại học Quốc Gia TP Hồ Chí Minh Trường đại học Bách Khoa Khoa Khoa học & Kỹ thuật Máy tính Bộ môn Khoa học Máy tính ĐỀ THI CUỐI HỌC KỲ 1 Năm học 2011 – 2012 Môn Cấu trúc dữ liệu & Giải thuật MSMH 50[.]
Đại học Quốc Gia TP Hồ Chí Minh Trường đại học Bách Khoa Khoa: Khoa học & Kỹ thuật Máy tính Bộ mơn: Khoa học Máy tính ĐỀ THI CUỐI HỌC KỲ Năm học: 2011 – 2012 Môn: Cấu trúc liệu & Giải thuật MSMH: 503001 Ngày thi: 07/01/2012 - Thời gian: 120 phút (Được sử dụng tài liệu) Lưu ý: Đề thi gồm câu với thang điểm 11/10 Câu 1: (1.5 điểm) Cho dãy gồm 11 số sau: 6, 12, 4, 19, 22, 3, 2, 15, 13, 17, 30 a (1 điểm) Cây AVL xây dựng dựa chuỗi số này, giả sử số nhập vào xây dựng theo thứ tự Hãy vẽ AVL trạng thái chèn (insert) thành công phần tử: 22, 2, 13, 17 30 +22 +2 6 19 12 22 +13 19 13 12 22 15 15 13 12 15 13 19 17 12 22 30 19 17 +30 22 12 +17 19 22 b (0.5 điểm) Giả sử AVL xây dựng câu a bị xóa phần tử sau: 17, 13, 22, 19 Vẽ lại AVL sau phần tử bị xóa khỏi -17 -13 15 15 22 13 19 30 12 12 22 19 30 Trường hợp “using largest node in the left-subtree”: -22 -19 15 3 19 12 30 15 30 12 Trường hợp “using smallest node in the right-subtree” -22 -19 15 12 30 19 4 Câu 2: (2.5 điểm) Ta ký hiệu L(H) dạng trình bày max-heap H dạng dãy 15 12 30 Ví dụ: Một dãy số ban đầu sau: (1, 2, 3), sau xây dựng thành heap HT, L(HT) = (3, 1, 2) a (1 điểm) Với dãy số ban đầu gồm 11 số sau: (6, 12, 4, 19, 22, 3, 2, 15, 13, 17, 30), ta xây dựng thành heap H1 Giả sử số đưa vào H1 theo thứ tự Cho biết L(H1) Solution: L(H) = (30,22,4,15,19,3,2,6,13,12,17) b (0.5 điểm) Sau loại bỏ phần tử khỏi H1, ta H2 Cho biết L(H2) Solution: L(H_2) = (17,15,4,13,12,3,2,6) c (1 điểm) Cho cấu trúc liệu heap với phương thức sẵn có hình Hiện thực thêm phương thức convert2MaxHeap để chuyển đổi heap từ min-heap thành max-heap Lưu ý : Do số lượng phần tử n heap lớn, giải thuật xếp không khai báo thêm biến phụ có dung lượng lưu trữ tương đương với n (ví dụ khai báo dãy tạm có độ lớn n/10 n/10 n tương đương) Class heap Private: data: array count: int protected: reMaxHeapUp(position) reMaxHeapDown(position, lastPosition) reMinHeapUp(position) reMinHeapDown(position, lastPosition) Public: insertMaxHeap(element) insertMinHeap(element) deleteMaxHeap() deleteMinHeap() End class Hình 1: Cấu trúc liệu heap Solution: void convert2MaxHeap() { for(int position=count/2-1; position>=0; position ){ reMaxHeapDown(position, count-1); } } Câu 3: (2 điểm) Xét dãy số: 6, 12, 4, 19, 22, 3, 2, 15, 13, 17, 30 Dành cho lớp thường (không cần làm câu b câu c): a (2 điểm) Vẽ bảng biểu diễn bước thực thi dựa theo thuật toán sau: straight selection sort, bubble sort merge sort (Sinh viên xem ví dụ bảng biểu diễn bước thực thi hình 2) 6 4 2 2 12 12 6 3 3 4 12 12 12 4 4 19 19 19 19 19 12 6 6 22 22 22 22 22 19 12 12 12 12 12 3 3 22 19 15 13 13 13 2 2 2 22 19 15 15 15 15 15 15 15 15 15 15 22 19 17 17 13 13 13 13 13 13 13 13 22 19 19 17 17 17 17 17 17 17 17 17 22 22 30 30 30 30 30 30 30 30 30 30 30 Hình Bảng liệt kê bước thực thi giải thuật Straight Insertion Sort Solution: Straight selection sort: 12 19 22 15 13 17 30 12 19 22 15 13 17 30 19 22 12 15 13 17 30 19 22 12 15 13 17 30 22 12 19 15 13 17 30 12 22 19 15 13 17 30 12 13 19 15 22 17 30 12 13 15 19 22 17 30 12 13 15 17 19 22 30 12 13 15 17 19 22 30 12 13 15 17 19 22 30 Bubble sort: 12 19 12 12 6 6 6 6 22 19 12 12 12 12 12 12 12 12 22 19 13 13 13 13 13 13 13 13 22 19 15 15 15 15 15 15 15 15 13 13 22 17 17 17 17 17 17 17 13 15 15 15 19 19 19 19 19 19 19 17 17 17 17 22 22 22 22 22 22 22 30 30 30 30 30 30 30 30 30 30 30 Merge sort: 12 4 12 6 22 22 19 19 19 3 22 22 22 2 2 15 15 15 13 13 13 13 13 15 15 17 17 17 17 17 30 30 30 30 30 19 19 12 12 12 4 12 13 15 17 19 22 30 Dành cho lớp KSTN (không cần làm câu a): b (1 điểm) Vẽ bảng biểu diễn bước thực thi dựa theo hai thuật giải liệt kê câu a để thực việc xếp c (1 điểm) Dựa thuật giải quicksort trình bày slide lý thuyết môn học, viết thuật giải để trả phần tử lớn thứ k danh sách n phần tử phân biệt (được lưu trữ mảng cho trước) Độ phức tạp trường hợp xấu có phải O(n log n) ? Nếu không, đề xuất giải pháp cải tiến để có độ phức tạp Solution: Algorithm FindKth(k) If(k > count) return ; recursiveFindKth(0,count-1,k) End FindKth Algorithm recursiveFindKth(int lowIndex, int highIndex, int k) if(lowIndex >= highIndex) return lowIndex ; // Divide data into parts and return index of pivot pivot_position= Partition(lowIndex, highIndex) if(pivot_position == k-1) return data[pivot_position] ; // Pivot is the kth maximum value if(pivot_position > k-1) // just run recursive on the first division return recursiveFindKth (lowIndex, pivot_position-1,k) else return recursiveFindKth (pivot_position+1, highIndex,k) End recursiveFindKth Trong trường hợp xấu : k = n phần từ pivot chọn phần tử cực đại cực tiểu partition Khi trường hợp xấu giải thuật Quicksort 0(n^2), 0(nlogn) Cải tiến : Giải thuật Quicksort slide giảng chọn giá trị pivot vị trí dãy liệu Trong trường hợp xấu nhất, phần tử pivot có giá trị cực đại cực tiểu bên dãy liệu giải thuật Quicksort phải thực xấp xỉ n lần hàm Partition Trong chi phí lần gọi Partition để phân tách liệu xấp xỉ n Do độ phức tạp O(n^2) Để cải tiến ta phải cố gắng giảm số lần thực thi hàm Partition => chọn phần tử pivot có giá trị để đạt xấp xỉ logn lần gọi Partition => Thêm vào bên hàm Partition giải thuật Quicksort phần tiền xử lý, xác định phần tử chọn pivot phần tử có giá trị gần với giá trị trung bình giá trị có danh sách Int findPivotPosition(int low, int high) { int sum =0 ; int count = high – low + ; fore(i from low to hight) { sum+=data ; } Int position = low; For(i from low to high) { if(|data * count – sum| > |data * count - sum|) { position = i ; } } } int Partition(int low, int high) { // last_smallis the position of the last key less than pivot swap (low, findPivotPosition(low,hight)) // First entry is now pivot pivot = entrylow last_small= low i= low+ loop(i