Union-Find Animation
Một khu rừng phát sáng nơi các nhóm gộp lại và đường đi được ép phẳng: Union-Find với union by size và path compression, sẵn sàng cho bài giảng, slide và blog
.zip · HTML / CSS / JS · v1.0.0
Miễn phí — không cần tài khoản hay email. Luôn là bản mới nhất.
Đang chạy trực tiếp
Giới thiệu
Union-Find dễ hiểu nhất khi bạn tận mắt thấy khu rừng thay đổi. Animation này chạy đúng các hàm
find, union và connected trên trang thuật toán miễn phí, từng bước một: mỗi phần tử là một
quả cầu phát sáng trong một cái cây, union xoay gốc của cây nhỏ sang treo dưới gốc cây lớn, còn
find thắp sáng đường đi lên gốc và, khi có path compression, làm mọi nút nó vừa đi qua bay thẳng
lên treo dưới gốc. Mảng parent[] và size[] nằm ngay dưới khu rừng và đổi theo từng bước, dòng
code đang chạy sáng lên bên cạnh, và một cặp thanh so sánh số bước nhảy con trỏ với cùng danh sách
thao tác đó khi không có path compression.
- Union by size và path compression đúng như đoạn code viết, có công tắc để tắt path compression
- Các biến của đoạn code (
root,node,big,small) lướt trên các quả cầu dưới dạng nhãn nhỏ, nên dòng code nào cũng có thứ để trỏ vào - Ba kịch bản theo seed: nhóm bạn bè, mạng máy tính và trường hợp tệ nhất của union by size, hoặc tự gõ danh sách thao tác của bạn
- Bộ đếm find, số lần gộp và số bước nhảy con trỏ, cùng chi phí của chính danh sách đó khi có và không có path compression
- Trình phát đầy đủ với thanh kéo và tốc độ 0.5×–4×, đẹp khi chiếu slide hay quay video
- Mọi màu sắc, bo góc, font chữ và thời gian đều là CSS custom property; sáng tối theo trang của bạn
- Không cần cài gì: một file CSS và một script, hoặc một component React
Tính năng · 11
- Diễn lại đúng find, union và connected như trên trang thuật toán miễn phí: union by size và lượt thứ hai nén đường đi (path compression)
- Một khu rừng các quả cầu phát sáng: union xoay gốc của cây nhỏ sang treo dưới gốc cây lớn, còn path compression làm mọi nút trên đường đi bay thẳng lên gốc
- find thắp sáng đường đi lên gốc từng bước một, kèm các biến của chính đoạn code (root, node, big, small) lướt theo dưới dạng nhãn nhỏ
- Mảng parent[] và size[] nằm ngay dưới khu rừng, đổi theo từng khung hình; size cũ của các nút không phải gốc được làm mờ, đúng như đoạn code để lại
- Bộ đếm find, số lần gộp và số bước nhảy con trỏ, cùng hai thanh so sánh số bước nhảy khi có và không có path compression trên cùng một danh sách thao tác
- Ba kịch bản theo seed (nhóm bạn bè, mạng máy tính, trường hợp tệ nhất của union by size), hoặc tự gõ thao tác như union 0 1; find 1
- Bật tắt path compression để thấy cùng một danh sách tốn nhiều hay ít bước hơn; khi tắt, những dòng chỉ path compression mới chạy sẽ mờ đi
- Khung code hiện phương thức đang chạy (find, union hoặc connected), kèm ngăn xếp lời gọi ở phía trên
- Trình phát: chạy, dừng, lùi, tiến từng bước, về đầu, kéo thanh thời gian, tốc độ 0.5×–4×, tuỳ chọn lặp lại
- Bản HTML/CSS/JS thuần và bản React (dùng được với Next.js), đủ sáng và tối
- Không phụ thuộc thư viện, khoảng 18 KB sau gzip (cả script lẫn CSS)
Cách dùng
Nhúng stylesheet và script một lần, rồi đặt một phần tử rỗng có data-union-find-animation
ở bất cứ chỗ nào bạn muốn có trình phát:
<link rel="stylesheet" href="union-find-animation.css" />
<script src="union-find-animation.js" defer></script>
<div class="union-find-animation" data-union-find-animation></div>
<div
class="union-find-animation"
data-union-find-animation
data-union-find-animation-scenario="worst-case"
data-union-find-animation-compression="false"
></div>
<div
class="union-find-animation"
data-union-find-animation
data-union-find-animation-operations="union 0 1; union 2 3; union 1 3; find 3"
data-union-find-animation-elements="6"
></div>Tuỳ chọn qua data attribute, đều bắt đầu bằng data-union-find-animation-:
| Attribute | Mặc định | Tác dụng |
|---|---|---|
-scenario |
friend-circles |
friend-circles, network-links hoặc worst-case: danh sách thao tác sẽ chạy |
-operations |
của kịch bản | Danh sách của riêng bạn: union a b, find a và connected a b, cách nhau bằng ;, , hoặc xuống dòng (tối đa 24) |
-elements |
của kịch bản | Số phần tử ban đầu của khu rừng (2–16); tự tăng lên nếu danh sách của bạn nhắc đến nhiều hơn |
-seed |
7 |
Kịch bản dựng danh sách nào: cùng seed luôn ra cùng một danh sách |
-compression |
true |
false để find chạy không có lượt nén đường đi thứ hai |
-speed |
1 |
Từ 0.25 đến 4 |
-autoplay |
true |
Tự chạy khi tải xong (không bao giờ tự chạy khi bật giảm chuyển động) |
-loop |
false |
Dừng một chút ở phần tổng kết rồi chạy lại từ đầu |
-code |
true |
false để ẩn khung code |
-inputs |
true |
false để ẩn các hàng nhập liệu (kịch bản, thao tác, số phần tử, nén đường đi) |
Phần tử thêm vào sau khi trang đã tải: gọi UnionFindAnimation.init(container), hàm này trả về
một hàm để gỡ bỏ. Muốn điều khiển toàn bộ thì dùng
UnionFindAnimation.createUnionFindAnimation(element, options): nó trả về một handle có
setScenario, setOperations(text) (trả về false và báo lý do ngay trên trang khi không đọc được
danh sách), setElements, setCompression, shuffle, player (play, pause, seek…),
trace() và destroy.
Chép UnionFindAnimation.tsx, union-find-animation.css và thư mục core vào dự án của bạn:
import { UnionFindAnimation } from "./UnionFindAnimation";
<UnionFindAnimation />
<UnionFindAnimation scenario="worst-case" compression={false} autoplay={false} />
<UnionFindAnimation operations="union 0 1; union 2 3; find 3" elements={6} loop inputs={false} onFrame={(frame) => console.log(frame.caption)} />Các prop chính là những tuỳ chọn ở trên (scenario, operations, elements, seed,
compression, speed, autoplay, loop, code, inputs), thêm onFrame(frame, index) được gọi
với mỗi khung hình được vẽ. Đổi một prop thì danh sách chạy lại từ đầu. Mọi prop khác được chuyển
cho <div> gốc (className, id, aria-*…). React 18 hoặc 19.
File bắt đầu bằng "use client", nên dùng được từ bất kỳ page hay server component nào. Với App
Router thì không cần làm gì thêm. Với Pages Router, chuyển dòng import CSS vào pages/_app.
Đặt các biến này trên .union-find-animation (hoặc class của riêng bạn):
| Biến | Thay đổi gì |
|---|---|
--ufind-tone-0 … --ufind-tone-7 |
Tám màu của các nhóm (xanh ngọc, tím, hồng, hổ phách, bạc hà, xanh trời, cam, xanh chanh); mỗi nhóm lấy màu theo số của gốc, nên màu đi theo gốc khi nhóm lớn lên |
--ufind-lit, --ufind-hop |
Đường đi mà find đang bước, và nút vừa được trỏ lại |
--ufind-orb |
Màu nền mà mỗi quả cầu được pha vào |
--ufind-bg, --ufind-surface, --ufind-surface-strong, --ufind-blur |
Nền và lớp kính mờ |
--ufind-edge, --ufind-shadow, --ufind-code-bg |
Viền, bóng đổ, nền khung code |
--ufind-text, --ufind-muted, --ufind-on-accent, --ufind-error, --ufind-ring |
Chữ, chữ phụ, chữ trên nhãn và nút có màu, thông báo lỗi, viền focus |
--ufind-font, --ufind-mono |
Font cho chữ và cho code, con số |
--ufind-radius |
Bo góc của trình phát |
--ufind-duration, --ufind-ease |
Quả cầu lướt và bay nhanh hay chậm, mượt đến đâu |
Màu dùng light-dark() nên tự theo color-scheme của trang. Khi bật prefers-reduced-motion,
không có gì tự chạy và khung hình đổi ngay lập tức; mọi nút điều khiển vẫn dùng được.
Hỏi về sản phẩm này
Chưa chắc có hợp dự án của bạn? Cứ hỏi — câu trả lời lấy từ chính trang này.
Lịch sử phiên bản
1.0.0First releaseMới nhất
Plain HTML/CSS/JS and React builds of a step-by-step Union-Find (union by size, path compression) animation: a glowing forest where roots swing under roots and compressed nodes fly up, synced parent and size arrays, live code, hop counters with and without compression, three seeded scenarios or your own operations, player controls, light and dark.
- Bản sửa lỗi và tính năng mới đều có ngay ở nút tải này — file tải về luôn là bản mới nhất.

