Zaawansowane algorytmy i struktury danych/Ćwiczenia 4: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
m Zastępowanie tekstu – „,↵</math>” na „</math>,” |
|||
(Nie pokazano 12 wersji utworzonych przez 3 użytkowników) | |||
Linia 1: | Linia 1: | ||
== Zadanie 1 (Obliczanie wartości wielomianu w <math>n</math> | == Zadanie 1 (Obliczanie wartości wielomianu w <math>n</math> punktach) == | ||
punktach) == | |||
Zaproponuj algorytm obliczający wartość | Zaproponuj algorytm obliczający wartość wielomianu stopnia <math>n</math> | ||
w <math>n</math> dowolnych punktach w czasie <math>O(n \log n^2</math>. | w <math>n</math> dowolnych punktach w czasie <math>O(n \log n^2)</math>. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> '''Wskazówka''' | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Pomysłem na rozwiązanie jest sprowadzenie | Pomysłem na rozwiązanie jest sprowadzenie zagadnienia do dwóch mniejszych problemów. Można to zrobić wykorzystując algorytm dzielenia wielomianów. Niech <math>X = \{x_0, \ldots, x_{n-1}\}</math> będzie zbiorem punktów w których chcemy obliczyć wartość wielomianu. Dla wielomianu <math>A(x)</math> zdefiniujmy dwa nowe wielomiany: | ||
mniejszych problemów. Można to zrobić wykorzystując algorytm | |||
dzielenia wielomianów. Niech <math>X = \{x_0, \ldots, | |||
x_{n-1}\}</math> będzie zbiorem punktów w których chcemy obliczyć | |||
wartość wielomianu. Dla wielomianu <math>A(x)</math> zdefiniujmy dwa | |||
nowe wielomiany: | |||
{{wzor2|1= | |||
A^{[0]}(x) = A(x) \mod \prod_{i=0}^{\frac{n}{2}-1} (x-x_i) | <math> | ||
</math> | A^{[0]}(x) = A(x) \mod \prod_{i=0}^{\frac{n}{2}-1} (x-x_i)</math>, | ||
}} | |||
A^{[1]}(x) = A(x) \mod \prod_{i=\frac{n}{2}}^{n-1} (x-x_i) | {{wzor2|1= | ||
</math> | <math> | ||
A^{[1]}(x) = A(x) \mod \prod_{i=\frac{n}{2}}^{n-1} (x-x_i)</math>, | |||
}} | |||
wielomiany te są stopnia <math>\frac{n}{2}</math> i z własności | wielomiany te są stopnia <math>\frac{n}{2}</math> i z własności dzielenia wynika, że | ||
dzielenia wynika, że | |||
{{wzor2|1= | |||
<math>A(x_i) = A^{[0]}(x_i)</math> dla <math>i | <math>A(x_i) = A^{[0]}(x_i)</math> dla <math>i | ||
= 0, \ldots, \frac{n}{2}-1</math> | = 0, \ldots, \frac{n}{2}-1</math>}} | ||
{{wzor2|1= | |||
<math>A(x_i) = A^{[1]}(x_i)</math> dla <math>i | <math>A(x_i) = A^{[1]}(x_i)</math> dla <math>i | ||
= \frac{n}{2}, \ldots, n-1</math> | = \frac{n}{2}, \ldots, n-1</math> | ||
}} | |||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 2 (Obliczanie wielomianu interpolacyjnego) == | == Zadanie 2 (Obliczanie wielomianu interpolacyjnego) == | ||
Dla danego zbioru <math>n</math> par | Dla danego zbioru <math>n</math> par <math>X = \{(x_0, y_0), (x_1, y_1), \ldots, (x_{n-1},y_{n-1})\}</math> takiego, że wszystkie wartości <math>x_i</math> są parami różne, znajdź wielomian interpolacyjny. | ||
<math>X = \{(x_0, y_0), (x_1, y_1), \ldots, | |||
(x_{n-1},y_{n-1})\}</math> takiego, że wszystkie wartości | |||
<math>x_i</math> są parami różne, znajdź wielomian interpolacyjny. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> '''Wskazówka''' | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Podobnie jak w Zadaniu 1 należy sprowadzić problem do dwóch | Podobnie jak w Zadaniu 1 należy sprowadzić problem do dwóch mniejszych. Najpierw liczymy rekurencyjne wielomian <math>A^{[0]}(x)</math> stopnia <math>\frac{n}{2}</math> interpolujący zbiór punktów <math>X^{[0]} = \{(x_0, y_0), (x_1, y_1), \ldots,(x_{\frac{n}{2}-1},y_{\frac{n}{2}-1})\}</math>. Następnie obliczamy wartości <math>A^{[0]}(x)</math> dla zbioru punktów \{x_{\frac{n}{2}-1,\ldots, x_{n-1}}\}, korzystając z wyników Zadania 1. Musimy teraz skonstruować następujący wielomian: | ||
mniejszych. Najpierw liczymy rekurencyjne wielomian | |||
<math>A^{[0]}(x)</math> stopnia <math>\frac{n}{2}</math> | |||
interpolujący zbiór punktów <math>X^{[0]} = \{(x_0, y_0), (x_1, | |||
y_1), \ldots,(x_{\frac{n}{2}-1},y_{\frac{n}{2}-1})\}</math>. | |||
Następnie obliczamy wartości <math>A^{[0]}(x)</math> dla zbioru | |||
punktów \{x_{\frac{n}{2}-1,\ldots, x_{n-1}}\} korzystając z wyników | |||
Zadania 1. Musimy teraz skonstruować następujący wielomian: | |||
{{wzor2|1=<math> | |||
P(x) = \prod_{i=0}^{\frac{n}{2}-1} (x-x_i). | P(x) = \prod_{i=0}^{\frac{n}{2}-1} (x-x_i). | ||
</math> | </math>}} | ||
Ponownie korzystając z wyników Zadania 1 obliczamy wartości | Ponownie korzystając z wyników Zadania 1, obliczamy wartości <math>P(x)</math> dla zbioru punktów \{x_{\frac{n}{2}-1,\ldots, x_{n-1}}\}. Szukany wielomian skonstruujemy jako: | ||
<math>P(x)</math> dla zbioru punktów \{x_{\frac{n}{2}-1,\ldots, | |||
x_{n-1}}\}. Szukany wielomian skonstruujemy jako | |||
{{wzor2|1=<math> | |||
A(x) = A^{[0]}(x) + P(x) A^{[1]}(x) | A(x) = A^{[0]}(x) + P(x) A^{[1]}(x)</math>,}} | ||
</math> | |||
gdzie <math>A^{[1]}</math> to nieznany wielomian stopnia | gdzie <math>A^{[1]}</math> to nieznany wielomian stopnia <math>\frac{n}{2}</math>. Z konstrukcji wynika, że <math>A(x)</math> jest wielomianem interpolacyjnym dla zbioru <math>X^{[0]}</math>. Zauważmy, że aby znaleźć <math></math> musimy ponownie rozwiązać problem interpolacyjny. Dla <math>A^{[1]}(x)</math> musi zachodzić | ||
<math>\frac{n}{2}</math>. Z konstrukcji wynika, że <math>A(x)</math> | |||
jest wielomianem interpolacyjnym dla zbioru <math>X^{[0]}</math>. | |||
Zauważmy, że aby znaleźć <math></math>musimy ponownie rozwiązać | |||
problem interpolacyjny. Dla <math>A^{[1]}(x)</math> musi zachodzić | |||
{{wzor2|1=<math>A^{[1]}(x_i) = \frac{y_i - A^{[0]}(x_i)}{P(x_i)}</math> dla <math>i = \frac{n}{2},\ldots,n-1</math>. | |||
</math> dla <math>i = \frac{n}{2},\ldots,n-1</math>. | }} | ||
Musimy więc teraz ponownie rozwiązać problem rozmiaru | Musimy więc teraz ponownie rozwiązać problem rozmiaru <math>\frac{n}{2}</math>. Ostatecznie dostajemy algorytm o złożoności O(n \log^3 n). | ||
<math>\frac{n}{2}</math>. Ostatecznie dostajemy algorytm o | |||
złożoności O(n \log^3 n). | |||
</div> | </div> | ||
Linia 100: | Linia 74: | ||
dla <math>i,j = 0,\ldots, n-1</math>. | dla <math>i,j = 0,\ldots, n-1</math>. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> '''Wskazówka''' | <div class="mw-collapsible mw-made=collapsible mw-collapsed">'''Wskazówka''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Zauważmy, że wielomian <math>A(x,y)</math> jest postaci | Zauważmy, że wielomian <math>A(x,y)</math> jest postaci | ||
Linia 112: | Linia 86: | ||
<math>B_i(y)</math> jego wartości w punktach <math>Y = \{y_0, | <math>B_i(y)</math> jego wartości w punktach <math>Y = \{y_0, | ||
\ldots, y_{n-1}\}</math>. Zajmuje nam to czas <math>O(n^2 \log^2 | \ldots, y_{n-1}\}</math>. Zajmuje nam to czas <math>O(n^2 \log^2 | ||
n)</math>. Wartości te możemy wstawić do [[#wzor_1|(1)]] otrzymując | n)</math>. Wartości te możemy wstawić do [[#wzor_1|(1)]], otrzymując | ||
<math>n</math> wielomianów <math>x</math>'a, których wartości | <math>n</math> wielomianów <math>x</math>'a, których wartości | ||
musimy policzyć w <math>n</math> punktach. Ponownie zajmuje nam to czas | musimy policzyć w <math>n</math> punktach. Ponownie zajmuje nam to czas |
Aktualna wersja na dzień 21:49, 11 wrz 2023
Zadanie 1 (Obliczanie wartości wielomianu w punktach)
Zaproponuj algorytm obliczający wartość wielomianu stopnia w dowolnych punktach w czasie .
Wskazówka
Zadanie 2 (Obliczanie wielomianu interpolacyjnego)
Dla danego zbioru par takiego, że wszystkie wartości są parami różne, znajdź wielomian interpolacyjny.
Wskazówka
Zadanie 3 (Obliczanie wartości wielomianu dwóch zmiennych)
Dla danych zbiorów punktów i , oraz wielomianu dwóch zmiennych stopnia , wyznacz wszystkie wartości dla .
Wskazówka