Cấu trúc dữ liệu: câu hỏi luyện tập có giải thích

Câu hỏi trắc nghiệm Cấu trúc dữ liệu miễn phí, có gợi ý và giải thích, ở ba mức độ: thuật ngữ và kiến thức chính, vận dụng khái niệm, tình huống và phân tích.

Bài tập miễn phíDễ

Tính chất đống max là gì?

Bài tiếp theo →

Bạn luyện tập những gì

  1. Dễthuật ngữ và kiến thức chính
  2. Trung bìnhvận dụng khái niệm
  3. Khótình huống và phân tích

Học Cấu trúc dữ liệu từ đầu

Trước bài này: Thuật toán và độ phức tạp

1Cấu trúc dữ liệu là gì

Cấu trúc dữ liệu là cách tổ chức dữ liệu trong bộ nhớ để một số thao tác nhanh: tìm một phần tử, thêm một phần tử, xóa một phần tử.

Không cấu trúc nào nhanh với mọi thứ. Chọn một cấu trúc nghĩa là chọn thao tác nào nên rẻ. Chi phí của chúng được viết bằng Big O, với n là số phần tử.

Hai khối xây dựng cơ bản là mảng và danh sách liên kết.

a7[0]3[1]9[2]4[3]7394∅h

Một mảng lưu các phần tử trong một khối bộ nhớ, cái này nối tiếp cái kia. Máy tính có thể tính ra vị trí của phần tử i, nên đọc a[i] mất O(1). Chèn vào đầu nghĩa là phải dịch mọi phần tử: O(n).

Một danh sách liên kết lưu mỗi phần tử trong một nút có con trỏ tới nút kế tiếp. Con trỏ cuối là null. Chèn vào đầu (h) chỉ thay đổi một con trỏ: O(1). Nhưng để tới phần tử i bạn phải đi theo i con trỏ: O(n).

Một danh sách liên kết đôi còn có con trỏ tới nút trước, nên bạn có thể đi theo cả hai chiều.

Tự kiểm tra Thao tác nào là O(1) với mảng nhưng O(n) với danh sách liên kết đơn?
  1. Chèn một phần tử mới vào đầu
  2. Duyệt mỗi phần tử một lần
  3. Đếm từng phần tử một
  4. Đọc phần tử tại chỉ số i

Đáp số: Đọc phần tử tại chỉ số i. Mảng tính trực tiếp địa chỉ của phần tử i. Danh sách liên kết phải đi theo i con trỏ từ đầu. Chèn vào đầu là trường hợp ngược lại: rẻ với danh sách, đắt với mảng.

2Ngăn xếp và hàng đợi

Một ngăn xếp (stack) giống một chồng đĩa: bạn chỉ thêm và lấy ra ở trên cùng. Phần tử vào sau cùng là phần tử ra đầu tiên: LIFO.

  • push đặt một phần tử lên trên, pop lấy phần tử trên cùng ra, peek đọc phần tử trên cùng mà không lấy ra. Tất cả đều là O(1).
  • Công dụng: chức năng hoàn tác của trình soạn thảo, ngăn xếp lời gọi của chương trình, kiểm tra dấu ngoặc cân bằng, tìm kiếm theo chiều sâu.

Một hàng đợi (queue) giống hàng người xếp ở quầy thanh toán: bạn vào cuối hàng và rời đi ở đầu hàng. Phần tử vào đầu tiên là phần tử ra đầu tiên: FIFO.

  • enqueue thêm vào cuối, dequeue lấy ra từ đầu. Cả hai đều là O(1).
  • Công dụng: các lệnh in, tin nhắn đang chờ xử lý, tìm kiếm theo chiều rộng.

Một deque (hàng đợi hai đầu) cho phép thêm và lấy ra ở cả hai đầu. Một hàng đợi ưu tiên luôn lấy ra phần tử có độ ưu tiên cao nhất trước; nó thường được xây dựng bằng một đống (heap).

