Bộ thu gom rác kiểu copying (Cheney's algorithm) chia bộ nhớ thành hai nửa (from-space / to-space); mỗi lần GC, nó sao chép toàn bộ object còn sống từ from-space sang to-space theo thứ tự duyệt theo chiều rộng (BFS) bắt đầu từ các gốc (root), rồi cập nhật lại con trỏ — nhờ đó vùng nhớ được dồn nén (compact), không còn phân mảnh, đồng thời rác được thu hồi trong một lượt duyệt duy nhất.
Cho n object (id 1..n), object thứ i có kích thước sizei byte và một danh sách trường con trỏ (fields) — mỗi trường trỏ tới id một object khác, hoặc 0 nếu là con trỏ null. Cho r gốc (id các object được biến/stack trỏ trực tiếp tới, có thể lặp lại).
Hãy mô phỏng chính xác thuật toán Cheney (dùng một hàng đợi FIFO):
Object nào không bao giờ được gán địa chỉ mới (không tới được từ gốc) là rác, bị thu hồi.
Yêu cầu: in số lượng object còn sống S; sau đó S dòng, mỗi dòng "id địa_chỉ_mới" theo đúng thứ tự được gán địa chỉ (thứ tự duyệt BFS ở trên); dòng cuối in tổng số byte được thu hồi (= tổng kích thước tất cả n object − tổng kích thước các object còn sống).
Ví dụ: 3 object: obj1 (size 2, field →2), obj2 (size 3, field →3), obj3 (size 1, không field). Gốc ={1}. Kết quả: obj1 được địa chỉ mới 0, obj2 địa chỉ 2, obj3 địa chỉ 5; không byte nào bị thu hồi (mọi object đều sống).
Dòng 1: n (1≤n≤200). n dòng tiếp theo: dòng thứ i mô tả object i: size k f1 f2 ... fk (size≥1, 0≤k≤10, mỗi fj là id object (1..n) hoặc 0). Dòng tiếp theo: r (0≤r≤200). Dòng tiếp theo: r số nguyên là id các gốc (nếu r=0, đây là một dòng rỗng).
Dòng 1: số object còn sống S. S dòng tiếp theo: "id địa_chỉ_mới" theo thứ tự được gán địa chỉ. Dòng cuối: tổng số byte thu hồi.
Ví dụ:
Đầu vào:
3
2 1 2
3 1 3
1 0
1
1
Đầu ra:
3
1 0
2 2
3 5
0
Đầu vào:
4
4 1 2
2 0
5 1 4
1 0
1
1
Đầu ra:
2
1 0
2 4
6
Đang tải editor...