Một trong những bài toán kinh điển của sinh mã tối ưu là xác định số thanh ghi tối thiểu cần thiết để đánh giá một biểu thức số học mà không cần lưu tạm (spill) bất kỳ giá trị trung gian nào ra bộ nhớ. Thuật toán Sethi–Ullman giải bài toán này bằng cách gán nhãn (label) cho từng nút của cây cú pháp biểu thức theo quy tắc quy nạp:
Nhãn của gốc cây chính là số thanh ghi tối thiểu cần thiết. Cho một biểu thức viết dưới dạng tiền tố (prefix), gồm các token cách nhau bởi khoảng trắng: lá là một chữ cái thường (a-z) hoặc một số nguyên không âm; toán tử hai ngôi thuộc {+,−,∗,/} (mỗi toán tử luôn có đúng hai toán hạng ngay sau nó theo ngữ nghĩa tiền tố). Hãy tính nhãn Sethi–Ullman của gốc cây.
Ví dụ: biểu thức + a * b c (nghĩa là a+b×c): lá a, b, c đều có nhãn 1; nút * b c có hai con cùng nhãn 1 nên nhãn là 1+1=2; nút gốc + có con trái nhãn 1, con phải nhãn 2, khác nhau nên nhãn là max(1,2)=2. Kết quả: 2.
Một dòng duy nhất chứa biểu thức tiền tố hợp lệ như mô tả ở trên, các token cách nhau bởi khoảng trắng, tối đa 2000 token.
In ra một số nguyên duy nhất — nhãn Sethi–Ullman (số thanh ghi tối thiểu) của gốc cây.
Ví dụ:
Đầu vào:
a
Đầu ra:
1
Đầu vào:
+ a * b c
Đầu ra:
2
Đang tải editor...