Tự kiểm tra Cấu trúc dữ liệu nào phù hợp nhất với nút “hoàn tác” của một trình soạn thảo văn bản?
  1. Một bảng băm
  2. Một hàng đợi
  3. Một ngăn xếp
  4. Một đồ thị

Đáp số: Một ngăn xếp. Hoàn tác phải đảo ngược hành động gần nhất trước: vào sau, ra trước. Một hàng đợi sẽ hoàn tác hành động cũ nhất trước.

3Cây, đống, bảng băm và đồ thị

Một cây có một nút trên cùng, gọi là gốc. Mọi nút khác có đúng một nút cha. Các nút không có con là lá. Cây có n nút thì có n − 1 cạnh.

Trong một cây nhị phân mỗi nút có nhiều nhất hai con. Một cây tìm kiếm nhị phân (BST) thêm một quy tắc: khóa trong cây con bên trái nhỏ hơn nút, khóa trong cây con bên phải lớn hơn.

Tìm kiếm trong BST đi theo một đường xuống, nên chi phí là O(chiều cao). Một cây cân bằng (AVL, đỏ-đen) giữ chiều cao gần log₂ n. Các khóa chèn theo thứ tự đã sắp xếp tạo thành một chuỗi có chiều cao n.

Một đống (heap) là cây nhị phân trong đó mỗi nút cha nhỏ hơn các con của nó (min-heap) hoặc lớn hơn (max-heap). Giá trị nhỏ nhất hoặc lớn nhất nằm ở gốc, và chèn và xóa tốn O(log n).

Một bảng băm lưu các cặp khóa–giá trị. Một hàm băm biến khóa thành chỉ số, nên chèn và tra cứu mất O(1) trung bình. Hai khóa có cùng chỉ số là một va chạm, được giải quyết bằng xích (một danh sách cho mỗi ô) hoặc địa chỉ mở (thử một ô khác).

Một đồ thị có các đỉnh nối với nhau bằng các cạnh, có thể có hướng hoặc trọng số. Nó được lưu bằng ma trận kề, O(V²) bộ nhớ, hoặc bằng danh sách kề, O(V + E).

Tự kiểm tra Các khóa 50, 30, 70, 20 và 40 được chèn theo thứ tự này vào một cây tìm kiếm nhị phân rỗng. Con trái của 30 là gì?
  1. 20
  2. 40
  3. 70
  4. Nó không có con trái

Đáp số: 20. 20 nhỏ hơn 50, nên đi sang trái tới 30. Nó cũng nhỏ hơn 30, nên lại đi sang trái. 40 lớn hơn 30 và trở thành con phải của nó.

4Phương pháp từng bước

Các câu hỏi thường mô tả một tác vụ và hỏi cấu trúc nào phù hợp, hoặc hỏi một cấu trúc trông thế nào sau một số thao tác.

  1. Tìm thao tác phải nhanh: truy cập theo vị trí, theo khóa, phần tử mới nhất, phần tử cũ nhất, phần tử nhỏ nhất, hoặc một khoảng.
  2. Ghép nó với một cấu trúc: chỉ số → mảng, khóa → bảng băm, mới nhất → ngăn xếp, cũ nhất → hàng đợi, nhỏ nhất hoặc lớn nhất → đống, thứ tự đã sắp xếp hoặc khoảng → cây tìm kiếm cân bằng.
  3. Kiểm tra chi phí của các thao tác khác mà tác vụ cần, theo Big O.
  4. Với câu hỏi theo dõi, hãy thực hiện từng thao tác một và ghi lại trạng thái sau mỗi thao tác.
  5. Kiểm tra trạng thái cuối so với quy tắc của cấu trúc: LIFO, FIFO, thứ tự BST hoặc thứ tự đống.

5Một ví dụ có lời giải

Theo dõi từng bước. Hãy thử đoán bước tiếp theo trước khi mở nó.

Ví dụ có lời giải

Các khóa 50, 30, 70, 20, 40 và 60 được chèn theo thứ tự này vào một cây tìm kiếm nhị phân rỗng. Duyệt giữa (in-order) cho kết quả nào, và tìm 60 cần bao nhiêu phép so sánh?

