Chương này giúp người học ôn tập lại những kiến thức cơ bản trong học phần môn Cấu trúc dữ liệu và giải thuật. Nội dung ôn tập gồm có: Độ phức tạp của giải thuật, tìm kiếm & sắp xếp, danh sách liên kết, stack & queue, cấu trúc cây. Mời các bạn cùng tham khảo.
Ôn tập Cấu trúc liệu & giải thuật Nội dung • • • • • • Phần đánh giá cuối khố Độ phức tạp giải thuật Tìm kiếm & xếp Danh sách liên kết Stack & queue Cấu trúc Đánh giá cuối khố • Thực hành: 30% tổng số điểm – Thực tập 1, 2, • Lý thuyết: 70% tổng số điểm – 40 câu trắc nghiệm tổng quát Đánh giá cuối khoá Nội dung Số câu hỏi Độ phức tạp Sắp xếp tìm kiếm Danh sách liên kết đơn Danh sách liên kết vòng, kép Stack & queue Cấu trúc Cây nhị phân Cây nhị phân tìm kiếm Cây AVL Cây đa phân tìm kiếm( top-down BTree) Tổng cộng 40 Độ phức tạp giải thuật • Thời gian thực GT – Giải thuật – Tập thị máy tính – Cấu hình máy tính – Kỹ người lập trình • Dựa thực thi • Thời gian thực chương trình hàm theo kích thước liệu vào n Độ phức tạp giải thuật • Đơn vị T(n) : theo số lệnh thực • T(n) = Cn CT cần Cn thị thực thi • Thời gian thực xấu nhất: tính chất liệu ảnh hưởng – Chương trình xếp cho thời gian khác với DL có thứ tự khác nhau! • T(n) thường xem TG chương trình thực xấu DL kích thước n Độ phức tạp giải thuật T1(n) = 100n2 T2(n) = 5n3 • Khi n đủ lớn: n > 20, T1(n) < T2(n) • Cách hợp lý xét tỷ suất tăng hàm TG thực CT thay thân thời gian thực Tỉ suất tăng • Hàm ko âm T(n) có tỉ xuất tăng f(n) tồn số C N0 cho: – T(n) < Cf(n), với n ≥ N0 – “cho hàm ko âm T(n) bất kỳ, ta tìm tỷ suất tăng f(n) nó” • Giả sử T(0) =1, T(1) = 4, tổng quát T(n) = (n+1)2 – Đặt N0 = 1, C = 4, n ≥ 1, chứng minh T(n) = (n+1)2 ≤ 4n2, n ≥ 1, tỉ suất tăng n2 Độ phức tạp giải thuật • Cho hàm T(n), T(n) có độ phức tạp f(n) tồn C, N0 cho: – T(n) ≤ Cf(n) với n ≥ N0 (tức T(n) có tỉ suất tăng f(n) ký hiệu T(n) O(f(n)) – VD: T(n) = (n+1)2 có tỷ suất tăng n2 nên T(n) = (n+1)2 O(n2) – Lưu ý: O(Cf(n)) = O(f(n)) với C số O(C) = O(1) • Nói cách khác độ phức tạp tính tốn giải thuật hàm chặn hàm thời gian Cho mảng n = 9, 493 812 715 710 195 437 582 340 385, sử dụng RadixSort, kết sau phân lô hàng chục A 710 B 710 C 195 D 437 340 812 812 812 812 715 715 710 582 437 437 195 493 340 340 340 715 582 582 582 195 385 385 385 385 493 493 493 437 195 710 715 Phương pháp xếp không cần so sánh giá trị khóa phần tử A Quicksort B Shellsort C InterchangeSort D RadixSort Cho hàm InsertionSort không đầy đủ void InsertionSort(int a[], int n) { int pos, i, x; for(i=1; i < n; i++) { x = a[i]; pos = i-1; while ((pos ≥ 0) && (a[pos] > x)) { a[pos+1] = a[pos]; pos ; } … // lệnh bị thiếu 10 } 11.} Dòng lệnh (9) bị thiếu, chọn lệnh A a[pos] = x D a[pos-1] = x B a[pos+1] = x C a[i] = x Linked list Phát biểu danh sách liên kết dùng cấp phát động A Thao tác thêm xóa đơn giản B Kích thước danh sách phải cố định C Có thể áp dụng tìm kiếm nhị phân D Các phần tử nằm liên tục nhớ Linked list Cho lệnh sau (1) node = NewNode(); (2) node->next = p->next; (3) node->info = x; (4) p->next = node; Hãy thứ tự để chèn nút có khóa x vào sau nút p Linked list Có lệnh sau (1) pHead = node; (2) node->info = x; (3) node->next = pHead; (4) node = NewNode(); Sắp thứ tự sau cho thao tác chèn nút có khóa x vào trước pHead Linked list Cho hàm xóa nút đầu danh sách void DeleteFirst(NodePtr &pHead) { NodePtr p; if (IsEmpty(pHead)) printf(“List is empty!”); else { p = pHead; … FreeNode(p); } } Hãy bổ sung vào dịng lệnh (6) để hồn chỉnh thao tác Linked list Hồn thành thao tác xóa nút sau p void DeleteAfter(NodePtr &p) { NodePtr q; if (p->next ==NULL) printf(“Cannot delete node!”); else { q = p->next; … 10 FreeNode(q); 11 } 12 } Hãy bổ sung lệnh (9) để hoàn tất thao tác Linked list Cho đoạn chương trình khơng đầy đủ sau: NodePtr Search(NodePtr pHead, int x) { NodePtr p; p = (1); while ( p != NULL && (2) != x) p = (3); return p; } Hãy điền giá trị thích hợp cho (1) (2) (3) Linked list Điểm bật danh sách liên kết vòng A duyệt nhanh dslk đơn B cho phép duyệt hai chiều C cần biết phần tử duyệt hết danh sách D Linked list Thao tác chèn vào đầu DSLK vòng void InsertFirst(NodePtr &pList, int x) { NodePtr newNode; newNode = NewNode(); newNode->Info = x; if ( (*) == NULL){ pList = newNode; pList->next = (*); } else { 10 newNode->next = pList->next; 11 pList->next = (**); 12 } 13 } Xác định xác giá trị (*) (**) A (*) pList (**) newNode->next B (*) pList (**) newNode C (*) newNode (**) pList->next Linked list 9.Thao tác chèn vào cuối void InsertLast(NodePtr &pList, int x) { NodePtr newNode; newNode = NewNode(); newNode->Info = x; if (pList == NULL){ pList = newNode; (1) = pList; } else { 10 newNode->next = pList->next; 11 (1) = newNode; 12 pList = newNode; 13 } 14.} Xác định giá trị thích hợp cho (1) A newNode B pList C.pList->next D newNode->next Linked list 10 Cho lệnh sau: (1): pList->next = p->next; (2): p = pList->next; (3): FreeNode(p); Xóa phần tử đầu danh sách LK vịng có nhiều phần tử A (1) (2) (3) B (2) (1) (3) C (1) (3) (2) D (2) (3) (1) ... queue Cấu trúc Cây nhị phân Cây nhị phân tìm kiếm Cây AVL Cây đa phân tìm kiếm( top-down BTree) Tổng cộng 40 Độ phức tạp giải thuật • Thời gian thực GT – Giải thuật – Tập thị máy tính – Cấu hình... (2) node->next = p->next; (3) node->info = x; (4) p->next = node; Hãy thứ tự để chèn nút có khóa x vào sau nút p Linked list Có lệnh sau (1) pHead = node; (2) node->info = x; (3) node->next =... tính tốn giải thuật hàm chặn hàm thời gian Qui tắc tính độ phức tạp • Thời gian thực lệnh gán, đọc/ghi liệu O(1) • Thời gian thực chuỗi lệnh xác định quy tắc cộng • Thời gian thực cấu trúc IF