1. Trang chủ
  2. » Công Nghệ Thông Tin

Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật

36 23 0

Đ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

Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật Tổng hợp đề thi kiểm tra môn cấu trúc dữ liệu và giải thuật

Đạ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 ĐỀ KIỂM TRA GIỮA HỌC KỲ Năm học: 2010 – 2011 Môn: Cấu trúc liệu & Giải thuật MSMH: 503001 Ngày thi: 31/10/2010 - Thời gian: 60 phút (Được sử dụng tài liệu) Lưu ý: Đề kiểm tra gồm câu với thang điểm 11/10 Sinh viên làm 10 điểm làm tròn thành 10 Câu 1: (2.5 điểm) a (1.5 điểm) Hãy cho biết độ phức tạp hàm sau (theo Big-O Notation) trường hợp xấu (chỉ ghi kết quả, khơng cần giải thích) void ExA(int n) { int a; for (int i = 0; i < n; i += 2) a = i; } void ExB(int n) { int a; for (int i = 0; i < n * n; i++) a = i; } void ExC(int n) { int a; for (int i = 0; i < n; i++) for (int j = 0; j next; pCur -> next = pNew; } count++; } } b Đệ quy void List::add(int data, int index) { if(index > && index < count) { if(index == 1) { Node *pNew = new Node(); pNew -> data = data; pNew -> next = pHead; pHead = pNew; } else addRec(data, index, 2, pHead); count++; } } void List::addRec(int data, int index, int position, Node* pCur) { if(position == index) { Node *pNew = new Node(); pNew -> data = data; pNew -> next = pCur -> next; pCur -> next = pNew; } else addRec(data, index, position + 1, pCur -> next); } Câu 3: (3 điểm) Giả sử có cấu trúc liệu stack thực với hàm sau: boolean isEmpty(stack s) // kiểm tra xem s có rỗng hay khơng int peek(stack s) // trả giá trị đỉnh s void push(int x, stack s) // đẩy x vào s int pop(stack s) // lấy phần tử khỏi s trả giá trị phần tử Hãy thực hàm sau: sort(stack s1, stack s2) Trong s1 dùng liệu nhập, s2 dùng liệu xuất Sau sort thực thi, s2 chứa phần tử s1 xếp từ nhỏ đến lớn (khi thao tác peek(s2) trả phần tử lớn s2) Sinh viên lớp thường khai báo biến tạm tuỳ ý thực hàm sort, sinh viên lớp KSTN phép khai báo thêm biến tạm thuộc kiểu stack Giải: void sort(stack s1, stack s2) { stack stmp; while(!isEmpty(s1)) { push(pop(s1), s2); while(!isEmpty(s1)) { if(peek(s1) < peek(s2)) { push(pop(s2), stmp); push(pop(s1), s2); } else push(pop(s1), stmp); } while(!isEmpty(stmp)) push(pop(stmp), s1); } } Câu 4: (1.5 điểm) a (1 điểm) Cho danh sách số nguyên sau: {60, 71, 1, 19, 59, 17, 4, 13, 72, 91, 67, 21, 33} Giả sử số nguyên chèn vào nhị phân tìm kiếm (Binary Search Tree – BST) rỗng theo thứ tự danh sách Hãy vẽ nhị phân tìm kiếm sau số nguyên danh sách chèn xong b (0.5 điểm) Vẽ lại nhị phân tìm kiếm sau xóa node 60 từ nhị phân câu a Giải: a 60 71 19 17 67 72 59 91 21 13 33 b 67 71 19 17 72 59 91 21 13 33 Sinh viên dùng node 59 để thay Hết -5 Đạ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 ĐỀ KIỂM TRA GIỮA 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: 23/10/2011 - Thời gian: 70 phút (Được sử dụng tài liệu) Lưu ý: Đề kiểm tra gồm câu với thang điểm 11/10 Sinh viên làm 10 điểm làm tròn thành 10 Câu 1: (2 điểm) Cho danh sách số nguyên a gồm n phần tử Hãy viết hàm func(int* a, int n) có độ phức tạp (theo Big-O Notation) sau: a) trường hợp xấu O(n2), trường hợp tốt O(n); b) trường hợp xấu O(n log n), trường hợp tốt O(n) Gợi ý: chia thành nhiều trường hợp để giải với độ phức tạp khác nhau, xét trường hợp n chẵn n lẻ Câu 2: (4 điểm) Cho cấu trúc danh sách liên kết vịng đơi mơ tả Hình count=1 pHead count=N pHead 1 … N //just an entry in the list, a “struct++” in fact class Node { public: int data; Node* next, back; }; //interface part class List { private: int count; Node* pHead; public: List(); void add(int data, int index); Node* remove(int index); void display(); ~List(); }; Hình Đặc tả cấu trúc danh sách liên kết vịng đơi Method remove thực tác vụ sau: a) rút phần tử vị trí thứ index khỏi danh sách liên kết vịng đơi (giả sử phần tử bắt đầu danh sách có số tham khảo pHead), 1/2 b) pHead cập nhật lại cách tham khảo đến phần tử đứng sau, liền kề với phần tử xóa, c) remove trả tham khảo phần tử vừa rút khỏi danh sách (lưu ý tính an tồn danh sách: cần phải gán tham khảo next/back phần tử NULL) Ví dụ : Giả sử danh sách list (1,2,3,4,5) Sau gọi list.remove(2) list trở thành (3,4,5,1) Nếu gọi tiếp list.remove(6) list trở thành (5,1,3) Hãy thực method remove theo hai cách: (i) không đệ quy (ii) đệ quy Câu 3: (2 điểm) Xét trò chơi Josephus sau: N cá nhân hình thành vịng trịn số nguyên m Trò chơi bước loại bỏ người thứ m vòng tròn lặp lại khơng cịn người vịng trịn Ví dụ, "N = 9, m = 4", danh sách ban đầu gồm số theo thứ tự : 1,2, 3,4,5,6,7,8, Thứ tự loại bỏ theo trò chơi Josephus là: 4,8,3,9,6,5,7,2,1 Để thực toán này, giả sử danh sách ban đầu lưu trữ danh sách liên kết vịng đơi (được thực class List hình 1) Do vậy, hàm method remove câu Giả sử có cấu trúc liệu stack queue thực với hàm sau: boolean isEmpty(stack s) // kiểm tra xem s có rỗng hay khơng Node* top(stack s) // trả tham khảo phần tử đỉnh s void push(Node* x, stack s) // đẩy phần tử x vào s Node* pop(stack s) // lấy phần tử khỏi s trả tham khảo phần tử boolean isEmpty(queue q) // kiểm tra xem q có rỗng hay khơng Node* queueFront(queue q) // trả tham khảo phần tử đầu q Node* queueRear(queue q) // trả tham khảo phần tử cuối q void enQueue(Node* x, queue q) // thêm phần tử x vào cuối hàng đợi q Node* deQueue(queue q) // lấy phần tử khỏi q trả tham khảo đến phần tử a) Theo bạn nên chọn cấu trúc liệu queue hay stack để nhằm phục vụ cho ngõ toán : lưu trữ danh sách cá nhân theo thứ tự loại bỏ trò chơi Tại sao? b) Viết thuật giải để giải toán với cấu trúc liệu mà bạn chọn câu (a) Josephus(List l, queue q, int m) hay Josephus(List l, stack s, int m) Câu 4: (2 điểm) Giả sử dùng queue để lưu trữ kết toán Josephus Hãy viết thuật giải để khôi phục lại danh sách phần tử theo thứ tự ban đầu (nghĩa theo thứ tự tăng dần giá trị data) void restore(queue q) // danh sách trả lưu trữ q Sinh viên lớp thường khai báo biến tạm tuỳ ý thực hàm này, sinh viên lớp KSTN phép khai báo thêm biến tạm thuộc kiểu Node* biến tạm khác phải thuộc kiểu queue Câu 5: (1 điểm) Hãy so sánh hai loại cấu trúc: liên kết đơn vịng mảng vịng (circular array) (Ví dụ: độ phức tạp trường hợp xấu việc thêm/xóa phần tử, …) Sinh viên lớp thường cần nêu giải thích (ưu/khuyết) điểm, sinh viên lớp KSTN cần nêu giải thích (ưu/khuyết) điểm – Hết – 2/2 Câu (1.5 điểm): Trình bày binary_search_1 (val target , ref position ) bước q trình tìm kiếm khóa 31 bottom = top = size of the list-1 loop (bottom < top) mid = (bottom + top)/2 if (target > datamid) bottom = mid + else top = mid end if end loop if (top < bottom) return notFound else position = bottom if (target = dataposition) return found else return notFound end if end if end binary_search_1 dùng phương pháp tìm kiếm nhị phân binary_search_1 (trình bày hình bên) danh sách liên kết đơn có thứ tự sau: {1, 12, 31, 35, 63, 98 } Có lần so sánh khóa? Câu (1 điểm): Cho nhị phân hình vẽ, cho biết kết thực thi giải thuật sau giải thuật gọi từ phần tử gốc (nút có giá trị 12) algorithm XYZ (val subroot ) if (subroot is not null) print "" XYZ (subroot->left) XYZ(subroot->right) 2.end if end XYZ 12 10 13 22 Câu (2 điểm – Dành cho lớp KSTN): Danh sách liên kết đơn vịng (xem đặc tả hình bên cạnh) quản lý sau: - Con trỏ current đến phần tử 21 17 Node data link end Node - Nếu danh sách rỗng, current NULL Ngược lại, trỏ link phần tử cuối vào phần tử Viết phương thức pseudocode để đếm số phần tử danh sách Circular Linked List current end Circular Linked List Lưu ý, không dùng thêm phương phức hàm phụ trợ (kể tự viết lại) ĐÁP ÁN Trường ĐH Bách Khoa Tp.HCM Khoa KH&KT Máy tính Đề thi kỳ HK1/2009 Môn: Cấu trúc liệu Giải thuật Thời gian: 60 phút (Không sử dụng tài liệu) Ghi chú: đề thi gồm tất câu Sinh viên lớp KSTN làm hết câu, thang điểm 12/12 Sinh viên lớp thường làm câu (từ câu đến câu 6), thang diểm 10/10 Câu (1.5 điểm): Tính tốn big-O hàm xếp chúng theo thứ tự từ nhỏ đến lớn theo big-O: Đáp áp: a) (1 điểm) Tính big-O n n a = O(2 ) b n! = O(n!) c n3.5 = O(n3.5) d n + n2 + n3 = O(n3) e 105 = O(1) f 150,000 = O(1) g nlog2(n) = O(nlog2(n)) b) (0.5 điểm) Sắp xếp theo big-O: 105 data == x) or (tmp->data == x+1) or (tmp->data == x+2)) if (pre is null) //delete first head = head->link delete tmp tmp = head else //delete the element after pre pre->next = tmp->link delete tmp tmp = pre->link end if else pre = tmp tmp = tmp->link end if end loop end remove_in_range Câu (2 điểm): Viết hàm toàn cục (global function) pseudocode nhận vào queue đảo ngược queue Giả sử phương thức queue stack cho Stack ADT Create() Push (val DataIn ) //Thêm phần tử vào đỉnh stack Pop () //Bỏ phần tử đỉnh stack Top (ref DataOut ) //Xem phần tử đỉnh stack isEmpty () Queue ADT Create() EnQueue (val DataIn ) //Thêm phần tử vào cuối queue DeQueue () //Bỏ phần tử đầu queue QueueFront (ref DataOut ) //Xem phần tử đầu queue QueueRear (ref DataOut ) //Xem phần tử cuối queue isEmpty () theo đặc tả hình bên cạnh Chú ý: khơng viết dùng thêm hàm phụ trợ khác Đáp áp: algorithm reverse_queue (ref queue ) Post phần tử queue bị đảo ngược vị trí stack = Create a stack loop (not queue.isEmpty()) queue.QueueFront (x) stack.Push (x) queue.DeQueue() end loop loop (not stack.isEmpty()) stack.Top (x) queue.EnQueue (x) stack.Pop() end loop end reverse_queue Câu (1.5 điểm): Hãy trình bày bước trình tạo nhị phân tìm kiếm (BST) cách thêm vào rỗng ban đầu khóa sau: F,O,R,G,E,T biết giá trị so sánh khóa thứ tự chúng bảng chữ Đáp áp: F F F F O F O O R G E R F O G E O R G R T Câu (1.5 điểm): Trình bày bước trình tìm kiếm khóa 31 dùng phương pháp tìm kiếm nhị phân binary_search_1 (forgetful version) danh sách liên kết (DSLK) đơn có thứ tự sau: {1, 12, 31, 35, 63, 98 } Có lần so sánh khóa? Đáp áp: binary_search_1 (val target , ref position ) bottom = top = size of the list loop (bottom < top) mid = (bottom + top)/2 if (target > datamid) bottom = mid + else top = mid end if end loop if (top < bottom) return notFound else position = bottom if (target = dataposition) return found else return notFound end if end if end binary_search_1 + bottom = 0, top = bottom < top: true idx data 12 31 35 63 98 mid = (0+5)/2 = target=31 > data2 = 31 : false => top = mid = lần so sánh + bottom = 0, top = bottom < top: true mid = (0+2)/2 = target=31 > data1 = 12: true => bottom = =mid+1 = + bottom = 2, top = lần so sánh bottom < top: false lần so sánh + target=31 = data2: true => found Vậy có tổng cộng lần so sánh Câu (1 điểm): Cho nhị phân hình vẽ, cho biết kết thực thi giải thuật sau giải thuật gọi từ phần tử gốc (nút có giá trị 12) algorithm XYZ (val subroot ) if (subroot is not null) print "" XYZ (subroot->left) XYZ(subroot->right) 2.end if end XYZ 12 10 13 22 21 17 Đáp áp: < 22> Câu (2 điểm – Dành cho lớp KSTN): Danh sách liên kết đơn vòng (xem đặc tả hình bên cạnh) quản lý sau: - Con trỏ current đến phần tử - Nếu danh sách rỗng, current NULL Ngược lại, trỏ link phần tử cuối vào phần tử Viết phương thức pseudocode để đếm số phần tử danh sách Node data link end Node Circular Linked List current end Circular Linked List Lưu ý, không dùng thêm phương phức hàm phụ trợ (kể tự viết lại) Đáp áp: algorithm circular_list_size () Pre Danh sách liên kết đơn vòng Post Số phần tử đếm Return Số phần tử danh sách if (current is null) return else size=1 tmp = current loop (tmp->link != current) size++ tmp = tmp->link end loop end if return size end circular_list_size 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 pprevious = q; qnext = p; ppreviousnext=q; qprevious=q; ppreviousnext=q; qnext=p; qprevious=pprevious; C qnext=p; qprevious=pprevious; ppreviousnext=q; pprevious=q; D qprevious=pprevious; qnext=q; pprevious=q; pprevious=q; B pprevious=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: ĐẠ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 pprevious = q; qnext = p; ppreviousnext=q; qprevious=q; ppreviousnext=q; qnext=p; qprevious=pprevious; C qnext=p; qprevious=pprevious; ppreviousnext=q; pprevious=q; D qprevious=pprevious; qnext=q; pprevious=q; pprevious=q; B pprevious=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 toà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/6 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 = p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 _n-i-1 phần tử 5) Biểu thức a*(b + c) – d biểu diễn dƣới dạng hậu tố a b c + * d - _ 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 _O(n) , Độ phức tạp giải thuật tìm kiếm nhị phân _O(logn) 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/6 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)) = f(1*f(0)) = f(f(0)) = f(2) = 2*f(1) = 2*1*f(0) = 2*1*2 = 10) Chức hàm đệ quy sau tính xn 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/6 Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: Solution: void convert(int num, char* &oct) { int temp; stack s = new stack(); char* ss = new char(); while(true) { temp = num%8; s.push(temp); num = num/8; if(num==0) { break; } } while(! s.isEmpty()) { s.pop(temp); sprintf(ss,"%d",temp); strcat(oct,ss); } strcat(oct,”\0”); } 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 Solution: int RedundantProcessing(node* &head){ int count; int data; node* temp1, temp2, preTemp2, redundant, tempRedun; if(head == NULL || head->next = NULL) return 0; temp1=head; while(temp1->next != NULL){ data = temp1->data; Trang 4/6 Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: temp2=temp1->next; preTemp2 = temp1; while(temp2!= NULL){ if(temp2->data == data){ count++; if(count == 1){ redundant = temp2; tempRedun = redundant; } else{ tempRedun->next = temp2; } preTemp2->next = temp2->next; temp2 = temp2->next; tempRudun->next = NULL; } else{ preTemp2 = temp2; temp2 = temp2->next; } } temp1=temp1->next; } temp1->next = redundant; return count; } 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 Trang 5/6 Sinh viên PHẢI nộp lại đề thi MSSV: Họ tên: Solution: int mergeList(node* head1, node* head2, node*& head3){ node* temp; if(head1 == NULL){ head3 = head2; return 0; } if(head2 == NULL){ head3 = head1; return 0; } if(head1->data >= head2->data){ head3 = head1; head1 = head1->next; } else{ head3 = head2; head2 = head2->next; } temp = head3; while(head1 != NULL && head2 != NULL){ if(head1->data >= head2->data){ temp->next = head1; head1=head1->next; } else{ temp->next = head2; head2 = head2->next; } temp = temp->next; } if(head1 == NULL && head2 != NULL){ temp->next = head2; } else if(head2 == NULL && head1 != NULL){ temp->next = head1; } return 0; } HẾT - Trang 6/6 ... học Máy tính ĐỀ KIỂM TRA GIỮA 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: 23/10/2011 - Thời gian: 70 phút (Được sử dụng tài liệu) Lưu ý: Đề kiểm tra gồm câu... 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... - Trang 4/4 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ã đề

Ngày đăng: 27/02/2022, 15:45

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w