Algorytm Sethi-Ullmana: Różnice pomiędzy wersjami
[wersja nieprzejrzana] | [wersja nieprzejrzana] |
Usunięta treść Dodana treść
Blade BMRQ (dyskusja | edycje) Nie podano opisu zmian |
|||
Linia 1:
'''Algorytm Sethi-Ullmana'''
Jego autorami są [[Ravi Sethi]] oraz [[Jeffrey Ullman]] (stąd nazwa).
=== Przykład problemu ===
Kod:
x = a + (b + (c + (d + x)))▼
▲x = a + (b + (c + (d + x)))
t2 = b
t3 = c
▲Można przekształcić zgodnie z zasadą "wyliczaj najpierw lewą stronę" na:
t2 =
t1 =
x = t1▼
▲Lub też zgodnie z zasadą "wyliczaj najpierw prawą stronę" na:
▲t1 = d + x
▲t1 = c + t1
▲t1 = a + t1
▲x = t1
Dla tego wyrażenia korzystniejsza jest ta druga postać.
=== Algorytm ===
Algorytm Sethi-Ullmana pozwala nam zawsze znaleźć optymalną postać.
Krok pierwszy polega na wyliczeniu ile co najmniej rejestrów tymczasowych jest potrzebnych do wyliczenia poddrzewa:
* każdy liść otrzymuje wartość 0;
* jeśli węzeł ma 2 podwęzły o różnych wartościach, otrzymuje wartość większego z nich;
* jeśli węzeł ma 2 podwęzły o takich samych wartościach, otrzymuje tę wartość plus 1.
Takie ponumerowanie da nam dla przykładowego wyrażenia:
x = a + (b + (c + (d + x)))
[
[
[
Teraz generujemy kod w następujący sposób:
*
**
**
**
**
*
**
**
**
**
Algorytm ten ustali
Oczywiście w praktyce możliwe są inne optymalizacje
[[kategoria:algorytmy]]
[[en:Sethi-Ullman algorithm]]
|