Câu hỏi và đáp án thi hết môn Cấu trúc dữ liệu và giải thuật

29 57 0
Câu hỏi và đáp án thi hết môn Cấu trúc dữ liệu và giải thuật

Đ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

Phần 1: Giải thuật độ phức tạp tính tốn giải thuật Bài 1: Cho đoạn chương trình sau: int Max(int a[], int n) { int temp,i; temp=a[1]; for(i=2; i temp) temp = a[i]; {2} return temp; } a) Đoạn chương trình thực cơng việc gì? b) Xác định độ phức tạp đoạn chương trình Trả lời: a) Đoạn chương trình thực việc xếp mảng theo phương thức xếp chọn (Selection Sort) b) Xác định độ phức tạp: - Thời gian thực lệnh {2} O(1) - Vòng lặp thực n lần, lần O(1) - Độ phức tạp giải thuật là: T(n) = O(1).O(n) = O(n) Bài 2: a) Viết chương trình thực phép tốn cộng hai ma trận vng cấp n b) Xác định độ phức tạp đoạn chương trình câu a) Trả lời: a) Viết chương trình thực phép tốn cộng hai ma trận vng cấp n #include #include #define max 100 //Nhap ma tran vuong A cap n void NhapMaTran(int A[max][max], int n) { for(int i = 0; iLink; } return dem; } //Xoa nut dau cua danh sach void Delete_Begin(DSLK &pHead){ if(pHead==NULL) printf("Danh sach rong!\n"); else{ DSLK p; p=pHead;//p - nut de xoa pHead=pHead->Link;//Dich chuyen nut dau danh sach delete p;//Xoa nut p } } 8) Xoá phần tử nhỏ danh sách 9) Xoá phần tử đứng trước sau X danh sách (X nhập từ bàn phím) //Xóa nut p la nut bat ky co danh sach void Delete_Middle(DSLK pHead,DSLK p){ if(p==pHead){ //Xoa nut dau ds pHead=pHead->Link; delete p;//Xoa p } else{ //Tim nut q dung truoc nut p DSLK q; q=pHead; while(q->Link!=p) q=q->Link; q->Link=p->Link;//Dieu chinh dia chi cua dung truoc p->Link=NULL; delete p;//Xoa nut p } } 6) Thêm phần tử X vào trước phần tử chẵn (X nhập từ bàn phím) 7) Thêm phần tử X vào sau phần tử lẻ cuối (X nhập từ bàn phím) //Chen nut co du lieu la X vao sau nut p - co danh sach void Insert_Middle(DSLK &pHead,DSLK p,int X){ DSLK q;//Nut moi co truogn du lieu X q=new NODE; q->Data=X; //Chen q vao sau p q->Link=p->Link; p->Link=q; } 4) Tìm phần tử có phần tử nhỏ //Ham xac dinh dia chi cua nut thu k co danh sach DSLK Timnutk(DSLK pHead,int k){ int i; DSLK p; p=pHead;//tro vao nut dau danh sach i=1; while(i!=k && p!=NULL){ p=p->Link;//dich chuyen i++; } return p; } int main(){ DSLK pHead,p; int k; Creat_List(pHead); printf("Danh sach sau nhap:\n"); View_List(pHead); printf("Danh sach co %d nut\n",Demsonut(pHead)); printf("Nhap vao gia tri k="); scanf("%d",&k); p=Timnutk(pHead,k); if(p==NULL) printf("\nKhong co nut thu %d danh sach!\n",k); else{ printf("\nTim duoc nut thu %d danh sach!\n",k); printf("Nut co du lieu =%d",p->Data); } //Xoa nut thu k Delete_Middle(pHead,p); printf("\nDanh sach sau xoa nut thu %d:\n",k); View_List(pHead); //Chen vao vi tri thu k mot nut X int X; printf("Nhap vao vi tri can chen k="); scanf("%d",&k); printf("Nhap vao gia tri can chen="); scanf("%d",&X); p=Timnutk(pHead,k); Insert_Middle(pHead,p,X);//Goi ham chen printf("\nDanh sach sau chen:\n",k); View_List(pHead); } Bài Cho danh sách liên kết L1 L2, gồm phần tử số nguyên, thực yêu cầu sau: a, Sắp xếp L1 L2 tăng dần b, Nối L1 L2 thành L3 cho L3 tăng dần Bài Một danh sách sinh viên tổ chức lưu trữ cấu trúc danh sách liên kết đơn Mỗi sinh viên có thông tin sau: Masv( kieu nguyên), họ tên (kiểu char[30]), điểm toán (dt ; kiểu int), điểm lý (dl ; kiểu int), điểm hóa (dh; kiểu int) điểm trung bình – tính dựa vào trung bình cộng điểm tốn, lý, hóa Viết chương trình thực cơng việc sau: 1, Viết chương trình nhập vào n sinh viên (n nhập từ bàn phím) 2, Đưa hình tất sinh viên thi lại mơn 3, Đưa hình tất sinh viên thi lại mơn 4, Đưa hình tất sinh viên sinh viên giỏi (diem trung binh mơn >=8 khơng có mơn thi lại) 5, Đưa hình tất sinh viên sinh viên (8>diem trung binh môn >=7; khơng có mơn thi lại) 6, Đưa hình tất sinh viên sinh viên trung bình khơng có mơn thi lại) 7, Đưa hình tất sinh viên sinh viên có điểm trung bình cao 8, Đưa hình tất sinh viên sinh viên có điểm trung bình thấp 9, Nhập vào Masv đó, cho phép tìm kiếm theo Masv 10, Xóa bỏ tất sinh viên có điểm trung bình (dtb) =8 Trả lời: 1) Viết chương trình nhập vào n sinh viên (n nhập từ bàn phím) Bài 4: Thực 1-3 danh sách liên kết đôi //Khai bao DSLK doi moi nut luu tru so nguyen #include struct NODE{ int Dl; NODE *Trai; NODE *Phai; }; //Quan ly bang nut dau va nut cuoi typedef struct NODE *DSKEP; //L - dia chi cua nut ben trai nhat(nut dau ds) //R - dia chi cua nut ben phai nhat(nut cuoi ds) //Ham chen dau danh sach void Insert_Begin(DSKEP &L,DSKEP &R,int X){ DSKEP p; p=new NODE; p->Dl=X; p->Trai=NULL; p->Phai=NULL; if(L==NULL && R==NULL)//Ds rong { L=p; R=p; } else{//Ds khong rong, p duoc gan vao dau ds L->Trai=p; p->Phai=L; L=p;//Chinh dia chi nut dau ds } } //Ham chen cuoi danh sach void Insert_End(DSKEP &L,DSKEP &R,int X){ DSKEP p; p=new NODE; p->Dl=X; p->Trai=NULL; p->Phai=NULL; if(L==NULL&&R==NULL)//Ds rong L=R=p; else{//Ds khong rong, p duoc gan vao cuoi ds R->Phai=p; p->Trai=R; R=p;//Chinh dia chi nut cuoi ds } } //Tao danh sach, du lieu nhap vao tu ban phim void Creat_List(DSKEP &L,DSKEP &R){ int X,i=0,tl; L=R=NULL;//Khoi tao danh sach rong do{ printf("Nhap nut thu %d:",++i); scanf("%d",&X); //Insert_Begin(L,R,X); Insert_End(L,R,X); printf("Co tiep tuc khong?(0/1):"); scanf("%d",&tl); }while(tl==1); } void Duyet(DSKEP L,DSKEP R){ DSKEP p; p=L; while(p!=NULL){ printf("%d ",p->Dl); p=p->Phai; } printf("\n"); } //ham dem so nut danh sach int Demsonut(DSKEP L,DSKEP R){ int dem=0; DSKEP p; p=L; while(p!=NULL){ dem++; p=p->Phai;//Dich chuyen p sang nut ke tiep } return dem; } //ham tim nut thu k co danh sach DSKEP Timk(DSKEP L,DSKEP R,int k){ DSKEP p; int i; p=L;i=1; while(p!=NULL && i!=k){ i++;p=p->Phai; } return p; } //Chen vao sau nut thu k mot nut moi co truong du lieu la X void Insert_Middle(DSKEP &L,DSKEP &R, int k,int X){ DSKEP p,q,r; p=Timk(L,R,k);//p- luu dia chi cua nut thu k q=new NODE;//q- la nut moi se chen vao ds q->Dl=X; if(p==NULL) printf("Khong tim thay vi tri nut can chen!"); else{ //Chen q vao sau p r=p->Phai;//r- la nut sau p r->Trai=q; q->Phai=r;//q->Phai=p->Phai p->Phai=q; q->Trai=p; } } //Xoa mot nut o vi tri thu k void Delete(DSKEP &L,DSKEP &R,int k){ DSKEP p,q,r; p=Timk(L,R,k);//Tim dia chi nut can xoa L R * A * * Q XL XLR LR LRA RA A AQ X X XL XLR XLR Đẩy chữ vào queue (ENQUEUE) Đẩy chữ vào queue (ENQUEUE) Lấy chữ hình (DEQUEUE) Đẩy chữ vào queue (ENQUEUE) Lấy chữ hình (DEQUEUE) Lấy chữ hình (DEQUEUE) Đẩy chữ vào queue (ENQUEUE) Kết quả: X L R Kết in hình chuỗi ký tự: X L R Bài 4: Cho biểu thức P dạng trung tố: P = (a+b^2)*c – (d+e) (trong ^ ký hiệu lũy thừa) phép lũy thừa có mức ưu tiên cao nhất) Hãy áp dụng giải thuật POLISH để biến đổi P sang dạng hậu tố Nêu rõ tình trạng Stack dạng hình thành biểu thức hậu tố qua bước thực hiện, kèm theo thuyết minh cần thiết Trả lời: Quy tắc: - Nếu toán hạng: cho output - Nếu dấu ( : cho vào stack - Nếu dấu ) : lấy toán tử stack cho vào output gặp dấu ( Dấu ( đưa khỏi stack - Nếu toán tử: + Chừng đỉnh stack tốn tử tốn tử có độ ưu tiên lớn toán tử lấy tốn tử khỏi stack cho output + Đưa toán tử vào stack - Sau duyệt hết biểu thức, stack cịn phần tử lấy hết output P = (a+b^2)*c - (d+e) Bước Token ( a + b ^ Stack ( ( (+ (+ (+^ (+^ Output ) * c * * ab2^+ ab2^+c 10 - - ab2^+c* 11 12 ( d -( -( ab2^+c* ab2^+c*d a a ab ab ab2 ab2^+ Giải thích Đẩy dấu ( vào stack Đưa toán hạng a xâu Đẩy toán tử + vào stack Đưa toán hạng b xâu Đẩy toán tử ^ vào stack Đưa số xâu - Phần tử đỉnh S ^ có ưu tiên cao dấu + Đưa tốn tử ^ đưa xâu - Đưa toán tử + đưa xâu - Hủy dấu ( Đẩy toán tử * vào stack Đưa toán hạng c xâu - Phần tử đỉnh stack * có ưu tiên cao dấu -, lấy * ghi xâu - Đẩy dấu - vào stack Đẩy dấu ( vào stack Đưa toán hạng d xâu 13 14 + e -(+ -(+ 15 ) - 16 Hết xâu ab2^+c*d ab2^+c*de ab2^+c*de+ ab2^+c*de+- Đẩy toán tử + vào stack Đưa toán hạng e xâu Lấy phần tử đỉnh Stack toán tử + ghi xâu ra, đến gặp dấu ( hủy dấu ( Lấy phần tử từ stack xâu Xâu hậu tố nhận được: P = a b ^ + c * d e + Bài 5: Cho biểu thức hậu tố P = a b ^ + c * d e + Áp dụng giải thuật EVAL để tính giá trị biểu thức hậu tố P theo giá trị biến: a=2, b=5, c=10, d=8, e=12 Trả lời: Quy tắc: - Nếu toán hạng: push vào stack - Nếu toán tử: pop tốn hạng stack tính giá trị chúng dựa vào toán tử Sau push kết lại vào stack - Phần tử cịn sót lại stack sau vịng lặp kết biểu thức Với giá trị biến cho, biểu thức hậu tố P viết lại là: P = ^ + 10 * 12 + Bước Ký tự đọc Stack S ^ 25 + 27 10 27 10 * 270 12 270 270 12 10 + 270 20 11 - 250 12 Hết xâu 2 5 Giải thích toán hạng, đẩy vào S toán hạng, đẩy vào S số, đẩy vào S - Lấy phần tử khỏi S (lấy 2, lấy 5) - Thực phép toán: ^ - Đẩy kết 25 vào S - Lấy phần tử khỏi S (lấy 25, lấy 2) - Thực phép toán: + 25 - Đẩy kết 27 vào S 10 toán hạng, đẩy 10 vào S - Lấy phần tử khỏi S (lấy 10, lấy 27) - Thực phép toán: 27 * 10 - Đẩy kết 270 vào S toán hạng, đẩy vào S 12 toán hạng, đẩy 12 vào S - Lấy phần tử khỏi S (lấy 12, lấy 8) - Thực phép toán: + 12 - Đẩy kết 20 vào S - Lấy phần tử khỏi S (lấy 20, lấy 270) - Thực phép toán: 270 - 20 - Đẩy kết 250 vào S Kết biểu thức hậu tố tính theo giải thuật EVAL 250 Phần (2 điểm) – Cấu trúc Bài 1: Phép duyệt theo thứ tự trước nhị phân tạo ra: A B D C E G F phép duyệt thứ tự tạo ra: D B A E G C F a) Hãy dựng nhị phân nêu phương pháp dựng b) Hãy duyệt nhị phân dựng câu a) theo thứ tự sau Trả lời: a) Dựng nhị phân * Nguyên tắc: + Đối với phép duyệt theo thứ tự trước (NLR: Node Left Right) • Thăm gốc • Thăm nút trái theo thứ tự trước • Thăm nút phải theo thứ tự trước + Đối với phép duyệt theo thứ tự (LNR: Left Node Right) • Thăm nút trái theo thứ tự • Thăm gốc • Thăm nút phải theo thứ tự + Đối với phép duyệt theo thứ tự sau (LRN: Left Right Node) • Thăm nút trái theo thứ tự sau • Thăm nút phải theo thứ tự sau • Thăm gốc - Theo phép duyệt trước, ta xác định gốc A - Theo phép duyệt giữa, ta xác định có nhánh lớn, nhánh bên trái có D, B nhánh bên phải có E, G, C F + Đối với nhánh bên trái, theo phép duyệt trước, ta xác định nút nhánh B nút D + Đối với nhánh bên phải, theo phép duyệt trước, ta xác định nhánh có gốc C, nhánh bên trái nhánh E, G (nút nhánh G nút E) nhánh bên phải nhánh có nút F b) Hãy duyệt nhị phân dựng câu a) theo thứ tự sau (LRN: Left Right Node) • Thăm nút trái theo thứ tự sau • Thăm nút phải theo thứ tự sau • Thăm gốc D BGE FCA Bài 2: a) Phép duyệt theo thứ tự sau nhị phân tạo ra: P S Q N T R O M phép duyệt thứ tự tạo ra: P N S Q M R T O Hãy dựng nhị phân nêu phương pháp dựng b) Hãy duyệt nhị phân dựng câu a) theo thứ tự trước Trả lời: a) Dựng nhị phân - Theo phép duyệt sau, ta xác định gốc M - Theo phép duyệt giữa, ta xác định có nhánh lớn, nhánh bên trái có P, N, S, Q nhánh bên phải có R, T, O + Đối với nhánh bên trái, theo phép duyệt sau, ta xác định nhánh có gốc Q, nhánh bên trái nhánh có nút P nhánh bên phải N, S (nút nhánh N nút S) + Đối với nhánh bên phải, theo phép duyệt giữa, ta xác định nhánh O, R T b) Hãy duyệt nhị phân dựng câu a) theo thứ tự trước (NLR: Node Left Right) MQPNSORT Bài 3: a) Viết khai báo biểu diễn nhị phân phương pháp lưu trữ móc nối, nút lưu trữ số nguyên b) Viết hàm đệ quy đếm số nút nhị phân với khai báo câu a) c) Viết hàm đệ quy đếm số nút nhị phân với khai báo câu a) d) Viết hàm đệ quy tổng giá trị nút có khai báo câu a) e) Viết hàm đệ quy tổng giá trị nút có giá trị dương nhị phân khai báo câu a) f) … Trả lời: a) Viết khai báo biểu diễn nhị phân phương pháp lưu trữ móc nối, nút lưu trữ số nguyên Class BSTNode { int Data; BSTNode pLeft; //con trỏ đến nút trái BSTNode pRight; //con trỏ đến nút phải }; BSTNode root = NULL; //gốc Bài 4: a) Minh họa giải thuật dựng nhị phân tìm kiếm với dãy khóa nhập vào theo thứ tự sau: 18 13 15 12 20 11 30 19 28 14 b) Sau đó, thực thao tác sau dựng câu a) - Thêm vào nút có giá trị 50 - Hủy nút có giá trị 20 thay đổi bước? Vẽ câyminh họa (nêu rõ phương pháp hủy nút có trái phải) Trả lời: a) Minh họa giải thuật dựng nhị phân tìm kiếm Định nghĩa: Cây nhị phân tìm kiếm nhị phân, cho - Mỗi nút có khóa - Mọi nút p thỏa mãn tính chất: - Tất nút thuộc trái (p->pLeft) có giá trị khóa nhỏ giá trị khóa p - Tất nút thuộc phải (p->pRight) có giá trị khóa lớn giá trị khóa p - Tức là: trái, phải nút BST Minh họa giải thuật: Khởi tạo (init) • Khởi tạo node: cấp phát nhớ cho node, truyền data cần lưu trữ, gán pLeft = pRight = NULL • Khởi tạo cây: khởi tạo gán root = NULL struct NODE { int data; NODE* pLeft; NODE* pRight; }; NODE* CreateNode(int x) { NODE* p = new NODE(); p->data = x; p->pLeft = p->pRight = NULL; return p; } Chèn (insertion) Chèn node chứa liệu vào có gốc root trả địa node chèn, việc chèn liệu phải dựa đặc điểm nhị phân tìm kiếm Tìm vị trí node cần chèn NODE* FindInsert(NODE* root, int x) { if (root == NULL) { return NULL; } NODE* p = root; NODE* f = p; while (p != NULL) { f = p; if (p->data > x) ... phép toán: + 25 - Đẩy kết 27 vào S 10 toán hạng, đẩy 10 vào S - Lấy phần tử khỏi S (lấy 10, lấy 27) - Thực phép toán: 27 * 10 - Đẩy kết 270 vào S toán hạng, đẩy vào S 12 toán hạng, đẩy 12 vào S... 11 - 250 12 Hết xâu 2 5 Giải thích tốn hạng, đẩy vào S toán hạng, đẩy vào S số, đẩy vào S - Lấy phần tử khỏi S (lấy 2, lấy 5) - Thực phép toán: ^ - Đẩy kết 25 vào S - Lấy phần tử khỏi S (lấy 25,... ab2 ab2^+ Giải thích Đẩy dấu ( vào stack Đưa tốn hạng a xâu Đẩy toán tử + vào stack Đưa toán hạng b xâu Đẩy toán tử ^ vào stack Đưa số xâu - Phần tử đỉnh S ^ có ưu tiên cao dấu + Đưa toán tử ^

Ngày đăng: 10/11/2021, 14:07

Hình ảnh liên quan

a) Kết quả in ra màn hình là chuỗi ký tự: EASYQUE STI - Câu hỏi và đáp án thi hết môn Cấu trúc dữ liệu và giải thuật

a.

Kết quả in ra màn hình là chuỗi ký tự: EASYQUE STI Xem tại trang 14 của tài liệu.
4 *L RX Lấy chữ cái ra màn hình (DEQUEUE) - Câu hỏi và đáp án thi hết môn Cấu trúc dữ liệu và giải thuật

4.

*L RX Lấy chữ cái ra màn hình (DEQUEUE) Xem tại trang 15 của tài liệu.
6 *R A XL Lấy chữ cái ra màn hình (DEQUEUE) - Câu hỏi và đáp án thi hết môn Cấu trúc dữ liệu và giải thuật

6.

*R A XL Lấy chữ cái ra màn hình (DEQUEUE) Xem tại trang 15 của tài liệu.