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] Số thanh ghi tạm tối thiểu theo thuật toán gán nhãn Sethi–Ullman

    Cho một biểu thức số học dạng trung tố chỉ gồm: biến (định danh chữ cái/số/_, bắt đầu bằng chữ cái hoặc _), hằng số nguyên không âm, các phép toán hai ngôi + - * / (không có phép trừ một ngôi), và cặp ngoặc đơn. Độ ưu tiên: ngoặc cao nhất; *, / (ngang hàng, kết hợp trái); thấp nhất +, - (ngang hàng, kết hợp trái).

    Biểu diễn biểu thức dưới dạng cây nhị phân biểu thức (mỗi toán hạng là một lá, mỗi toán tử là một nút trong có đúng 2 con). Áp dụng thuật toán gán nhãn Sethi–Ullman để xác định số thanh ghi (biến tạm) tối thiểu đủ để sinh mã đánh giá biểu thức mà không cần lưu tạm ra bộ nhớ (spill), theo công thức đệ quy kinh điển: label(laˊ)=1\text{label(lá)} = 1label(laˊ)=1 label(nuˊt)={max⁡(l1,l2)neˆˊu l1≠l2l1+1neˆˊu l1=l2\text{label(nút)} = \begin{cases} \max(l_1, l_2) & \text{nếu } l_1 \ne l_2 \\ l_1 + 1 & \text{nếu } l_1 = l_2 \end{cases}label(nuˊt)={max(l1​,l2​)l1​+1​neˆˊu l1​=l2​neˆˊu l1​=l2​​ trong đó l1,l2l_1, l_2l1​,l2​ là nhãn của hai cây con (thứ tự không quan trọng).

    Ví dụ: với (a+b)+(c+d), cây con trái a+b có nhãn 222 (hai lá cùng nhãn 111), cây con phải c+d cũng có nhãn 222; vì hai nhãn bằng nhau, nút gốc có nhãn 2+1=32+1=32+1=3. Số nút trong (số lệnh TAC cần sinh) là 333.

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

      Một dòng duy nhất chứa biểu thức (có thể có khoảng trắng xen giữa, cần bỏ qua).

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

      In 2 dòng: SO_THANH_GHI_TOI_THIEU = <nhan Sethi-Ullman cua nut goc> SO_LENH_TAC = <so nut trong cua cay, tuc so luong toan tu trong bieu thuc>

    Ví dụ:

    Đầu vào:

    a+b
    

    Đầu ra:

    SO_THANH_GHI_TOI_THIEU = 2
    SO_LENH_TAC = 1
    

    Đầu vào:

    a
    

    Đầu ra:

    SO_THANH_GHI_TOI_THIEU = 1
    SO_LENH_TAC = 0
    

    Đang tải editor...