Zaawansowane algorytmy i struktury danych/Ćwiczenia 4: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Sank (dyskusja | edycje)
m Zastępowanie tekstu – „,↵</math>” na „</math>,”
 
(Nie pokazano 6 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
== Zadanie 1 (Obliczanie wartości wielomianu w <math>n</math> punktach) ==
== Zadanie 1 (Obliczanie wartości wielomianu w <math>n</math> punktach) ==


Zaproponuj algorytm obliczający wartość wielomiany stopnia <math>n</math>
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 problemu 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:
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:




<center><math>
{{wzor2|1=
A^{[0]}(x) = A(x) \mod \prod_{i=0}^{\frac{n}{2}-1} (x-x_i),
<math>
</math></center>
A^{[0]}(x) = A(x) \mod \prod_{i=0}^{\frac{n}{2}-1} (x-x_i)</math>,
<center><math>
}}
A^{[1]}(x) = A(x) \mod \prod_{i=\frac{n}{2}}^{n-1} (x-x_i),
{{wzor2|1=
</math></center>
<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 dzielenia wynika, że
wielomiany te są stopnia <math>\frac{n}{2}</math> i z własności dzielenia wynika, że


<center>
{{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>
</center>
}}
 
</div>
</div>
</div>
</div>
Linia 35: Linia 37:
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.
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.


<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 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:
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:




<center><math>
{{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></center>
</math>}}
 




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:
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:


<center><math>
{{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></center>




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ć
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ć




<center> <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>. </center>
{{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>.
}}




Linia 73: 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 85: 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 n punktach)

Zaproponuj algorytm obliczający wartość wielomianu stopnia n w n dowolnych punktach w czasie O(nlogn2).

Wskazówka

Zadanie 2 (Obliczanie wielomianu interpolacyjnego)

Dla danego zbioru n par X={(x0,y0),(x1,y1),,(xn1,yn1)} takiego, że wszystkie wartości xi są parami różne, znajdź wielomian interpolacyjny.

Wskazówka

Zadanie 3 (Obliczanie wartości wielomianu dwóch zmiennych)

Dla danych zbiorów n punktów X={x0,,xn1} i Y={y0,,yn1}, oraz wielomianu A(x,y) dwóch zmiennych stopnia n, wyznacz wszystkie wartości A(xi,yj) dla i,j=0,,n1.

Wskazówka