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 wprowadź n
b zmiennej silnia nadaj wartość 1 c zmiennej i nada j wartość 1
d zmiennej silnia przypisz jej wartość pomnożoną przez i e zwiększ wartość i o 1
f jeżeli i > n idź do g, jeśli nie idź do d g 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>