Một trick khi dùng DSU Rollback với xử lý truy vấn chia căn offline
đã đăng vào 6, Tháng 3, 2025, 9:17Trong các bài tập chia căn, đôi lúc chúng ta sử dụng tới CTDL DSU hỗ trợ Rollback, trong CTDL này, chúng ta không nén đường đi tới các nút cha do rollback khiến việc nén này không hiệu quả
Tuy nhiên, với các bài tập chia căn này, chúng ta không quan tâm tới tất cả các thao tác merge, mà chỉ có một số thao tác merge quan trọng cần rollback, vì vậy ta có thể chỉnh CTDL DSU Rollback như sau để cải thiện thời gian chạy
- Với các thao tác merge bình thường (như mở rộng chiều R trong chia căn Mo), ta có thể merge và nén đường đi như cũ
- Ta sẽ có O(căn) thao tác thêm cần rollback, mỗi thao tác sẽ tác động vào tối đa 2 nút (tạm gọi là nút DSU), và chỉ có các nút này bị thay đổi trong quá trình thêm, từ đó ta có ý tưởng đơn giản như sau:
- Duyệt qua O(căn) thao tác thêm, tìm nút DSU đang chứa các nút cần ghép lại
- Lưu danh sách thông tin O(căn) nút DSU này
- Lưu lại thông tin nút DSU của (các) truy vấn
- Thực hiện merge và vẫn nén đường đi như thường với các nút DSU vừa duyệt
- Trả lời truy vấn thông qua các nút DSU
- Với danh sách thông tin đã lưu trên, ta rollback thông tin của O(căn) nút DSU
Phần không-hẳn-là-chứng-minh:
- Với các thao tác merge bình thường, tổng độ phức tạp của chúng sẽ về O(alpha(n))
- Với mỗi O(căn) thao tác merge cần rollback, ta biết các nút DSU luôn là đỉnh cao nhất của các DSU (do ta định nghĩa vậy), việc tìm ra chúng tốn O(alpha(n)) tổng cộng, và mỗi thao tác merge tốn O(1)
- Mỗi thao tác rollback chỉ là gán lại giá trị, vì vậy cũng là O(1), các thao tác rollback này không ảnh hưởng tới việc các nút con tìm tới nút DSU, vì vậy không khiến ta chạy chậm hơn