Algorytm to uporządkowana procedura rozwiązywania zadania lub problemu poprzez wykonanie skończonej sekwencji kroków. Każdy algorytm przyjmuje dane wejściowe, wykonuje określone operacje i zwraca dane wyjściowe — rezultat obliczeń lub decyzję.
Przepis jest często przytaczanym, prostym przykładem algorytmu: opisuje kolejne czynności (kroki), pobiera składniki jako dane wejściowe i produkuje gotowe danie jako wynik. Podobnie jak przepis, algorytm musi być zrozumiały i możliwy do wykonania.
Słowa "algorytm" i "algorystyka" pochodzą od nazwiska perskiego matematyka Al-Khwārizmī (perski: خوارزمی, ok. 780–850). W informatyce pojęcie algorytmu uściślono w formalizmach teoretycznych, np. w modelu maszyny Turinga, który definiuje pojęcie obliczalności.
Cechy poprawnego algorytmu
- Wejście — algorytm przyjmuje zero lub więcej danych wejściowych.
- Wyjście — algorytm daje co najmniej jedno dane wyjściowe (wynik).
- Skończoność — po skończonej liczbie kroków algorytm zatrzymuje się.
- Jednoznaczność — każdy krok jest opisywany dokładnie i bez dwuznaczności.
- Wykonalność — każdy krok można wykonać w skończonym czasie przy użyciu dostępnych zasobów.
- Poprawność — dla wszystkich dopuszczalnych danych wejściowych algorytm daje poprawny wynik (spełnia specyfikację).
Typy algorytmów i techniki
- Sekwencyjne — wykonują kroki jeden po drugim.
- Warunkowe — zawierają instrukcje warunkowe (if/else), które zmieniają przebieg w zależności od danych.
- Iteracyjne — używają pętli (np. for, while).
- Rekurencyjne — rozwiązują problem przez odwołanie do mniejszej instancji tego samego problemu.
- Losowe (probabilistyczne) — wykorzystują losowe decyzje, często szybkie w praktyce (np. algorytmy Monte Carlo).
- Heurystyczne — stosowane, gdy rozwiązanie optymalne jest trudne do znalezienia; dają rozwiązania przybliżone.
Reprezentacje algorytmów
Algorytmy można zapisać na wiele sposobów: w pseudokodzie, za pomocą schematów blokowych, lub w konkretnych językach programowania. Pseudokod i schematy są przydatne do projektowania i komunikowania pomysłów bez szczegółów składniowych konkretnego języka.
Przykłady prostych algorytmów
- Sortowanie — np. algorytm sortowania bąbelkowego, quicksort, mergesort.
- Wyszukiwanie — wyszukiwanie liniowe, wyszukiwanie binarne.
- Algorytm Euklidesa — szybka metoda znajdowania największego wspólnego dzielnika dwóch liczb.
- Algorytmy grafowe — przeszukiwanie wszerz (BFS), przeszukiwanie w głąb (DFS), algorytm Dijkstry do najkrótszych ścieżek.
Przykładowy, bardzo krótki pseudokod znajdujący maksimum w liście:
max := lista[0] for każdy element x w lista: if x > max: max := x return max
Złożoność obliczeniowa i poprawność
W praktyce ważne są dwie miary algorytmu: złożoność czasowa (ile kroków w zależności od rozmiaru wejścia) i złożoność pamięciowa (ile dodatkowej pamięci potrzeba). Te właściwości wyraża się zwykle przy pomocy notacji asymptotycznej, np. O(n), O(n log n) itp. Analiza poprawności obejmuje dowód, że algorytm zwraca oczekiwany wynik dla wszystkich dopuszczalnych danych wejściowych.
Algorytmy w informatyce — zastosowania
- Bazy danych: algorytmy indeksowania, optymalizacji zapytań.
- Kryptografia: algorytmy szyfrujące, funkcje skrótu, protokoły klucza publicznego.
- Sztuczna inteligencja i uczenie maszynowe: optymalizacja, algorytmy uczenia, wyszukiwanie w przestrzeniach rozwiązań.
- Grafika komputerowa: algorytmy renderowania, rasteryzacji, kompresji obrazu.
- Sieci komputerowe: algorytmy routingu, harmonogramowania, wykrywania błędów.
- Teoria obliczeń: badanie, które problemy są rozwiązywalne algorytmicznie (decydowalne) i jaka jest ich złożoność.
Algorytm a maszyna Turinga
Formalnie, w teorii obliczeń algorytm rozumiany jest jako procedura wykonywalna przez model obliczeniowy, taki jak maszyna Turinga. To pozwala badać granice obliczalności i klasy złożoności (np. P, NP).
Podsumowanie
Algorytm to precyzyjny przepis rozwiązywania problemu: sekwencja wykonalnych kroków prowadząca od danych wejściowych do wyników. Znajomość różnych technik tworzenia i analizowania algorytmów jest kluczowa w informatyce — od programowania aplikacji po badania teoretyczne i zastosowania praktyczne.



