ELEMENTY ANALIZY ALGORYTMÓW 1. Każdy algorytm

advertisement
ELEMENTY ANALIZY ALGORYTMÓW
1. Każdy algorytm powinien wykazywać następujące cechy:

poprawność – rozwiązuje zadany problem, dla którego go utworzono

skończoność – realizuje program dla wszystkich danych

złożoność i efektywność – rozwiązuje problem dobrze wykorzystując zasoby sprzętowe.
2. Poprawność:

całkowita poprawność – dla wszystkich danych wejściowych obliczenia zostaną
zakończone

częściowa poprawność – dla wszystkich danych, dla których obliczenia się zakończą
wyniki będą poprawne.

dobra określoność – polecenia i operacje są zrozumiałe dla użytkownika i kolejność
jest właściwie określona

uniwersalność – związana jest z problemem, który algorytm rozwiązuje,
umożliwienie rozwiązania wszystkich zadań zgodnych ze specyfikacją problemu.
Przykład: Analiza algorytmu iteracyjnie (wielokrotne powtarzanie) rozwiazującego
a
b
c
d
e
f
g
wprowadź n
zmiennej silnia nadaj wartość 1
zmiennej i nada j wartość 1
zmiennej silnia przypisz jej wartość pomnożoną przez i
zwiększ wartość i o 1
jeżeli i > n idź do g, jeśli nie idź do d
wyprowadź wynik: silnia
Dla każdej wprowadzone danej wynik silnia spełnia warunek końcowy, dla wszystkich
wprowadzonych danych obliczenia kończą się. Ewentualne przyszłe sygnalizowane przez
program błędy będą konsekwencją tylko i wyłącznie złego zapisu w konkretnym języku
programowania (składniowe, nie logiczne)
Implementacja w JavaScript:
function Silnia_I(n)
{
wynik = 1;
for (k = 1; k <= n; ++k)
{
wynik *= k;
}
return wynik;
}
Zadanie. Sprawdź działanie algorytmu dla n = 5.
3. Skończoność algorytmu polega na tym, że algorytm gwarantuje rozwiązanie problemu
w skończonej liczbie kroków. Poniższy algorytm ma za zadanie wypisać wszystkie liczby
naturalne nieparzyste z zadanego przedziału:
podaj a
podaj b
sprawdź nieparzystość a
dopóki a parzyste wykonuj
zwiększ wartość a o 2
wypisz a
Brakuje sprawdzenia nieparzystości a na początku. Pętla nie znajdując nieparzystego a
będzie w nieskończoność dodawać 2. Należałoby po sprawdzeniu nieparzystości i uzyskaniu
wartości logicznej 0 dodać jeden do bieżącej wartości a.
4.
Zadanie: Podaj własny przykład błędnego, nieskończonego algorytmu.
5. Złożoność obliczeniowa algorytmu – zależy od liczby niezbędnych do ukończenia działania
operacji. Zależy od wielkości zbioru danych, na jakich pracuje algorytm. Np. Wypisywanie
elementów bez powtórzeń wymaga obok zdefiniowania samej tablicy wymaga kilku
kroków: wylosowanie, zaokrąglenia, sprawdzenia wartości logicznych wyrażeń, wypisanie.
Podstawowe operacje to losowanie i porównanie. Zwiększenie ilości wymiarów tablicy
spowoduje zwiększenie liczby kroków.
<script type="text/javascript">
<!-- <![CDATA[
ile = 6; // ile elementów losujemy
elementy = new Array(
'jeden',
'dwa',
'trzy',
'cztery',
'pięć',
'sześć',
'siedem',
'osiem',
'dziewięć',
'dziesięć'
);
l=new Array();
for (i=0;i<ile;i++) {
los = Math.round(Math.random()*(elementy.length-1));
jest = false;
for (j=0;j<l.length;j++) if (l[j]==los) jest=true;
if (jest) i--; else l[i] = los;
}
for (i=0;i<ile;i++) document.write(elementy[l[i]]+" ");
// ]]> -->
</script>
6. Zadanie: Powyższą implementację w JavaScript zapisz w postaci pseudojęzyka (jak w
punkcie2).
7. Złożoność pamięciowa to wielkość pamięci niezbędna do wykonania, czyli wielkość
pamięci zajmowana przez zmienne i pliki programu. Szczególnie obciążają pamięć
algorytmy rekurencyjne (odwołujące się do samej siebie). Dane są układane na stos (liniowa
struktura danych, ww której dane są układane na „wierzch” i z niego pobierane. Wielkość
zajmowanej pamięci zależy od głębokości rekurencji.
8. Efektywność algorytmu polega na tym, że rozwiązuje on dany problem w możliwie
najmniejszej liczbie kroków, co przekłada się na czas, i przy najmniejszym obciążeniu
pamięci. Ocenia się ją w praktyce. Dobrym przykładem może być przeszukiwanie zbioru
liczb naturalnych w poszukiwaniu liczb pierwszych – podniesienie górnej granicy
wyszukiwania znacząco wpłynie na czas pracy, gdyż liczba operacji rośnie znacząco.
9. Przykłady algorytmów zawierających błędy – znajdź je:

algorytm sprawdzający czy słowo jest palindromem:
1. znajdź ilość liter słowa n
2. sprawdź czy f (n) = f (1), gdzie f (n) to litera na n-tej pozycji
3. sprawdź czy dla każdego k < n/2 jest spełniony warunek: f (k) = f (n – k)
4. jeżeli 2 i 3 spełnione to jest to palindrom

algorytm sortowania bąbelkowego:
1. wczytaj elementy do tablicy (jednowymiarowej) o rozmiarze n
2. dla wszystkich par sąsiednich elementów sprawdź czy t[i] > t[i-1] - jeśli
nie zamień je miejscami
3. powtórz procedurę z punktu 2 n razy
4. wypisz posortowane elementy
Przykład sortowania bąbelkowego w JavaScript
<html>
<head> </head>
<body>
<input onclick="main()" type="button" value="Sortuj" name="B1">
<p id="t_out" style="TEXT-ALIGN: center">...</p>
<script language=javascript>
var N = 20; // Liczebność zbioru.
function main()
{
var d = new Array(N);
var i,j,x,t;
//losowanie n liczb do tablicy
for(i = 0; i < N; i++) d[i] = Math.floor(Math.random() * 100);
t = "Przed sortowaniem:<BR><BR>";
for(i = 0; i < N; i++) t += d[i] + " ";
t += "<BR><BR>";
// sortowanie
for(j = 0; j < N - 1; j++)
for(i = 0; i < N - 1; i++)
if(d[i] > d[i + 1])
{
x = d[i]; d[i] = d[i + 1]; d[i + 1] = x;
};
// wyświetlenie wynik sortowania
t += "Po sortowaniu:<BR><BR>";
for(i = 0; i < N; i++) t += d[i] + " ";
document.getElementById("t_out").innerHTML = t;
}
</script>
</body>
</html>
Uwaga: Metoda GetElementById() daje dostęp do elementów dokumentu, zwraca jako wartość
obiekt.
Kod JavaScript sprawdzający czy dane słowo jest palindromem:
<html>
<head>
<script language=javascript>
function sprawdz()
{
// odczytanie wprowadzonych danych
var s = document.form1.wyraz.value;
var i = 0; // numer pierwszego znaku
var j = s.length-1; // numer ostatniego znaku
while(i<j)
{
if(s.charAt(i)!=s.charAt(j))
{ // znaki różnią się
alert("Nie");
return;
}
// sprawdzamy dalej
i++; j--;
}
// sprawdzenie dobiegło pomyślnie do końca
alert("Tak");
}
</script>
</head>
<body>
<h1 align=center>Palindromy</h1>
<center>
<form name=form1>
Podaj wyraz: <input type=text size=30 name=wyraz>
<br><br>
<input type=button value="Sprawdź czy jest palindromem" onClick=sprawdz()>
</form>
</center>
</body>
</html>
Download