MƯỜI CHẶNG

Tìm kiếm & Sắp xếp

Một tuần Minh tìm một cuốn sách mất 20 phút. Tuần sau, đúng cuốn đó chỉ mất 20 giây. Cùng thư viện, cùng số sách — vậy điều gì đã đổi?

đào thẳng, không lục lung tung
CHẶNG 1

Chuyện là thế này

Thư viện trường đang xếp sách kiểu "ai trả về đâu thì để đó" — không theo quy tắc nào.

Minh muốn tìm một cuốn cụ thể phải lục qua gần hết các kệ, hết cuốn này tới cuốn khác, mất tới 20 phút.

Tuần sau, cô Hạnh xếp lại toàn bộ sách theo đúng thứ tự bảng chữ cái tên tác giả. Lần sau Minh tìm đúng cuốn đó — chỉ mất 20 giây.

"ai trả về đâu thì để đó"
Không quy tắc nào cả — cuốn nào cũng có thể nằm ở bất kỳ đâu.
CHẶNG 2

Rắc rối xuất hiện

Cùng một thư viện, cùng số sách, cùng một cuốn cần tìm — sao thời gian tìm chênh nhau tới 60 lần?

20 phút 20 giây
Cùng cuốn sách, cùng người tìm — 60 lần chênh lệch chỉ trong một tuần.
CHẶNG 3

Tại sao lại vậy nhỉ?

Số sách không đổi. Người tìm (Minh) cũng không đổi. Vậy điều gì đã thay đổi để tìm nhanh hơn hẳn đến thế?

Cùng sách Cùng Minh ? điều gì khác đi?
Hai thứ giữ nguyên, một thứ đã đổi — chỉ chưa biết là thứ gì.
CHẶNG 4

À!

Không phải Minh "tìm giỏi hơn".

Sách đã được SẮP XẾP TRƯỚC theo một trật tự nhất định — nên khi tìm, có thể bỏ qua hẳn một nửa số kệ mỗi lần thu hẹp phạm vi, thay vì phải lục từng cuốn một.

bỏ qua ngay tìm tiếp ở đây
Đã sắp xếp thì mỗi lần thu hẹp là bỏ hẳn một nửa — không cần dò lại từ đầu.
CHẶNG 5

Gọi tên nó

Việc xếp dữ liệu theo một trật tự nhất định gọi là SẮP XẾP (sorting).

Việc dựa vào trật tự đó để tìm nhanh một mục cụ thể gọi là TÌM KIẾM (searching) — hai việc luôn đi cùng nhau trong máy tính.

SẮP XẾP TÌM KIẾM
Sắp xếp trước — để tìm kiếm sau nhanh hơn hẳn.
CHẶNG 6

Bản chất thật sự

Nếu dữ liệu không được sắp xếp, cách tìm duy nhất là dò lần lượt từng phần tử (tìm kiếm tuần tự) — với N phần tử, tệ nhất phải dò cả N lần.

Nếu dữ liệu ĐÃ được sắp xếp, có thể dùng cách "chia đôi liên tục" (tìm kiếm nhị phân): so với phần tử ở giữa, biết ngay cần tìm ở nửa nào, bỏ hẳn nửa còn lại. Với 1.000 cuốn sách, chỉ cần khoảng 10 lần so sánh là tìm ra, thay vì tối đa 1.000 lần.

Đánh đổi: sắp xếp trước cũng tốn công (một lần) — nhưng bù lại, mọi lần tìm sau đó đều nhanh vượt trội.

1.000 cuốn đã xếp A→Z so với giữa → bỏ một nửa chỉ ~10 bước là tìm ra 1 cuốn
Mỗi lần so sánh loại bỏ hẳn một nửa — không cần dò từng cuốn một.
CHẶNG 7

Một ví dụ khác

Tra một từ trong từ điển giấy: vì từ điển đã sắp theo bảng chữ cái, ta mở đại một trang giữa, so chữ cái đầu, rồi lật về trước hoặc sau — không ai dò tuần tự từng từ từ trang đầu.

mở đại trang giữa
Từ điển đã sắp sẵn theo A-Z — mở giữa, so một chữ, biết ngay lật về hướng nào.
CHẶNG 8

Nếu không có nó thì sao

Không sắp xếp/tìm kiếm hiệu quả, mọi tra cứu trên máy tính (tìm một bài hát trong hàng triệu bài, tìm một sản phẩm trên sàn thương mại điện tử) sẽ chậm tới mức không dùng nổi khi dữ liệu đủ lớn.

dò từng cái một, không sắp xếp đã sắp xếp — trúng ngay
Hàng triệu bài hát, hàng triệu sản phẩm — không sắp xếp trước thì tra cứu không thể nhanh được.
CHẶNG 9

Em đã gặp nó ở đâu rồi

Danh bạ điện thoại luôn hiện theo thứ tự A-Z; công cụ tìm kiếm trên web trả kết quả gần như tức thì dù đang tìm trong hàng tỷ trang.

A — An, Anh... B — Bống M — Minh T — Tùng kết quả hiện gần như tức thì
Cùng một ý tưởng: sắp xếp/đánh chỉ mục trước, để mỗi lần tìm sau đều nhanh.

Tự kiểm tra bản chất

Bấm vào ô em nghĩ là đúng.

1. Nếu 1.000 cuốn sách chưa được sắp xếp, tệ nhất phải dò bao nhiêu cuốn để tìm ra một cuốn cụ thể?

2. Sắp xếp trước cũng tốn công — vậy khi nào KHÔNG đáng bỏ công sắp xếp?

3. Tìm kiếm nhị phân đòi hỏi điều kiện gì trước khi dùng được?

Câu hỏi của em sẽ hiện ở đây, chỉ lưu trên máy của em thôi.

Cuộn nốt xuống dưới nhé — sắp xong trang này rồi!

CHẶNG 10

Kể lại cho bạn trong 30 giây

Tìm nhanh không phải nhờ máy khỏe — mà nhờ dữ liệu đã được sắp xếp sẵn từ trước.