Sinh viên PHẢI nộp lại đề thi MSSV Họ tên Trang 1/4 ĐẠI HỌC BÁCH KHOA TP HCM KIỂM TRA GIỮA KỲ Khoa Khoa học & Kỹ thuật Máy tính Cấu trúc dữ liệu & Giải thuật (2012 2013) Mã đề thi 0001 Thời gian làm b[.]
Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: ĐẠI HỌC BÁCH KHOA TP.HCM Khoa Khoa học & Kỹ thuật Máy tính KIỂM TRA GIỮA KỲ Cấu trúc liệu & Giải thuật (2012 - 2013) Mã đề thi: 0001 Thời gian làm bài: 75 phút Sinh viên ĐƢỢC sử dụng tài liệu, nhƣng KHÔNG ĐƢỢC sử dụng Máy tính xách tay Hướng dẫn làm bài: Sinh viên phải điền mã số họ tên vào tờ đề thi Phần I: TRẮC NGHIỆM Sinh viên làm đề thi cách khoanh tròn câu trả lời Phần II: ĐIỀN CHỖ TRỐNG Sinh viên làm đề thi Phần III: VIẾT CHƢƠNG TRÌNH Sinh viên làm giấy thi PHẦN I: TRẮC NGHIỆM (3.0 điểm) Để trọn số điểm phần này, sinh viên lớp thường cần trả lời câu; sinh viên lớp KSTN cần trả lời câu 1) Giả sử dùng mảng A[m] để thực hàng đợi vịng (circular queue), vị trí đầu cuối xác định front rear, số lượng phần tử có hàng đợi A.(rear-front+m)%m B.rear-front C.(front-rear+m)%m D.(rear-front)%m 2) Giá trị lời gọi hàm recur(2) bao nhiêu? int recur (int n){ if (n==0) return 0; else return recur(n-1) + n*n*n; } A B C D Các lựa chọn khác sai 3) Trong danh sách liên kết kép, giả sử p trỏ vào nút danh sách, thao tác chèn nút q trước nút p A pprevious = q; qnext = p; ppreviousnext=q; qprevious=q; ppreviousnext=q; qnext=p; qprevious=pprevious; C qnext=p; qprevious=pprevious; ppreviousnext=q; pprevious=q; D qprevious=pprevious; qnext=q; pprevious=q; pprevious=q; B pprevious=q; 4) Trường hợp xấu (worst case) việc tìm kiếm mảng xảy A Phần tử tìm kiếm nằm khoảng mảng B Phần tử tìm kiếm khơng nằm mảng C Phần tử tìm kiếm nằm cuối mảng D Cả B C 5) Nhận định sau KHƠNG ĐÚNG đệ quy vơ hạn A Đệ quy vơ hạn khiến cho chƣơng trình bị treo B Đệ quy vơ hạn tiêu tốn tồn bộ nhớ hệ thống dành cho chƣơng trình khiến cho chƣơng trình kết thúc cách bất thƣờng C Gọi đệ quy gián tiếp gây đệ quy vô hạn D Nếu lời gọi đệ quy không đến điểm dừng (base case) đệ quy vơ hạn xuất 6) Tìm độ phức tạp giải thuật sau: for(int i = 1; i < n; i++) for(int j = n; j > i; j ) for(int k = 1; k < n; k *= 2) //something that has O(1) A O(n log n ) B O(n log n ) C O(n ) D O(n ) 7) Đưa n giá trị theo thứ tự a1, a2, a3, …, an vào ngăn xếp, sau lấy n giá trị khỏi ngăn xếp Nếu phần tử Trang 1/4 Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: lấy khỏi ngăn xếp an, phần tử thứ i (1 ≤ i ≤ n) lấy khỏi ngăn xếp A Không xác định B.an-i+1 C D an-i 8) Đối với hàng đợi, việc thêm lấy liệu tuân thủ nguyên tắc A Vào trƣớc trƣớc B Vào sau trƣớc C Vào trƣớc sau D Khơng có trình tự 9) Tìm độ phức tạp giải thuật sau: i=s=0; while(snext _ ; p->next->previous = _; 4) Trong danh sách liên tục có n phần tử, việc xóa phần tử thứ i (0≤ i ≤ n-1) cần phải di chuyển _ phần tử 5) Biểu thức a*(b + c) – d biểu diễn dƣới dạng hậu tố _ 6) Xét danh sách liên tục có thứ tự gồm n phần tử Độ phức tạp giải thuật tìm kiếm _, Độ phức tạp giải thuật tìm kiếm nhị phân _ 7) Cho đoạn mã sau, giả sử thời gian thực câu lệnh A (Statement A) lớn nhiều so với câu lệnh lại i = n; while (i >= n){ j = 1; Trang 2/4 Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: while (j 0) ? x*f(x-1): 2); } Giá trị f(f(1)) = 10) Chức hàm đệ quy sau tính float foo(float x, int n){ if(n == 0) return 1; else return x*foo(x, n-1); } PHẦN III: VIẾT CHƯƠNG TRÌNH (4 điểm) Câu 1: (2 điểm) Hiện thực hàm convert sau nhằm chuyển đổi số hệ thập phân sang số hệ bát phân void convert(int num, char*& oct){ //Phần thực sinh viên } Lưu ý: - num số nguyên dƣơng; - oct chuỗi ký tự tập số hệ bát phân {'0', '1', '2', '3', '4', '5', '6', '7'} Ký tự kết thúc chuỗi '\0', sinh viên phải tự chèn vào trƣớc trả Giả sử nhớ đƣợc tham khảo oct đủ lớn đƣợc cấp phát trƣớc gọi hàm - Sinh viên đƣợc khai báo thêm stack trung gian biến thuộc kiểu khác cần Tuy nhiên, sinh viên không đƣợc khai báo thêm biến phụ khác thuộc kiểu danh sách - class Stack đƣợc thực sẵn, sinh viên dùng; ý nghĩa phƣơng thức stack đƣợc định nghĩa phần lý thuyết class stack { private: int data[]; public: bool pop(int &n); bool push(int n); bool top(); bool isFull(); bool isEmpty(); bool size(); }; Trang 3/4 Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: Sinh viên lớp thường làm Câu 2.A, cịn sinh viên lớp "Tài năng" làm Câu 2.B sau Câu 2.A (2 điểm): lớp Thường Nút danh sách liên kết đƣợc định nghĩa nhƣ sau: struct node { int data; node *next; }; Hãy viết hàm RedundantProcessing nhƣ sau để xử lý liệu trùng lặp danh sách liên kết; tức trƣờng hợp có hai nhiều nút có giá trị liệu giống nhau, giữ lại nút đầu tiên, nút lại đƣợc đƣa cuối danh sách Hàm RedundantProcessing trả số nguyên cho biết số phần tử bị trùng bị đƣa cuối danh sách: int RedundantProcessing (node*& head){ //Phần thực sinh viên } Ví dụ: Giả sử có danh sách A nhƣ sau: A: 10 15 10 20 15 13 Sau gọi hàm RedundantProcessing,danh sách A trở thành nhƣ sau hàm trả A: 10 15 20 13 10 15 Câu 2.B (2 điểm): lớp Tài Nút danh sách liên kết đƣợc định nghĩa nhƣ sau: struct node { int data; node *next; }; Hãy viết hàm mergeList để trộn danh sách liên kết có thứ tự trả danh sách có thứ tự Giả thiết thứ tự không giảm Lưu ý: Sinh viên KHÔNG đƣợc sử dụng tác vụ để tạo node (nghĩa là: new node()) hàm mergeList Sinh viên thay đổi trỏ để tạo danh sách kết Hàm mergeList đƣợc cho nhƣ sau head1 head2 trỏ đến danh sách đầu vào; head3 trỏ đến danh sách trả Hàm mergeList trả số phần tử danh sách head3 int mergeList(node* head1, node* head2, node*& head3){ //Phần thực sinh viên } Ví dụ: Giả sử có danh sách nhƣ sau: head1 11 head2 15 13 Sau trộn, danh sách kết là: head3 8 11 13 15 HẾT - Trang 4/4 ...Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: lấy khỏi ngăn xếp an, phần tử thứ i (1 ≤ i ≤ n) lấy khỏi ngăn... A) lớn nhiều so với câu lệnh lại i = n; while (i >= n){ j = 1; Trang 2/4 Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: while (j