Ćwiczenia ASD 2
(propozycja zadań tablicowych)
1.
Uporządkować
następujące funkcje ze względu na rosnący rząd wielkości:
f1(n) = sqrt(n), f2(n) = lg n, f3(n) = 2 n , f3(n) = 3 n
2.
Badanie
zależności między złożonością , rozmiarem i czasem wykonania algorytmu.
Niech t będzie czasem potrzebnym do wykonania na
komputerze Komp1 pewnego zadania o rozmiarze k przy pomocy algorytmu A,
takiego, że T(A,n) = n 2. Jakiego rozmiaru zadanie można
zrealizować, w tym samym czasie t i przy pomocy tego samego algorytmu, na
komputerze Komp2, który jest 100 razy szybszy? (oczywiście, zmieniając nieco
pytanie lub parametry można otrzymać kilka nowych zadań)
3.
Poprawność
algorytmów. Dla każdego z zaproponowanych zadań zapisać algorytm bez instrukcji
for. Sformułować warunek początkowy
i końcowy. Uzasadnić poprawność. Wskazać niezmienniki. Obliczyć (oszacować)
koszt.
·
A1
- algorytm obliczania iloczynu skalarnego dwóch wektorów a i b.
·
A2
- algorytm obliczania wartości wielomianu z definicji.
·
A3
- algorytm obliczania wartości wielomianu metodą Hornera.
Pozostała
część ćwiczeń powinna być poświęcona ozganizacji projektu, omówieniu menu.
Proszę
też zapowiedzieć wejściówkę na następny tydzień. Będzie ona dotyczyła rzędów
funkcji.
Uwagi
do rozwiązań
Zadanie 1.
Możnaby
np. pokazać przez indukcję, że 2 n
< 3 n dla n>0 i
skorzystać z definicji O, a w przypadku
funkcji f1 i f2 skorzystać z twierdzenia o porównywaniu
rzędów funkcji i policzyć
lim x®µ lg x / Öx = lim (lg x)'/(Öx)' = 0.
Zadanie 2.
Szukamy
takiego x, że na komputerze Komp2 mamy
T(A,x)= x 2 = t. Zadanie o rozmiarze x na komputerze 100 razy
wolniejszym zajmie 100 razy więcej czasu, zatem wykonanie zadania o rozmiarze x na komputerze Komp1 zajmie 100t czasu. Prowadzi to do równości 100t = x 2. Z warunków zadania wiemy, że T(A,k)= k 2= t. Czyli ostatecznie x 2 = 100 k 2
, a więc x = 10 *k.
Zadanie 3.
Ad.3.3 Algorytm
Hornera
Niech
p(x) będzie wielomianem a[0] x 0 + .... + a[n] x n. Wtedy
można go przedstawić jako: p(x) = a[0] + x(a[1] + x( a[2] + ... + x( a[n-1] + x
a[n])...)
Algorytm
(ma liczyć wartość wielomianu w punkcie x0) można zapisać następująco:
{ wynik := a[n]; i := n;
while i>0 do /*niezmiennik wynik
= Suma{ a[j] * x0 j-i : j
=i...n}
i := i-1;
wynik := a[i ] + x0 * wynik;
od;
}