Podział algorytmów ze względu na obszar

Transkrypt

Podział algorytmów ze względu na obszar
Podział algorytmów ze względu na obszar zastosowań.
• algorytmy numeryczne (matematyczne) – wykonują obliczenia arytmetyczne,
• algorytmy przeszukujące – badają zbiór w celu wyszukania wyróżnionego elementu,
• algorytmy porządkujące – ustawiają elementy zbioru, wymaganej kolejności,
• algorytmy rekurencyjne – rozwiązują problemy, które da się rozbić na mniejsze części,
stanowiące kopie wzorca,
• algorytmy szyfrujące – zmieniają dane tak, by ich odczyt nie był możliwy bez znajomości
klucza kodującego,
• algorytmy kompresji danych – określają taki sposób zapisu danych, by zmniejszyć
objętość pliku kompresowanego,
Złożoność algorytmów.
Teoria złożoności jest to nauka której głównym celem jest określanie ilości zasobów potrzebnych
do rozwiązania problemów obliczeniowych. Rozważanymi zasobami są takie wielkości jak czas,
pamięć lub liczba procesorów.
Złożoność algorytmów
Ilość zasobów niezbędnych do wykonania algorytmu można rozumieć jako jego złożoność. W
zależności od rozważanego zasobu mówimy o złożoności czasowej czy też pamięciowej.
Oczywiście w większości wypadków ilość potrzebnych zasobów będzie się różnić w zależności od
danych wejściowych z zakresu danego zagadnienia. Złożoność algorytmu jest więc funkcją
rozmiaru danych wejściowych.
Kolejnym problemem jest fakt, iż złożoność zwykle nie zależy wyłącznie od rozmiaru danych, ale
może się znacznie różnić dla danych wejściowych o identycznym rozmiarze. Dwoma często
stosowanymi sposobami podejścia są: rozpatrywanie przypadków najgorszych (złożoność
pesymistyczna) oraz zastosowanie określonego sposobu uśrednienia wszystkich możliwych
przypadków (złożoność oczekiwana). Ostatnim sposobem najrzadziej używanym jest szacowanie
(złożoność optymistycznej) czyli złożoności obliczonej dla przypadku najkorzystniejszego dla
danego algorytmu.
Operacja elementarna (dominująca) – w teorii obliczeń operacja charakterystyczna dla danego
algorytmu, na ogół zajmująca w nim najwięcej czasu. Za jednostkę złożoności czasowej przyjmuje
się wykonanie jednej operacji elementarnej.
Złożoność czasowa Przyjętą miarą złożoności czasowej jest liczba operacji podstawowych w
zależności od rozmiaru wejścia. Dlatego w charakterze czasu wykonania rozpatruje się zwykle
liczbę operacji podstawowych (dominujących). Operacjami podstawowymi mogą być na przykład:
podstawienie, porównanie lub prosta operacja arytmetyczna. Algorytmy analizuje się,
wykorzystując abstrakcyjne modele obliczeń. Nie uwzględniając specyfiki sprzętu ni języka
programowania.
Złożoność pamięciowa jest miarą ilości wykorzystanej pamięci. Jako tę ilość najczęściej przyjmuje
się użytą pamięć maszyny abstrakcyjnej w funkcji rozmiaru wejścia. Możliwe jest również
obliczanie rozmiaru potrzebnej pamięci fizycznej wyrażonej w bitach lub bajtach.
Porównywanie złożoności algorytmów przy porównywaniu bierzemy jak zachowuje się funkcja
określająca złożoność dla odpowiednio dużych, granicznych argumentów (rozmiarów danych
wejściowych) ignorując zachowanie dla małych danych. Ponadto złożoności algorytmów różniące
się o stałą uważamy za takie same, co eliminuje wpływ szybkości działania komputera, na którym
dany algorytm ma być wykonany.
Klasa złożoności problemy, do rozwiązania których potrzebna jest podobna ilość zasobów łączymy
w klasy. Przykładowo mówimy o problemach o liniowej złożoności pamięciowej, jeśli ilość
potrzebnej pamięci rośnie liniowo względem rozmiaru danych; czy też o problemach o
kwadratowej złożoności czasowej, jeśli liczba operacji podstawowych rośnie z kwadratem rozmiaru
danych. Podobne określenia stosujemy do algorytmów.
Rzędy złożoności czasowej(obliczeniowej)
Złożoność czasowa
Opis
O(1)
stała złożoność – algorytm wykonuje się w stałej ilości operacji,
najszybszy
niezależnie od liczby danych wejściowych.
O(log2(n))
złożoność logarytmiczna – algorytm wykonuje logarytmiczną ilość
operacji w stosunku do liczby danych wejściowych.
bardzo
*n
jest
to
liczba
danych
wejściowych;
szybki
*podstawa logarytmu zazwyczaj wynosi 2, jednak czasami może być
większa (np. w B-drzewach).
O(n)
złożoność liniowa – algorytm wykonuje wprost proporcjonalną ilość
operacji
do
liczby
danych
wejściowych.
szybki
*n jest to liczba danych wejściowych.
O(n*log2(n))
złożoność
liniowo-logarytmiczna
*n jest to liczba danych wejściowych.
O(n2)
złożoność kwadratowa – ilość operacji algorytmu jest wprost
proporcjonalna do liczby danych wejściowych podniesionej do potęgi niezbyt
drugiej.
szybki
*n jest to liczba danych wejściowych.
O(nX)
Szybkość
szybki
złożoność wielomianowa – ilość operacji algorytmu jest wprost
proporcjonalna do liczby danych wejściowych podniesionej do potęgi
X.
*n
jest
to
liczba
danych
wejściowych;
*X
jest
stałą
o
dowolnej
wartości.
wolny
Uwaga!
Pamiętaj, że zarówno funkcja liniowa jak i funkcja kwadratowa są również
wielomianami. W informatyce posługując się terminem złożoności
wielomianowej zazwyczaj mamy na myśli algorytmy, których złożoność
obliczeniowa (lub pamięciowa) jest co najmniej kwadratowa.
O(Xn)
złożoność wykładnicza – ilość operacji algorytmu jest wprost
proporcjonalna do stałej X większej lub równej 2, podniesionej do
bardzo
potęgi
równej
liczbie
danych
wejściowych.
wolny
*n
jest
to
liczba
danych
wejściowych;
*X jest stałą większą niż 2.
Narzędzia programistyczne.
Podstawowe narzędzia programistyczne to:
•
Edytor
•
Debugger.
•
Zintegrowane środowisko programistyczne (IDE)
Edytor programistyczny – do tworzenia programu można użyć dowolny edytor tekstu np.
Notatnik w Winows. Vi, Nano Pico w Linux Text w Macintosch. Jednakże pisząc program należy
kontrolować składnię języka itd. więc często wykorzystuje się wyspecjalizowane edytory kodu
źródłowego.
Edytor kodu źródłowego to program komputerowy wspomagający pisanie kodu źródłowego.
Rozpoznaje i wyróżnia składnie (np. poprzez nadawanie koloru czy kroju czcionki) i zapisuje w
odpowiednim formacie. Często ma dodatkowe funkcję jak: auto uzupełnianie kodu, możliwość
pisania makr, itp. Może stanowić samodzielny program lub być częścią zintegrowanego środowiska
programistycznego.
Przykładowy edytor dla Windows to Notepad++ pozwalający na pracę w C,C++,Java, C#
JavaScript, VB, ASP
Debug tool, Debugger (po polsku - program do usuwania błędów, czytaj dibager - z ang.
odpluskwiacz) – program komputerowy służący do analizy innych programów, w celu odnalezienia
i identyfikacji zawartych w nich błędów, zwanych z angielskiego bugami (robakami). Proces
nadzorowania wykonania programu za pomocą debuggera określa się mianem debugowania.
Podstawowym zadaniem debuggera jest sprawowanie kontroli nad wykonaniem kodu, co
umożliwia zlokalizowanie instrukcji odpowiedzialnych za wadliwe działanie programu.
Współczesne debuggery pozwalają na efektywne śledzenie wartości poszczególnych zmiennych,
wykonywanie instrukcji krok po kroku czy wstrzymywanie działania programu w określonych
miejscach. Debugger jest standardowym wyposażeniem większości współczesnych środowisk
programistycznych.
Wadą debuggera jest to że jest wstanie tylko wykryć wadliwe działanie programu nie wykrywa
natomiast błędów wynikłych z powodu niewłaściwego zrozumienia problemu przez programistę
(program nie robi to co powinien, ale robi to co programista żeby robił).
Zintegrowane środowisko programistyczne (ang. Integrated Development Environment, IDE)
– aplikacja lub zespół aplikacji (środowisko) służących do tworzenia, modyfikowania, testowania i
konserwacji oprogramowania. Charakteryzują się tym, że udostępniają złożoną, wieloraką
funkcjonalność obejmującą edycję kodu źródłowego, kompilowanie kodu źródłowego, tworzenie
zasobów programu (tzn. formatek / ekranów / okien dialogowych, menu, raportów, elementów
graficznych takich jak ikony, obrazy itp.), tworzenie baz danych, komponentów i innych,
debugowanie itd.
Fazy powstawania programu komputerowego:
1. Określanie wymagań (specyfikacja),
2. Wybór języka programowania,
3. Tworzenie algorytmu,
4. Projektowanie systemu,
5. Implementacja,
6. Scalanie systemu,
7. Testy końcowe,
8. Tworzenie dokumentacji użytkowej,
9. Konserwacja systemu.
Określanie wymagań – służy do sprecyzowania potrzeb. Na tym etapie formułuje się wyobrażenia
o programie i jego działaniu oraz precyzuje wymagania. Na podstawie wymagań tworzona jest tzw.
specyfikacja projektu, czyli zakres czynności, jaki dany program ma wykonywać. Jeżeli program
jest tworzony na zamówienie, należy w pewnym momencie zażądać zamrożenia specyfikacji – w
przeciwnym razie klient może zażądać zmian (nawet po napisaniu programu), a wykonawca będzie
to musiał zrobić nieodpłatnie. Czasami nawet mała zmiana wymagań może w decydujący sposób
wpłynąć na sposób realizacji zamówienia, co może nawet doprowadzić do konieczności
rozpoczęcia praktycznie od nowa.
Określanie wymagań od
●wywiad strukturalny – polega na zadawaniu wcześniej opracowanej listy pytań,
●wywiad swobodny – polega na zadawaniu dowolnych pytań i notowaniu odpowiedzi,
●ankieta wysyłana do dużej liczby potencjalnych klientów,
●analiza formularzy i innych dokumentów klienta,
●analiza cyklu pracy i wykonywanych czynności,
●analiza scenariuszy używania systemu,
●konstrukcja prototypu.
Dokumentacja fazy określania wymagań powinna zawierać:
●wprowadzenie: zakres systemu, cele i konteksty jego używania,
●opis ewolucji systemu: przewidywane zmiany w systemie,
●specyfikację wymagań funkcjonalnych: jakie czynności i operacje system powinien wykonywać,
● specyfikację wymagań niefunkcjonalnych: przy jakich ograniczeniach system powinien powstać i
działać.
●opis modelu systemu lub jego prototypu,
●opis wymagań sprzętowych,
● słownik zawierający
informatycznych.
wyjaśnienia
używanych
w
dokumentacji
pojęć
fachowych
i
Jeżeli program komputerowy powstaje na użytek programisty, faza określania wymagań może
zostać skrócona do minimum.
Nie powinno się jednak pomijać fazy dokumentacji – powinna oba być prowadzona przynajmniej w
zakresie podstawowym, umożliwiającym rozwój i modyfikację programu nawet po wielu latach.
2. Wybór języka programowania – zależy głównie od przeznaczenia aplikacji. Przeważnie istnieje
przynajmniej kilka języków programowania nadających się budowy systemu spełniającego
wymagania. Wybór języka programowania może być dokonany przed lub po stworzeniu algorytmu.
W pierwszym przypadku dobór języka może w znaczny sposób wpłynąć na tok rozumowania i
zdeterminować budowę algorytmu.
Wybór języka programowania może być:
●narzucony przez zamawiającego,
●pozostawiony woli wykonawcy – musi on wówczas uwzględnić:
•dziedzinę aplikacji,
•doświadczenie zespołu programistów,
•posiadane narzędzia,
•dostępność gotowych modułów i bibliotek,
•potrzeby innych prowadzonych równolegle prac.
3. Tworzenie algorytmu - jest to jeden z najważniejszych etapów projektowania, wymaga on od
programisty (bądź projektanta) starannego przemyślenia i przygotowania. Nie należy przystępować
do pisania programu nie mając wyobrażenia o jego budowie. Takie postępowanie wydłuży zapewne
czas realizacji projektu, zwiększy prawdopodobieństwo wystąpienia błędów oraz nie daje gwarancji
optymalności rozwiązań. Dużych i rozbudowanych programów praktycznie nie da się napisać bez
odpowiednich przygotowań. Jeżeli to jest tylko możliwe należy korzystać z istniejących i
sprawdzonych algorytmów.
4. Projektowanie systemu – służy do stworzenia szkieletu kodu źródłowego (systemu).
Techniki projektowania:
●projektowanie strukturalne:
•zorientowane na akcję,
•zorientowane na dane,
●projektowanie obiektowe.
5. Implementacja – jest to właściwa faza budowy programu. Małe systemy informatyczne mogą
być realizowane przez jednego programistę. Systemy większe wymagają utworzenia zespołu bądź
też grupy zespołów programistycznych.
6. Scalanie systemu – w przypadku tworzenia aplikacji przez zespół programistów należy połączyć
wszystkie moduły w jedną całość. Rozróżnia się trzy podstawowe techniki integracji systemu
informatycznego:
●metoda zstępująca – najpierw integrowane są moduły sterujące, a później moduły wykonawcze,
nazywana inaczej od ogółu do szczegółu
●metoda wstępująca – najpierw integrowane są moduły wykonawcze a później sterujące, nazywana
inaczej od szczegółu do ogółu.
●metoda mieszana – moduły sterujące integrowane są metodą zstępującą, a wykonawcze –
wstępującą.
7. Testy końcowe– służą do ostatecznego potwierdzenia poprawności systemu. Rozróżnia się
następujące etapy testów:
●testowanie przez Dział Kontroli Jakości,
●alfa-testy przez wybraną (najczęściej małą) grupę użytkowników,
●beta-testy przez wybraną (większą) grupę użytkowników,
●testy akceptacji (na rzeczywistych danych), wykonywane przez odbiorcę.
Kryteria wykonywania testów:
● użyteczność aplikacji (łatwość użycia, użyteczność oferowanych
funkcji, opłacalność),
● solidność (częstość krytycznych awarii systemu, czas podniesienia
systemu po awarii, czas odbudowy systemu po awarii),
● odporność (na zmieniające się warunki otoczenia, błędne dane,
nieoczekiwane reakcje użytkowników),
● efektywność (szybkość, czas reakcji, zajętość pamięci),
● poprawność (zgodność ze specyfikacją).
Metody wykonywania testów:
● test „czarnej skrzynki” - odbywa się na poziomie interfejsu,
● test „szklanej skrzynki” - odbywa się na poziomie kodu źródłowego.
8. Dokumentacja użytkowa – powinna zawierać następujące elementy:
● opis funkcjonalny – opis przeznaczenia oraz głównych możliwości
programu,
● podręcznik użytkownika – opis przeznaczony dla typowych
użytkowników, powinien zawierać:
•sposoby uruchamiania oraz kończenia pracy z systemem,
•sposoby realizacji podstawowych funkcji systemu,
•metody obsługi błędnych sytuacji,
•sposoby korzystania z systemu pomocy,
•kompletny przykład korzystania z systemu.
●kompletny opis systemu – część przeznaczona dla doświadczonych
użytkowników, powinien zawierać:
•szczegółowy opis wszystkich funkcji systemu,
•informacje o sposobach wywoływania tych funkcji,
•opisy formatu danych,
•opisy błędów, które mogą pojawić się w trakcie pracy zsystemem,
•informacje o wszelkich ograniczeniach dotyczących np. zakresudanych.