Đáp án lý thuyết kỹ thuật lập trình

21 18 0
Đáp án lý thuyết kỹ thuật lập trình

Đ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

ĐÁP ÁN LÝ THUYẾT KTLT Câu 1: Nêu khái niệm vai trị xếp Cho ví dụ minh họa vai trị xếp Trả lời: • Khái niệm: Sắp xếp q trình bố trí phần tử tập hợp theo trình tự Trong khoa học máy tính tốn học, thuật toán xếp thuật toán xếp phần tử danh sách (hoặc mảng) theo thứ tự (tăng giảm) • Vai trị: Sắp xếp nhằm mục đích giúp quản lý tìm kiếm phần tử dễ dàng nhanh chóng • Ví dụ: Các ứng dụng quản ký danh bạ điện thoại có xếp theo số, theo tên Quản lý học sinh có xếp theo điểm, theo lớp, theo trường Câu 2: Nêu ý tưởng giải thuật xếp chèn Cho ví dụ thực bước giải thuật xếp chèn Trả lời: • Ý tưởng xếp chèn: Thuật toán xếp chèn thực xếp dãy số theo cách duyệt phần tử chèn phần tử vào vị trí mảng (dãy số từ đầu đến phần tử phía trước nó) xếp cho dãy số mảng xếp đảm bảo tính chất dãy số tăng dần B1: Khởi tạo mảng với dãy xếp có k = phần tử (phần tử – phần tử có số 0) B2: Duyệt phần tử từ phần tử thứ 2, lần duyệt phần tử số i đặt phần tử vào vị trí đoạn từ [0 … i] cho dãy số từ [0…i] đảm bảo tính chất dãy số tăng dần Sau lần duyệt, số phần tử xếp mảng tăng thêm phần tử B3: lặp duyệt hết tất phần tử mảng • Ví dụ: Sắp xếp dãy X ={ 4} thành dãy không giảm i i=1 i=2 i=3 i=4 i=5 i=6 1 1 1 1 7 3 2 2 3 7 3 3 8 8 4 2 2 6 6 6 4 4 4 Câu 3: Nêu ý tưởng giải thuật xếp chọn Cho ví dụ thực bước giải thuật xếp chọn Trả lời: • Ý tưởng: - Tìm phần tử nhỏ mảng đưa lên vị trí - Giả sử có k phần tử đầu xếp - Tìm phần tử bé từ k+1 đến n, đổi chổ cho phần tử k+1 - Lặp tương tự phần tử N-1 • Ví dụ: i vtmin 5 1 1 1 7 2 2 3 3 3 8 8 4 2 7 6 6 6 4 4 8 Câu 4: Nêu ý tưởng giải thuật xếp bọt Cho ví dụ thực bước giải thuật xếp bọt Trả lời: • Ý tưởng: − Xét phần tử dãy, khơng thứ tự đổi chỗ cho − Tiếp tục xét cặp đến cuối dãy − Lặp lại trình với cặp đầu dãy đến khơng có cặp sai thứ tự • Sắp xếp dãy: X ={ 14 33 27 35 10} thành dãy không giảm i=0 14 14 14 14 14 14 14 10 33 33 27 27 27 27 10 14 27 27 33 33 33 10 27 27 35 35 35 35 10 33 33 33 10 10 10 10 35 35 35 35 Câu 5: Trình bày phương pháp tìm kiếm cho danh sách xếp danh sách chưa xếp Nhập dãy số nguyên xếp, sử dụng phương pháp tìm kiếm để tìm tất phần tử có giá trị x nhập Trả lời: Thuật tốn tìm kiếm tuyến tính (linear search) hay cịn gọi thuật tốn tìm kiếm (Sequential search) phương pháp tìm kiếm phần tử cho trước danh sách cách duyệt phần tử danh sách lúc tìm thấy giá trị mong muốn hay duyệt qua toàn danh sách Ý tưởng thuật tốn: xét dãy số cần tìm có n phần tử: a[0], a[1], a[2], , a[n-1].Giá trị cần tìm x - Bắt đầu từ khoá đầu tiên, so sánh khoá x với khoá tương ứng dãy - Quá trình tìm kiếm kết thúc tìm khoá thoả mãn đến hết dãy gặp điều kiện dừng vòng lặp Với danh sách chưa xếp, ta tìm kiếm đến tìm thấy phần tử có giá trị giá trị cần tìm, phần tử cuối danh sách khơng kết luận khơng tìm thấy Với danh sách xếp, ta phải duyệt danh sách để tìm kiếm, giá trị phần tử lớn giá trị cần tìm dừng lại khơng kết luận tìm thấy  Trên danh sách xếp int SequentialSearch (int x, int a[], int n){ int i=0; while (i next = temp; // Gán next node cuối temp, temp node cuối } } Câu 9: Trình bày cấu trúc liệu danh sách liên kết đơn Cài đặt thao tác thêm phần tử vào sau phần tử thứ p danh sách Trả lời: Danh sách liên kết đơn cấu trúc liệu bao gồm tập nút, mà nút bao gồm: - Dữ liệu cần lưu trữ - Liên kết đến nút void ThemNode_VaoSauNode_p(int x, int vt) { Node*temp = new Node; temp->value = x; temp ->next = NULL; if(list == NULL){ themCuoi(x); // Nếu DS rỗng tức thêm vào cuối }else{ // Bắt đầu tìm vị trí cần chèn Ta dùng k để đếm cho vị trí int k = 0; Node*p = list; while(p != NULL && k != vt){ p = p->next; ++k; } if(k != vt){ // Nếu duyệt hết danh sách lk mà chưa đến vị trí cần chèn, ta mặc định chèn cuối themCuoi(x) }else{ temp->next = p->next; p->next = temp; } } } Câu 10: Trình bày cấu trúc liệu danh sách liên kết đơn Cài đặt thao tác xóa phần tử đầu danh sách Trả lời: Danh sách liên kết đơn cấu trúc liệu bao gồm tập nút, mà nút bao gồm: - Dữ liệu cần lưu trữ - Liên kết đến nút void xoaDau() { if (list == NULL) { cout next; } Câu 11: Trình bày cấu trúc liệu danh sách liên kết đơn Cài đặt thao tác xóa phần tử cuối danh sách Trả lời: Danh sách liên kết đơn cấu trúc liệu bao gồm tập nút, mà nút bao gồm: - Dữ liệu cần lưu trữ - Liên kết đến nút void xoaCuoi() { Node*temp = list; if(list == NULL) cout next != NULL) { temp = temp ->next; } temp->next=NULL; } Câu 12: Trình bày cấu trúc liệu danh sách liên kết đơn Cài đặt thao tác xóa phần tử vào sau phần tử thứ p danh sách Trả lời: Danh sách liên kết đơn cấu trúc liệu bao gồm tập nút, mà nút bao gồm: - Dữ liệu cần lưu trữ - Liên kết đến nút void DelAt(int a){ if(list == NULL) cout next; ++k; } if(k != a){ // Nếu duyệt hết danh sách lk mà chưa đến vị trí cần chèn, ta mặc định xóa cuối xoaCuoi(); }else{ p->next = p->next->next; } } Câu 13: Trình bày cấu trúc liệu danh sách liên kết đơn Cài đặt thao tác làm rỗng danh sách Trả lời: Danh sách liên kết đơn cấu trúc liệu bao gồm tập nút, mà nút bao gồm: - Dữ liệu cần lưu trữ - Liên kết đến nút void RemoveList() { Node *temp = list; while (list!=NULL) { temp = temp->next; delete list; list = temp; } list = NULL; } Câu 14: Trình bày khái niệm cấu trúc liệu stack (ngăn xếp) Cài đặt stack mảng Trình bày thao tác pop stack cài đặt Trả lời: Ngăn xếp (Stack) danh sách mà ta giới hạn việc thêm vào loại bỏ phần tử thực đầu danh sách, đầu gọi đỉnh (top) ngăn xếp Có thể hình dung stack chồng đĩa Muốn thêm vào chồng đĩa ta để đĩa đỉnh chồng, muốn lấy đĩa khỏi chồng ta lấy đĩa trước Như ngăn xếp cấu trúc có tính chất “vào sau – trước” – LIFO Cài đặt stack mảng: int size = 100; int top = -1; int stack[100]; void pop() { int x; if (top == -1) { cout top->next; x = temp; delete(temp); } return x; } Câu 18: Trình bày khái niệm cấu trúc liệu stack (ngăn xếp) Cài đặt stack danh sách liên kết Trình bày thao tác push stack cài đặt Trả lời: Ngăn xếp (Stack) danh sách mà ta giới hạn việc thêm vào loại bỏ phần tử thực đầu danh sách, đầu gọi đỉnh (top) ngăn xếp Có thể hình dung stack chồng đĩa Muốn thêm vào chồng đĩa ta để đĩa đỉnh chồng, muốn lấy đĩa khỏi chồng ta lấy đĩa trước Như ngăn xếp cấu trúc có tính chất “vào sau – trước” – LIFO Cài đặt stack danh sách: struct Node{ int value; Node* next; }; struct Stack{ Node *top; }; Stack *st = NULL; void push(int x){ Node*temp = new Node; temp->value = x; temp->next = NULL; if(st->top == NULL){ st->top = temp; } else { temp->next = st->top; st->top = temp; } cout value value; } Câu 20: Trình bày khái niệm cấu trúc liệu stack (ngăn xếp) Trình bày ý tưởng đảo mảng số nguyên có sử dụng stack Trả lời: Ngăn xếp (Stack) danh sách mà ta giới hạn việc thêm vào loại bỏ phần tử thực đầu danh sách, đầu gọi đỉnh (top) ngăn xếp Có thể hình dung stack chồng đĩa Muốn thêm vào chồng đĩa ta để đĩa đỉnh chồng, muốn lấy đĩa khỏi chồng ta lấy đĩa trước Như ngăn xếp cấu trúc có tính chất “vào sau – trước” – LIFO Ý tưởng đảo mảng số nguyên có sử dụng stack: - Duyệt từ đầu mảng đến cuối mảng Lần lượt cho phần tử duyệt vào ngăn xếp, cho hết mảng vào ngăn xếp - Lần lượt lấy phần tử từ ngăn xếp in ngăn xếp rỗng Câu 21: Trình bày khái niệm cấu trúc liệu stack (ngăn xếp) Trình bày ý tưởng đảo chuỗi theo từ có sử dụng stack Trả lời: Ngăn xếp (Stack) danh sách mà ta giới hạn việc thêm vào loại bỏ phần tử thực đầu danh sách, đầu gọi đỉnh (top) ngăn xếp Có thể hình dung stack chồng đĩa Muốn thêm vào chồng đĩa ta để đĩa đỉnh chồng, muốn lấy đĩa khỏi chồng ta lấy đĩa trước Như ngăn xếp cấu trúc có tính chất “vào sau – trước” – LIFO Ý tưởng đảo chuỗi theo từ có sử dụng stack: - Duyệt từ đầu xâu đến cuối xâu Lần lượt cho ký tự duyệt vào ngăn xếp, cho hết ký tự vào ngăn xếp - Lần lượt lấy phần tử từ ngăn xếp in ngăn xếp rỗng Câu 22: Trình bày khái niệm cấu trúc liệu stack (ngăn xếp) Trình bày ý tưởng chuyển đổi số từ số 10 sang số có sử dụng stack Trả lời: Ngăn xếp (Stack) danh sách mà ta giới hạn việc thêm vào loại bỏ phần tử thực đầu danh sách, đầu gọi đỉnh (top) ngăn xếp Có thể hình dung stack chồng đĩa Muốn thêm vào chồng đĩa ta để đĩa đỉnh chồng, muốn lấy đĩa khỏi chồng ta lấy đĩa trước Như ngăn xếp cấu trúc có tính chất “vào sau – trước” – LIFO Ý tưởng chuyển đổi số từ số 10 sang số có sử dụng stack: - Lấy số cần chuyển chia lấy dư cho số đẩy vào stack - Tiếp tục lấy kết phép chia chia cho số kết khơng dừng - Lấy số stack ta số cần tìm Câu 23: Trình bày khái niệm cấu trúc liệu stack (ngăn xếp) Trình bày ý tưởng chuyển đổi số từ số 10 sang số 16 có sử dụng stack Trả lời: Ngăn xếp (Stack) danh sách mà ta giới hạn việc thêm vào loại bỏ phần tử thực đầu danh sách, đầu gọi đỉnh (top) ngăn xếp Có thể hình dung stack chồng đĩa Muốn thêm vào chồng đĩa ta để đĩa đỉnh chồng, muốn lấy đĩa khỏi chồng ta lấy đĩa trước Như ngăn xếp cấu trúc có tính chất “vào sau – trước” – LIFO Ý tưởng chuyển đổi số từ số 10 sang số 16 có sử dụng stack: - Lấy số cần chuyển chia lấy dư cho số 16 đẩy vào stack - Tiếp tục lấy kết phép chia chia cho số 16 kết khơng dừng - Lấy số stack ra, số lấy >= 10 ta in ký tự A, B, C …, F tương ứng từ 10-15 Khi đó, ta số cần tìm Câu 24: Trình bày khái niệm cấu trúc liệu queue (hàng đợi) Cài đặt hàng đợi tuyền tính mảng, DSLK Trình bày thao tác lấy phần tử hàng đợi tuyến tính (Dequeue) Trả lời: Queue: Queue danh sách mà đối tượng đượcbthêm vào đầu danh sách lấy đầu danh sách Vì thế, việc thêm đối tượng vào Queue lấy đối tượng khỏi Queue thực theo chế FIFO (First In First Out - Vào trước trước) Phần tử lấy phần đầu queue (front/ first), thêm vào cuối queue (rear/last) Cài đặt hàng đợi tuyền tính mảng: int int int int size = 10; front = 0; rear = -1; queue[10]; void dequeue() { int x; if (rear < front) { cout first = qu->first->next; } return temp; } Câu 25: Trình bày khái niệm cấu trúc liệu queue (hàng đợi) Cài đặt hàng đợi tuyến tính mảng Trình bày thao tác thêm phần tử vào hàng đợi tuyến tính (Enqueue) Trả lời: Queue: Queue danh sách mà đối tượng đượcbthêm vào đầu danh sách lấy đầu danh sách Vì thế, việc thêm đối tượng vào Queue lấy đối tượng khỏi Queue thực theo chế FIFO (First In First Out - Vào trước trước) Phần tử lấy phần đầu queue (front/ first), thêm vào cuối queue (rear/last) Cài đặt hàng đợi tuyền tính mảng: int int int int size = 10; front = 0; rear = -1; queue[10]; void enqueue(int x) { if (rear==size) { cout next = NULL; if (qu->first==NULL){ qu->last = qu->first=temp; } else{ qu->last->next=temp; qu->last = temp; } } Câu 26: Trình bày khái niệm nhị phân tìm kiếm Cài đặt nhị phân tìm kiếm danh sách liên kết Trình bày thao tác thêm node vào nhị phân tìm kiếm Trả lời: Cây nhị phân tìm kiếm cấu trúc liệu đặc biệt sử dụng cho mục đích tìm kiếm hiệu Một nhị phân có điều kiện đặc biệt nút có tối đa hai nút Các khóa node bên trái nhỏ khóa root, khóa node bên phải lớn khóa root Cây bên trái phải nhị phân tìm kiếm Cấu tạo gồm phần: • Node gốc (root): node bắt đầu hay gọi "rễ" Node (internal node): node có • Node (leaf): node khơng có • Cài đặt nhị phân tìm kiếm danh sách liên kết struct Node{ int value; Node*left; Node*right; }; Node* root = new Node; void them(Node*root,int x){ Node*t = new Node; t->value = x; t->left = NULL; t->right = NULL; Node*temp = root; bool kt = true; while (kt){ if(temp==NULL){ temp=t; kt=false; } else { if(temp->value < t->value) temp = temp->right; else temp=temp->left; } } } Câu 27: Trình bày khái niệm nhị phân tìm kiếm Cài đặt nhị phân tìm kiếm danh sách liên kết Trình bày thao tác xóa node nhị phân tìm kiếm Trả lời: Cài đặt nhị phân tìm kiếm danh sách liên kết struct Node{ int value; Node*left; Node*right; }; Node* root = new Node; void TimNotThe(Node*X, Node*Y){ if(Y->left !=NULL) TimNotThe(X,Y->left); else{ X->value = Y->value; X=Y; Y = Y->right; } } void XoaNode(Node*root, int x) // x laf giá trị node cần xóa { if (root == NULL) { return; } else { if(x < root->value) // neu x nho hon not goc { XoaNode(root->left, x); // duyet sang nhanh trai cua cay } else if(x > root->value) { XoaNode(root->right,x); //duyet sang nhanh phai cua cay } else if(x == root->value) // x == root->value - da tim node can xoa { Node*temp = root; // temp la node the mang - node de xoa if (root->left == NULL) //nhanh trai=NULL -> la cay co cay phai { root = root->right; //duyet sang phai cua node can xoa } else if(root->right == NULL)//nhanh phai = null -> la cay trai { root = root->left; // duyet sang trai cua node can xoa } else{ TimNotThe(temp, root->right); } delete temp; } } } Câu 28: Trình bày khái niệm nhị phân tìm kiếm Cài đặt nhị phân tìm kiếm danh sách liên kết Trình bày thao tác tìm node nhị phân tìm kiếm Trả lời: Cài đặt nhị phân tìm kiếm danh sách liên kết struct Node{ int value; Node*left; Node*right; }; Node* root = new Node; • Sử dụng đệ quy: Node* SearchNode_Re(Node* root, int x) { if (root == NULL) return NULL; } if (root->data == x) { return root; } if (root->data > x) { SearchNode_Re(root->pLeft, x); } else { SearchNode_Re(root->pRight, x); } • Sử dụng vòng lặp: Node* SearchNode(Node* root, int x) { if (root == NULL) return NULL; NODE* p = root; } while (p != NULL) { if (p->data == x) { return p; } else if (p->data > x) { p = p->pLeft; } else { p = p->pRight; } } ... Nêu ý tưởng giải thuật xếp bọt Cho ví dụ thực bước giải thuật xếp bọt Trả lời: • Ý tưởng: − Xét phần tử dãy, không thứ tự đổi chỗ cho − Tiếp tục xét cặp đến cuối dãy − Lặp lại q trình với cặp đầu... sách Ý tưởng thuật toán: xét dãy số cần tìm có n phần tử: a[0], a[1], a[2], , a[n-1].Giá trị cần tìm x - Bắt đầu từ khoá đầu tiên, so sánh khoá x với khố tương ứng dãy - Q trình tìm kiếm kết thúc... 35 35 Câu 5: Trình bày phương pháp tìm kiếm cho danh sách xếp danh sách chưa xếp Nhập dãy số nguyên xếp, sử dụng phương pháp tìm kiếm để tìm tất phần tử có giá trị x nhập Trả lời: Thuật tốn tìm

Ngày đăng: 16/02/2022, 20:23

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

Tài liệu liên quan