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>