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