Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Copying Garbage Collector kiểu Cheney

    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 nnn object (id 1..n1..n1..n), object thứ iii có kích thước sizeisize_isizei​ 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 000 nếu là con trỏ null. Cho rrr 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):

    1. Duyệt lần lượt các gốc theo đúng thứ tự cho trong danh sách gốc; với mỗi gốc chưa từng được sao chép, gán cho nó địa chỉ mới kế tiếp trong to-space (bắt đầu từ 000, các object xếp liên tiếp không khoảng trống — địa chỉ mới của object tiếp theo = địa chỉ mới object trước + kích thước của nó), rồi đẩy vào hàng đợi.
    2. Lặp lại: lấy object ở đầu hàng đợi ra, duyệt lần lượt các trường con trỏ của nó (theo đúng thứ tự trong danh sách trường, bỏ qua con trỏ null); với mỗi trường trỏ tới object chưa từng được sao chép, gán địa chỉ mới kế tiếp cho nó và đẩy vào hàng đợi. Tiếp tục tới khi hàng đợi rỗng.

    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 SSS; sau đó SSS 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ả nnn object −-− tổng kích thước các object còn sống).

    Ví dụ: 333 object: obj111 (size 222, field →2\to 2→2), obj222 (size 333, field →3\to 3→3), obj333 (size 111, không field). Gốc ={1}=\{1\}={1}. Kết quả: obj111 được địa chỉ mới 000, obj222 địa chỉ 222, obj333 địa chỉ 555; không byte nào bị thu hồi (mọi object đều sống).

    • Định dạng đầu vào:

      Dòng 1: nnn (1≤n≤2001 \le n \le 2001≤n≤200). nnn dòng tiếp theo: dòng thứ iii mô tả object iii: size k f1 f2 ... fk (size≥1size \ge 1size≥1, 0≤k≤100 \le k \le 100≤k≤10, mỗi fjf_jfj​ là id object (1..n1..n1..n) hoặc 000). Dòng tiếp theo: rrr (0≤r≤2000 \le r \le 2000≤r≤200). Dòng tiếp theo: rrr số nguyên là id các gốc (nếu r=0r=0r=0, đây là một dòng rỗng).

    • Định dạng đầu ra:

      Dòng 1: số object còn sống SSS. SSS 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...