1

Chèn gốc

Khóa đầu tiên, 50, trở thành gốc.

2

Chèn 30 và 70

30 nhỏ hơn 50, nên đi sang trái. 70 lớn hơn 50, nên đi sang phải.

503070
3

Chèn 20, 40 và 60

20: nhỏ hơn 50, nhỏ hơn 30, nên ở bên trái của 30. 40: nhỏ hơn 50, lớn hơn 30, nên ở bên phải của 30. 60: lớn hơn 50, nhỏ hơn 70, nên ở bên trái của 70.

503070204060
4

Duyệt giữa

Duyệt giữa thăm cây con trái, rồi nút, rồi cây con phải.

Kết quả là 20, 30, 40, 50, 60, 70: các khóa theo thứ tự đã sắp xếp, điều này luôn đúng với BST.

5

Tìm 60

So sánh với 50: lớn hơn, đi sang phải. So sánh với 70: nhỏ hơn, đi sang trái. So sánh với 60: tìm thấy.

503070204060

Việc tìm kiếm cần 3 phép so sánh, mỗi tầng một phép.

Đáp số

Duyệt giữa: 20, 30, 40, 50, 60, 70. Tìm 60 cần 3 phép so sánh.

6Lỗi thường gặp

  • Nhầm LIFO với FIFO. Ngăn xếp trả về phần tử mới nhất, hàng đợi trả về phần tử cũ nhất.
  • Nghĩ rằng danh sách liên kết cho phép truy cập nhanh theo chỉ số. Nó phải đi từ đầu.
  • Cho rằng BST luôn là O(log n). Chỉ cây cân bằng mới vậy; chèn theo thứ tự đã sắp xếp cho O(n).
  • Quên va chạm trong bảng băm. O(1) là trung bình, không phải trường hợp xấu nhất.
  • Nhầm các cách duyệt. Duyệt trước: nút trước. Duyệt giữa: nút ở giữa. Duyệt sau: nút sau cùng.
  • Dùng ma trận kề cho một đồ thị thưa lớn. Nó lãng phí O(V²) bộ nhớ.
Tự kiểm tra Bạn thêm 1, 2 và 3 theo thứ tự này vào một hàng đợi rỗng bằng enqueue. Lần dequeue đầu tiên trả về phần tử nào?
  1. 1, 2 và 3 cùng lúc
  2. 1
  3. 2
  4. 3

Đáp số: 1. Hàng đợi là vào trước, ra trước, nên 1 ra đầu tiên. 3 sẽ là đáp án cho ngăn xếp (pop), vốn trả về phần tử mới nhất.

7Các câu hỏi thi trông như thế nào

  • Dễ: thuật ngữ và sự kiện chính. LIFO và FIFO, nút, gốc hay lá là gì, quy tắc BST, hàm băm làm gì.
  • Trung bình: vận dụng khái niệm. Cấu trúc nào phù hợp với một tác vụ, kết quả của push và pop hay của các lần chèn BST, các cách duyệt cây, bảng băm với dò tuyến tính, chi phí theo Big O.
  • Khó: ca bài tập và phân tích. Cây cân bằng, đống trong mảng, B-tree, trie, union-find, bộ lọc Bloom và các thiết kế như bộ nhớ đệm LRU.

Với một đống lưu trong mảng bắt đầu từ chỉ số 0, các con của chỉ số i nằm ở 2i + 1 và 2i + 2, và cha của nó nằm ở ⌊(i − 1) / 2⌋.

Học từng bước một trong ứng dụngHọc từng bước một trong ứng dụng

Câu hỏi ví dụ

Ví dụ 1Dễ

Sự khác biệt chính giữa mảng tĩnh và mảng động là gì?

  1. AMảng tĩnh cho phép truy cập chỉ số chậm hơn
  2. BMảng động có thể tăng bằng cách chuyển sang một khối bộ nhớ lớn hơn
  3. CMảng động lưu các phần tử trong các nút liên kết để có thể tăng từng phần tử một
  4. DMảng tĩnh chỉ có thể lưu số
