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 8 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
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:
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
wielomiany te są stopnia <math>\frac{n}{2}</math> i z własności dzielenia wynika, że
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 38: Linia 35:
== 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:




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


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




<center> <math>A^{[1]}(x_i) = \frac{y_i - A^{[0]}(x_i)}{P(x_i)}
{{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>. </center>
}}




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