Ôn tập Cấu trúc dữ liệu & giải thuật

Độ phức tạp Sắp xếp và 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 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 và BTree) Tổng cộng

pdf37 trang | Chia sẻ: candy98 | Lượt xem: 456 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Ôn tập Cấu trúc dữ liệu & giải thuật, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Ôn tập Cấu trúc dữ liệu & giải thuật Nội dung • Phần đánh giá cuối khoá • Độ 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 Đánh giá cuối khoá • Thực hành: 30% tổng số điểm – Thực hiện các bài tập 1, 2, 3 và 4 • 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 2 Sắp xếp và tìm kiếm 7 Danh sách liên kết đơn 8 Danh sách liên kết vòng, kép 4 Stack & queue 3 Cấu trúc cây 2 Cây nhị phân 3 Cây nhị phân tìm kiếm 5 Cây AVL 3 Cây đa phân tìm kiếm( top-down và BTree) 3 Tổng cộng 40 Độ phức tạp của giải thuật • Thời gian thực hiện GT – Giải thuật – Tập chỉ thị của máy tính – Cấu hình của máy tính – Kỹ năng của người lập trình • Dựa trên sự thực thi • Thời gian thực hiện của chương trình là hàm theo kích thước dữ liệu vào n. Độ phức tạp của giải thuật • Đơn vị của T(n) : theo số lệnh được thực hiện. • T(n) = Cn thì CT cần Cn chỉ thị thực thi • Thời gian thực hiện xấu nhất: do tính chất dữ liệu cũng ảnh hưởng – Chương trình sắp xếp sẽ cho thời gian khác nhau với các bộ DL có thứ tự khác nhau! •  T(n) thường được xem là TG chương trình thực hiện xấu nhất trên DL kích thước n. Độ phức tạp giải thuật • Khi n đủ lớn: n > 20, thì T1(n) < T2(n) • Cách hợp lý nhất là xét tỷ suất tăng của hàm TG thực hiện CT thay vì chính bản thân thời gian thực hiện. T1(n) = 100n2 T2(n) = 5n3 Tỉ suất tăng • Hàm ko âm T(n) có tỉ xuất tăng f(n) nếu tồn tại các hằng số C và N0 sao cho: – T(n) < Cf(n), với mọi n ≥ N0 – “cho hàm ko âm T(n) bất kỳ, ta luôn tìm được tỷ suất tăng f(n) của nó” • Giả sử T(0) =1, T(1) = 4, tổng quát T(n) = (n+1)2. – Đặt N0 = 1, và C = 4, thì  n ≥ 1, chứng minh được rằng T(n) = (n+1)2 ≤ 4n2,  n ≥ 1, tỉ suất tăng khi đó n2 Độ phức tạp giải thuật • Cho hàm T(n), T(n) có độ phức tạp f(n) nếu tồn tại các hằng C, N0 sao cho: – T(n) ≤ Cf(n) với mọi n ≥ N0 (tức là T(n) có tỉ suất tăng là f(n) và ký hiệu T(n) là O(f(n)) – VD: T(n) = (n+1)2 có tỷ suất tăng là n2 nên T(n) = (n+1)2 là O(n2). – Lưu ý: O(Cf(n)) = O(f(n)) với C là hằng số. O(C) = O(1). • Nói cách khác độ phức tạp tính toán giải thuật là hàm chặn trên của hàm thời gian Qui tắc tính độ phức tạp • Thời gian thực hiện lệnh gán, đọc/ghi dữ liệu là O(1). • Thời gian thực hiện một chuỗi tuần tự các lệnh được xác định bằng quy tắc cộng. • Thời gian thực hiện cấu trúc IF là thời gian lớn nhất thực hiện sau THEN hoặc ELSE và thời gian điều kiện. Thường thời gian điều kiện là O(1). Qui tắc tính độ phức tạp • Thời gian thực hiện vòng lặp là tổng thời gian thực hiện thân vòng lặp. – Tích số lần lặp với thời gian thực hiện vòng lặp • Qui tắc cộng – T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương trình P1 và P2, và T1(n)= O(f(n)), T2(n) = O(g(n)) thì thời gian thực hiện của hai đoạn chương trình đó nối tiếp nhau là T(n)= O(max(f(n), g(n))) Qui tắc tính độ phức tạp • Qui tắc nhân: – Nếu T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương trình P1và P2 và T1(n) = O(f(n)), T2(n) = O(g(n)) – Thời gian thực hiện của đoạn hai đoạn chương trình đó lồng nhau là T(n) = O(f(n).g(n)) VD tính độ phức tạp • VD giải thuật sắp xếp nổi bọt – (1) for(i = 0; i < n-1; i++) – (2) for(j=n-1; j >i; j--) – (3) if (a[j-1] > a[j]){ – (4) temp = a[j-1]; – (5) a[j-1] = a[j]; – (6) a[j] = temp; – (7) } VD tính độ phức tạp • VD hàm tìm kiếm tuần tự – (1) i=0; – (2) found = false; – (3) while ( i<n && !found) – (4) if (a[i] == x) – (5) found = true; – (6) else – (7) i++; – (8) return found; Câu hỏi 1. Giải thuật tìm kiếm nhị phân trên một mảng dữ liệu số nguyên với kích thước là n có độ phức tạp là A. nlogn B. logn C. n D. n2 2. Khi tính thời gian thực hiện của một giải thuật, người ta thường dùng trường hợp nào để so sánh A. Trường hợp tốt nhất B. Trường hợp trung bình C. Trường hợp xấu nhất D. Không xác định 3. Có 3 lệnh thực thi tuần tự I1, I2 và I3, độ phức tạp O(I1) = 1, O(I2) = logn và O(l3) = n2. Độ phức tạp của khi 3 lệnh thực thi tuần tự là A. logn B. nlogn C. N2 D. n 4. Có 2 nhóm lệnh I1 và I2, độ phức tạp O(l1) = logn và O(l2) = O(1). Lệnh l1 thực thi n lần, mỗi lần gọi thực thi l2. Độ phức tạp là A. nlogn B. logn C. n2 C.n Tìm kiếm • Tìm kiếm tuyến tính – Trên tập dữ liệu bất kỳ, vét cạn – Kết thúc khi tìm thấy hoặc ko tìm thấy (đến cuối mảng) • Tìm kiếm nhị phân – Trên mảng được sắp – Độ phức tạp là logn Sắp xếp 1. Selection Sort 2. Insertion Sort 3. Bubble Sort 4. Interchange Sort 5. Shell sort 6. Quick sort 7. Radix... Câu hỏi 1. Cho một mảng n = 8 số nguyên được sắp: 2 5 9 12 21 33 50 66, áp dụng giải thuật tìm kiếm nhị phân để tìm phần tử có giá trị 33 thì cần bao nhiêu lần so sánh khóa A. 2 B. 3 C. 4 D. 5 2. Cho một mảng n = 10 số nguyên được sắp: 4 6 8 9 10 14 18 22 25 30, áp dụng giải thuật tìm kiếm nhị phân để tìm phần tử có khóa là 8 thì các giá trị lần lượt được so sánh là A. 10 9 8 B. 10 8 6 C. 10 8 D. 10 6 8 3. Cho mảng số nguyên n = 10 phần tử sắp tăng: 3 7 10 11 14 17 20 25 28 34, sử dụng thuật giải tìm kiếm nhị phân để tìm phần tử có khoá là 9 thì giải thuật kết thúc không tìm thấy khi so sánh với phần tử nào trong mảng A. 7 B. 11 C. 10 D. 14 4. Cho mảng số nguyên n = 8 phần tử thứ tự như sau: 12 2 8 5 1 6 4 15, sử dụng giải thuật chọn để sắp xếp thì tại lượt thứ 3 thì trạng thái sắp xếp của mảng là: A. 2 12 8 5 1 6 4 15 B. 1 2 8 5 12 6 4 15 C. 1 2 5 8 12 6 4 15 D. 1 2 4 5 12 6 8 15 Câu hỏi 5. Cho mảng n = 8 phần tử: 10 3 7 6 2 5 4 16, áp dụng phương pháp chèn trực tiếp, ở lượt thứ 3 thì trạng thái của mảng là: A. 2 3 5 4 10 7 6 16 B. 2 3 4 10 7 6 5 16 C. 2 3 4 7 10 6 5 16 D. 2 3 4 7 10 5 6 16 Câu hỏi 6. Cho mảng n = 8 phần tử: 10 3 7 6 2 5 4 16, sử dụng phương pháp shellsort, với h=3, kết quả sau khi áp dụng trạng thái mảng là A. 2 3 4 7 6 5 10 16 B. 2 5 3 4 7 6 10 16 C. 4 2 5 6 3 7 10 16 D. 4 2 6 5 3 7 10 16 7. Cho mảng n = 9, 493 812 715 710 195 437 582 340 385, sử dụng RadixSort, kết quả sau khi phân lô hàng chục là A. 710 340 812 582 493 715 195 385 437 B. 710 812 715 437 340 582 385 493 195 C. 195 812 715 437 340 582 385 493 710 D. 437 812 710 195 340 582 385 493 715 8. Phương pháp sắp xếp nào không cần so sánh giá trị khóa của các phần tử A. Quicksort B. Shellsort C. InterchangeSort D. RadixSort 9. Cho hàm InsertionSort không đầy đủ 1. void InsertionSort(int a[], int n) { 2. int pos, i, x; 3. for(i=1; i < n; i++) { 4. x = a[i]; pos = i-1; 5. while ((pos ≥ 0) && (a[pos] > x)) { 6. a[pos+1] = a[pos]; 7. pos--; 8. } 9. // lệnh bị thiếu 10. } 11.} Dòng lệnh (9) bị thiếu, hãy chọn lệnh đúng A. a[pos] = x B. a[pos+1] = x C. a[i] = x D. a[pos-1] = x Linked list 1. Phát biểu nào của danh sách liên kết dùng cấp phát động là đúng A. Thao tác thêm và xóa đơn giản B. Kích thước của 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 trong bộ nhớ Linked list 2. Cho 4 lệnh sau (1) node = NewNode(); (2) node->next = p->next; (3) node->info = x; (4) p->next = node; Hãy sắp thứ tự để chèn nút có khóa x vào sau nút p Linked list 3. Có cá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 là chèn nút có khóa x vào trước pHead Linked list 4. Cho hàm xóa nút đầu danh sách void DeleteFirst(NodePtr &pHead) { 1. NodePtr p; 2. if (IsEmpty(pHead)) 3. printf(“List is empty!”); 4. else { 5. p = pHead; 6. 7. FreeNode(p); } } Hãy bổ sung vào dòng lệnh (6) để hoàn chỉnh thao tác Linked list 5. Hoàn thành thao tác xóa nút sau p 1. void DeleteAfter(NodePtr &p) 2. { 3. NodePtr q; 4. if (p->next ==NULL) 5. printf(“Cannot delete node!”); 6. else 7. { 8. q = p->next; 9. 10. FreeNode(q); 11. } 12. } Hãy bổ sung lệnh (9) để hoàn tất thao tác Linked list 6. 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) và (3) Linked list 7. Điểm nổi bật của danh sách liên kết vòng A. duyệt nhanh hơn dslk đơn B. cho phép duyệt hai chiều C. chỉ cần biết một phần tử là có thể duyệt hết danh sách D. Linked list 8. Thao tác chèn vào đầu DSLK vòng 1. void InsertFirst(NodePtr &pList, int x) { 2. NodePtr newNode; 3. newNode = NewNode(); 4. newNode->Info = x; 5. if ( (*) == NULL){ 6. pList = newNode; 7. pList->next = (*); 8. } 9. else { 10. newNode->next = pList->next; 11. pList->next = (**); 12. } 13. } Xác định chính xác giá trị của (*) và (**) A. (*) là pList và (**) là newNode->next B. (*) là pList và (**) là newNode C. (*) là newNode và (**) là pList->next Linked list 9.Thao tác chèn vào cuối 1. void InsertLast(NodePtr &pList, int x) { 2. NodePtr newNode; 3. newNode = NewNode(); 4. newNode->Info = x; 5. if (pList == NULL){ 6. pList = newNode; 7. (1) = pList; 8. } 9. 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 3 lệnh như sau: (1): pList->next = p->next; (2): p = pList->next; (3): FreeNode(p); Xóa phần tử đầu của danh sách LK vòng có nhiều hơn 1 phần tử A. (1) (2) (3) B. (2) (1) (3) C. (1) (3) (2) D. (2) (3) (1)