4 câu hỏi 90 phút
Cho mảng gồm có các giá trị sau: 17, 72, 99, 32, 58, 70, 44, 12, 23, 32
Hãy trình bày chi tiết các bước sắp xếp mảng trên tăng dần bằng giải thuật shell sort
Câu hỏi yêu cầu trình bày chi tiết các bước sắp xếp mảng số nguyên tăng dần bằng thuật toán Shell Sort. Mảng cho trước là: [17, 72, 99, 32, 58, 70, 44, 12, 23, 32].
Shell Sort là một cải tiến của Insertion Sort. Nó hoạt động bằng cách sắp xếp các cặp phần tử cách nhau một khoảng (gọi là gap) nhất định, sau đó giảm dần khoảng cách này cho đến khi khoảng cách bằng 1. Khi khoảng cách bằng 1, thuật toán trở thành Insertion Sort thông thường, nhưng lúc này mảng đã gần như được sắp xếp, do đó việc hoàn thành sắp xếp sẽ rất nhanh.
Các bước thực hiện với mảng [17, 72, 99, 32, 58, 70, 44, 12, 23, 32]:
Chọn các khoảng (gaps): Một chuỗi các khoảng phổ biến là n/2, n/4, n/8, ..., 1. Với n=10, ta có thể dùng chuỗi khoảng: 5, 2, 1.
Sắp xếp với gap = 5:
Sắp xếp với gap = 2:
Sắp xếp với gap = 1:
Vì câu hỏi chỉ yêu cầu trình bày các bước thực hiện và không có đáp án trắc nghiệm đi kèm để đánh giá tính đúng sai, nên trường answer_iscorrect
được đặt là "null" để thể hiện sự không áp dụng hoặc không có câu trả lời đúng sai cụ thể.
50 câu hỏi 60 phút
45 câu hỏi 60 phút
50 câu hỏi 60 phút
22 câu hỏi 60 phút
50 câu hỏi 60 phút
50 câu hỏi 60 phút
50 câu hỏi 60 phút
50 câu hỏi 60 phút
50 câu hỏi 60 phút
50 câu hỏi 60 phút
Câu hỏi yêu cầu trình bày chi tiết các bước sắp xếp mảng số nguyên tăng dần bằng thuật toán Shell Sort. Mảng cho trước là: [17, 72, 99, 32, 58, 70, 44, 12, 23, 32].
Shell Sort là một cải tiến của Insertion Sort. Nó hoạt động bằng cách sắp xếp các cặp phần tử cách nhau một khoảng (gọi là gap) nhất định, sau đó giảm dần khoảng cách này cho đến khi khoảng cách bằng 1. Khi khoảng cách bằng 1, thuật toán trở thành Insertion Sort thông thường, nhưng lúc này mảng đã gần như được sắp xếp, do đó việc hoàn thành sắp xếp sẽ rất nhanh.
Các bước thực hiện với mảng [17, 72, 99, 32, 58, 70, 44, 12, 23, 32]:
Chọn các khoảng (gaps): Một chuỗi các khoảng phổ biến là n/2, n/4, n/8, ..., 1. Với n=10, ta có thể dùng chuỗi khoảng: 5, 2, 1.
Sắp xếp với gap = 5:
Sắp xếp với gap = 2:
Sắp xếp với gap = 1:
Vì câu hỏi chỉ yêu cầu trình bày các bước thực hiện và không có đáp án trắc nghiệm đi kèm để đánh giá tính đúng sai, nên trường answer_iscorrect
được đặt là "null" để thể hiện sự không áp dụng hoặc không có câu trả lời đúng sai cụ thể.
Câu hỏi này yêu cầu thực hiện hai thao tác trên cây nhị phân tìm kiếm cân bằng (AVL): chèn một dãy số và sau đó xóa một phần tử. Để trả lời, cần thực hiện các bước sau:
Phần a: Chèn các số vào cây AVL.
Ta sẽ chèn lần lượt các số vào cây và thực hiện các phép quay (LL, RR, LR, RL) khi cần thiết để duy trì tính cân bằng (hiệu độ cao giữa hai cây con của mỗi nút không quá 1).
Phần b: Xóa node có key 8.
Sau khi cây AVL được hình thành từ phần a, ta tiến hành xóa nút 8. Việc xóa một nút có thể làm mất cân bằng cây.
Tìm nút 8. Nút 8 là con trái của nút 9.
Vì 8 có hai con (là 6 và 7), ta tìm phần tử nhỏ nhất ở cây con bên phải của 8, đó là 6. Tuy nhiên, 6 có con phải là 7. Do đó, ta sẽ tìm phần tử nhỏ nhất ở cây con bên phải của 8. Tìm cây con bên phải của 8: nút 9. Cây con bên phải của 8 là cây con của 9. Phần tử nhỏ nhất ở cây con bên phải của 8 không tồn tại vì 8 không có cây con bên phải trực tiếp. Theo quy tắc xóa, nếu nút có hai con, ta thay thế nó bằng phần tử nhỏ nhất của cây con bên phải (hoặc lớn nhất của cây con bên trái).
Để chính xác hơn, ta tìm phần tử nhỏ nhất ở cây con bên phải của 8. Cây con bên phải của 8 bắt đầu từ 9. Cây con bên phải của 8 là: 9 (con trái là 7), 15, 17, 19, 21, 25. Phần tử nhỏ nhất là 7.
Thay thế 8 bằng 7. Sau đó xóa 7 khỏi vị trí ban đầu.
Quy tắc xóa: Nếu nút cần xóa có hai con, thay thế nút đó bằng phần tử nhỏ nhất của cây con bên phải của nó. Phần tử nhỏ nhất của cây con bên phải của 8 là 9. Tuy nhiên, 9 không phải là con trực tiếp của 8.
Trong trường hợp này, ta tìm phần tử nhỏ nhất của cây con bên phải của 8. Cây con bên phải của 8 là cây con của 9. Do đó ta tìm phần tử nhỏ nhất của cây con của 9. Cây con của 9 bao gồm 7. Vậy ta thay 8 bằng 7.
Sau khi xóa 8, cây có thể mất cân bằng. Cần kiểm tra và thực hiện các phép quay nếu cần.
Cây AVL cuối cùng sau khi chèn: Gốc 15. Con trái: 6 (con trái 5, con trái 3, con trái 1, con phải 7). Con phải: 21 (con trái 19, con trái 17, con phải 25).
Xóa 8: Nút 8 không còn trong cây. Cây sẽ có cấu trúc mới và có thể cần cân bằng lại.
Do yêu cầu là vẽ, nên đáp án sẽ là hình ảnh của cây.
Câu hỏi yêu cầu áp dụng hai phương pháp giải quyết xung đột trong cấu trúc dữ liệu bảng băm: kết nối trực tiếp (separate chaining) và dò tuyến tính (linear probing).
a. Giải quyết đụng độ bằng phương pháp kết nối trực tiếp: Phương pháp này sử dụng danh sách liên kết (hoặc một cấu trúc dữ liệu tương tự như mảng động) tại mỗi vị trí của bảng băm để lưu trữ các khóa có cùng giá trị băm. Khi xảy ra xung đột, khóa mới sẽ được thêm vào danh sách tại vị trí tương ứng. Các bước thực hiện:
b. Giải quyết đụng độ bằng phương pháp dò tuyến tính: Phương pháp này tìm kiếm vị trí trống tiếp theo trong bảng băm theo một trình tự tuyến tính (ví dụ: i+1, i+2, ...) khi xảy ra xung đột tại vị trí băm ban đầu. Công thức dò là h'(k, i) = (h(k) + i) % |M|, với i = 0, 1, 2, ... Các bước thực hiện:
Do câu hỏi có hai phần (a và b) và không có lựa chọn A, B, C, D để chọn đáp án đúng, nên không áp dụng 'answer_iscorrect'. Thay vào đó, đây là một câu hỏi tự luận yêu cầu trình bày cách giải chi tiết cho cả hai phần.
Câu hỏi yêu cầu thiết kế và triển khai một chương trình quản lý thông tin bàn của quán cà phê sử dụng cấu trúc dữ liệu cây nhị phân tìm kiếm (BST). Các yêu cầu bao gồm nhập, xuất, đếm bàn có khách, tìm kiếm bàn theo mã, xuất bàn có khách và xóa bàn trống đã thanh toán. Việc sử dụng BST giúp tối ưu hóa các thao tác tìm kiếm và xóa, đặc biệt khi số lượng bàn lớn. Việc triển khai cần định nghĩa cấu trúc dữ liệu cho bàn, xây dựng các hàm tương ứng cho từng thao tác theo yêu cầu của BST và logic nghiệp vụ của quán cà phê. Cụ thể:
a. Nhập danh sách thông tin các bàn: Người dùng sẽ nhập thông tin cho từng bàn (Mã bàn, Trạng thái, Tên đồ uống, Số lượng, Đơn giá, Phương thức thanh toán). Mã bàn sẽ được sử dụng làm khóa để chèn vào BST. Trong quá trình chèn, cần cập nhật thông tin về thành tiền dựa trên số lượng và đơn giá.
b. Xuất danh sách thông tin các bàn: Duyệt cây BST theo thứ tự inorder (hoặc preorder/postorder tùy mục đích trình bày) để in ra thông tin của tất cả các bàn.
c. Đếm số lượng bàn có khách: Duyệt qua tất cả các nút trong cây BST. Tại mỗi nút, kiểm tra trạng thái của bàn. Nếu trạng thái là 'có khách sử dụng đồ uống', tăng biến đếm.
d. Tìm kiếm một bàn theo mã và trả về thông tin đầy đủ: Sử dụng thuật toán tìm kiếm trong BST. Bắt đầu từ gốc cây, so sánh mã bàn cần tìm với mã bàn tại nút hiện tại. Nếu bằng nhau, trả về thông tin bàn đó. Nếu nhỏ hơn, sang cây con trái. Nếu lớn hơn, sang cây con phải. Nếu hết cây mà không tìm thấy, thông báo không tìm thấy.
e. Xuất thông tin ra màn hình các bàn ở trạng thái có khách: Tương tự như đếm bàn có khách, nhưng thay vì đếm, chúng ta sẽ in thông tin chi tiết của bàn đó ra màn hình khi trạng thái là 'có khách sử dụng đồ uống'. Việc này đòi hỏi một phép duyệt cây.
f. Xóa tất cả các thông tin bàn ở trạng thái trống và đã thanh toán tiền: Đây là thao tác phức tạp nhất. Cần duyệt cây để xác định các bàn thỏa mãn điều kiện xóa (trạng thái trống VÀ đã thanh toán tiền). Sau đó, thực hiện phép xóa nút trong BST cho từng bàn đó. Lưu ý rằng việc xóa nhiều nút trong BST có thể làm mất cân bằng cây, tuy nhiên, bài toán không yêu cầu duy trì cân bằng cây (ví dụ: AVL, Red-Black Tree).
Do đây là một bài toán lập trình yêu cầu triển khai cụ thể bằng mã nguồn, nên không có một đáp án trắc nghiệm duy nhất mà là một giải pháp lập trình hoàn chỉnh. Tuy nhiên, nếu câu hỏi được diễn đạt theo hướng lựa chọn phương án triển khai, thì đáp án đúng sẽ là phương án mô tả chính xác việc sử dụng BST và logic xử lý các yêu cầu trên.