Hiện các gợi ý
  1. List của Python và ArrayList của Java là ví dụ của một trong hai loại.
  2. Hai đáp án sai đã bị gạch bỏ. Một trong hai đáp án còn lại là đúng.
Hiện đáp án và phần giải thích

Vì sao đây là đáp án

Mảng tĩnh có kích thước cố định; mảng động cấp phát mảng lớn hơn và sao chép các phần tử khi đầy.

Đáp số

B · Mảng động có thể tăng bằng cách chuyển sang một khối bộ nhớ lớn hơn
Ví dụ 2Trung bình

Extract-min hoạt động thế nào trong đống min nhị phân?

  1. AXóa phần tử cuối của mảng
  2. BChuyển phần tử cuối lên gốc và đẩy xuống
  3. CXóa gốc và dịch tất cả phần tử sang trái một vị trí
  4. DTìm trong tất cả các lá giá trị nhỏ nhất mới
Hiện các gợi ý
  1. Giữ cây đầy đủ, rồi sửa thứ tự.
  2. Hai đáp án sai đã bị gạch bỏ. Một trong hai đáp án còn lại là đúng.
Hiện đáp án và phần giải thích

Vì sao đây là đáp án

Phần tử cuối lấp chỗ trống ở gốc và được hoán đổi với con nhỏ hơn cho đến khi tính chất đống được thỏa, tốn O(log n).

Đáp số

B · Chuyển phần tử cuối lên gốc và đẩy xuống
Ví dụ 3Khó

Nếu không có hợp theo hạng hay nén đường đi, chi phí trường hợp xấu nhất của một lần find trong cấu trúc union-find với n phần tử là bao nhiêu?

  1. AO(1)
  2. BO(α(n))
  3. CO(log n)
  4. DO(n)
Hiện các gợi ý
  1. Các cây có thể suy biến.
  2. Hai đáp án sai đã bị gạch bỏ. Một trong hai đáp án còn lại là đúng.
Hiện đáp án và phần giải thích

Vì sao đây là đáp án

Phép hợp ngây thơ có thể nối các cây thành một chuỗi dài, nên find có thể đi theo n − 1 con trỏ cha; hai heuristic đưa nó gần hằng số.

Đáp số

D · O(n)

Câu hỏi thường gặp

Cấu trúc dữ liệu là gì?

Không cấu trúc nào nhanh với mọi thứ. Chọn một cấu trúc nghĩa là chọn thao tác nào nên rẻ. Chi phí của chúng được viết bằng Big O, với n là số phần tử.

Hai khối xây dựng cơ bản là mảng và danh sách liên kết.

Làm thế nào để học Cấu trúc dữ liệu từng bước?
  1. Cấu trúc dữ liệu là gì
  2. Ngăn xếp và hàng đợi
  3. Cây, đống, bảng băm và đồ thị
  4. Phương pháp từng bước
  5. Một ví dụ có lời giải
  6. Lỗi thường gặp
  7. Các câu hỏi thi trông như thế nào
Các bài tập Cấu trúc dữ liệu bao gồm những gì?
  • Dễ: thuật ngữ và kiến thức chính
  • Trung bình: vận dụng khái niệm
  • Khó: tình huống và phân tích

Mỗi câu hỏi có bốn phương án, và chỉ một phương án đúng. Bí rồi? Hãy mở một gợi ý nhỏ trước, và chỉ xem giải thích đầy đủ khi cần.

Cách luyện tập hoạt động

  • Mỗi câu hỏi có bốn phương án, và chỉ một phương án đúng.
  • Bí rồi? Hãy mở một gợi ý nhỏ trước, và chỉ xem giải thích đầy đủ khi cần.
  • Tiến độ, lỗi sai và các bài đã lưu của bạn được giữ lại, để bạn xem lại trước kỳ thi.

Các chủ đề trước và sau chủ đề này

Học trước

Các môn học có chủ đề này

Thêm chủ đề trong Khoa học máy tính

Phiếu bài tập in được