aplikacja Matura google play app store

zadania z informatyki - Analiza algorytmów

Zadanie: 1 2 3 4 5 6 7 8 9 10
Zadanie 10.
Wiązka zadań Dzielenie wielomianu
Rozważamy wielomiany P(x) stopnia n − 1, gdzie n jest potęgą dwójki:
P(x) = a0 + a1x + a2x2 + ... + an–1 xn -1 , n = 2m

Do obliczania wartości P(x) można zastosować technikę „dziel i zwyciężaj” w następujący sposób: dzielimy postać ogólną wielomianu P(x) na dwie części:


gdzie k = n/2. Jeśli w drugiej części wydzielimy czynnik xk, to otrzymamy równość,
(*)P(x) = A(x) + B(x) ⋅ xk
gdzie A(x) i B(x) (są wielomianami stopnia k − 1:
A(x) = ak – 1xk – 1 + ... + a2x2 + a1x + a0
B(x) = an – 1xk – 1 + ... + ak + 2x2 + ak + 1x + ak

W ten sposób problem obliczenia wartości P(x) dzielimy na dwa podproblemy — obliczenia A(x) i obliczenia B(x) przy czym każdy z nich ma rozmiar o połowę mniejszy. Na przykład aby obliczyć wartość wielomianu (n = 8)
P(x) = –8 + 7x + 6x2x3 + 4x4 + 5x5 – 2x6 + 3x7,
obliczamy 
k = n/2 = 4, 
A(x) = –8 + 7x + 6x2x3 
oraz 
B(x) = 4 + 5x – 2x2 + 3x3.

Następnie korzystamy ze wzoru P(x) = A(x) + B(x) ⋅ x4.
Ponieważ do pełnej realizacji algorytmu we wzorze (*) potrzebne jest obliczenie wartości xk więc najpierw obliczamy wszystkie potęgi x, x2, x4, ..., x2m – 1 i zapamiętujemy je w tablicy Z[0 .. m – 1], np. za pomocą poniższej procedury.
Obliczanie tablicy Z[0..m – 1]:

Dane:
n — liczba całkowita postaci 2m, gdzie m jest liczbą całkowitą nieujemną,
x — liczba rzeczywista.
Wynik:
tablica Z[0 ..m – 1], dla której Z[j] = x2j

Z[0] ← x
m ← 1
w ← 2
dopóki w < n wykonuj
Z[m] ← Z[m – 1] ⋅ Z[m – 1]
mm + 1
w ← 2 ⋅ w

Mając tablicę Z, obliczamy wartość P(x) za pomocą funkcji rekurencyjnej F.
Dane:
tablica liczb rzeczywistych T[0..n − 1] ze współczynnikami ܽa0, a1, ..., an – 1, gdzie n = 2m, a m jest liczbą całkowitą nieujemną;
tablica Z[0..m – 1], dla której Z[j] = x2j.
Wynik:
wartość ܽan – 1xn – 1 + ... + a2x2 + a1x + a0.

funkcja F(T[0..n − 1]):
jeżeli n = 1
zwróć T[0] i zakończ
kn/2
A[0..k – 1] ← T[0..k – 1]
B[0..k – 1] ← T[k..n – 1]
zwróć F(A) + F(B) ⋅ Z[m – 1] i zakończ

Prześledźmy na przykład obliczenie wartości wielomianu
P(x) = –8 + 7x + 6x2 – x3 + 4x4 + 5x5 – 2x6 + 3x7, (n = 2m m = 3) dla x = 3.

W pierwszym kroku algorytm obliczy tablicę Z[0..2]:
ܼZ[0] = 3, Z[1] = 32, Z[2] = 34 = 81.

Następnie algorytm obliczy F([-8,7,6,-1,4,5,-2,3]), tzn.
F([-8,7,6,-1,4,5,-2,3]) = F([-8,7,6,-1]) + F([4,5,-2,3])*Z[2]

Obliczanie F([4,5,-2,3]) i F([-8,7,6,-1]) odbywa się w analogiczny sposób, tzn.
F([-8,7,6,-1]) = F([-8,7])+ F([6,-1])*Z[1]
= F([-8])+F([7])*Z[0]+(F([6])+F([-1])*Z[0])*Z[1]
= (-8)+7*Z[0] + (6+(-1)*Z[0])*Z[1]
= (-8)+7*3+(6+(-1)*3)*9 = 40,

F([4,5,-2,3]) = F([4,5])+F([-2,3])*Z[1]
= F([4])+F([5])*Z[0]+(F([-2])+F([3])*Z[0])*Z[1]
= 4+5*Z[0]+((-2)+3*Z[0])*Z[1]
= 4+5*3+((-2)+3*3)*9=82.

Zatem
F([-8,7,6,-1,4,5,-2,3]) = F([-8,7,6,-1])+F([4,5,-2,3])*Z[2] = 40+82*81 = 6682.

Można zauważyć, że podczas obliczania F([-8,7,6,-1,4,5,-2,3]) łącznie zostanie wykonanych 7 mnożeń:
• 3 mnożenia podczas obliczania F([-8,7,6,-1])=40,
• 3 mnożenia podczas obliczania F([4,5,-2,3])=82,
• 1 mnożenie przy obliczaniu F([-8,7,6,-1])+ F([4,5,-2,3])*Z[2] = 40+82*Z[2].

Liczba wszystkich wywołań rekurencyjnych jest równa 15. Oto wszystkie wywołania funkcji F:
• F([-8,7,6,-1,4,5,-2,3])
o F([-8,7,6,-1])
▪ F([-8,7])
• F([-8])
• F([7])
▪ F([6,-1])
• F([6])
• F([-1])
o F([4,5,-2,3])
▪ F([4,5])
• F([4])
• F([5])
▪ F([-2,3])
• F([-2])
• F([3])
Zadanie 10.1.
Podaj, jakie wartości zostaną obliczone w tablicy Z[0 .. m – 1] przy obliczaniu P(2), gdzie
P(x) = 9 + x – 6x3 + 2x7 – 3x14 + 5x15.
Zadanie 10.2.
Oblicz łączną liczbę operacji mnożenia, jaka zostanie wykonana przez funkcję F(T) dla n-elementowej tablicy T. Uzupełnij poniższą tabelkę:

n Liczba operacji mnożenia
1 0
2  
4  
8  
16  
1024  

Uzupełnij poniższy wzór rekurencyjny dla f(n) — liczby operacji mnożenia wykonywanych przez funkcję F dla tablicy n-elementowej: 
f(n) = ......... ⋅ f(n/2) + ................... dla n > 1
Zadanie 10.3.
Wypisz wszystkie wywołania funkcji F podczas obliczania
P(x) = 9 + x – 6x3 + 10x5 + 2x7 + 4x9x10 – 3x14 + 5x15.
Podaj wzór ogólny na g(n) — liczbę wszystkich wywołań funkcji F dla wielomianu P(x) stopnia n − 1, gdzie n jest potęgą dwójki. Uzupełnij poniższy wzór:
g(n) =............................
Zadanie 10.4.
Do obliczania wartości wielomianu P(x)
P(x) = a0 + a1x + a2x2 + ... + an – 1xn – 1
(n = 3m)
a więc gdy n jest potęgą trójki, można zastosować podział na trzy części



gdzie ݇k = n/3. Wówczas uzyskujemy
P(x) = A(x) + B(x) ⋅ xk + C(x) ⋅ x2k = (A(x) + B(x) + C(x) ⋅ xk) ⋅ xk
gdzie A(x), B(x), C(x) są wielomianami, w których liczba współczynników jest trzykrotnie mniejsza niż w wyjściowym wielomianie P(x).

Wzorując się na funkcji F, możemy skonstruować rekurencyjną funkcję G(T[0..n – 1]), obliczającą wartość P(x) przez podział tablicy T na trzy równe części, o ile n > 1. Po obliczeniu trzech wyników dla każdej z części, powiedzmy A(x), B(x), C(x)funkcja oblicza swój wynik, wykonując dodatkowo dwa mnożenia:
• jedno mnożenie przy obliczaniu C(x) ⋅ xk
• jedno mnożenie przy obliczaniu (B(x) + C(x) ⋅ xk) ⋅ xk

Podobnie jak poprzednio pomijamy problem obliczania potęg xk dla k =3j (j ≥ 0), tzn. przyjmujemy, że potęgi te są przechowywane w pewnej tablicy Z[0 .. m – 1], a więc ich obliczanie nie jest wliczane do kosztu obliczeniowego funkcji G.

W ten sposób na przykład dla n = 3 funkcja G wykona dokładnie 2 mnożenia, a dla n = 9 funkcja wykona łącznie 8 mnożeń:
• po 2 mnożenia dla każdej z trzech części A(x), B(x), C(x)
• jedno mnożenie przy obliczaniu C(x) ⋅ xk
jedno mnożenie przy obliczaniu (B(x) + C(x) ⋅ xk) ⋅ xk

Uzupełnij poniższą tabelkę, podając liczbę mnożeń, jaka zostanie wykonana przez funkcję G dla n-elementowej tablicy współczynników T.

n

Liczba operacji mnożenia

3

2

9

8

27

 

81

 

243

 

Poprzednia strona

źródło: CKE
Polityka Prywatności