algorytm jest specyficzną procedurą rozwiązywania dobrze zdefiniowanego problemu obliczeniowego. Rozwój i analiza algorytmów ma zasadnicze znaczenie dla wszystkich aspektów informatyki: sztucznej inteligencji, baz danych, Grafiki, sieci, systemów operacyjnych, bezpieczeństwa i tak dalej. Tworzenie algorytmów to coś więcej niż tylko programowanie., Wymaga zrozumienia dostępnych alternatyw dla rozwiązania problemu obliczeniowego, w tym sprzętu, sieci, języka programowania i ograniczeń wydajności, które towarzyszą konkretnemu rozwiązaniu. Wymaga również zrozumienia, co to znaczy, aby algorytm był „poprawny”w tym sensie, że w pełni i skutecznie rozwiązuje problem.

pojęciem towarzyszącym jest projektowanie określonej struktury danych, która umożliwia wydajne działanie algorytmu., Znaczenie struktur danych wynika z faktu, że główna pamięć komputera (w której dane są przechowywane) jest liniowa, składająca się z sekwencji komórek pamięci, które są numerowane szeregowo 0, 1, 2,…. Tak więc najprostszą strukturą danych jest tablica liniowa, w której sąsiednie elementy są numerowane kolejnymi liczbami całkowitymi, a do wartości elementu dostęp ma unikalny indeks. Tablica może być używana na przykład do przechowywania listy nazw, a efektywne metody są potrzebne do efektywnego wyszukiwania i pobierania określonej nazwy z tablicy., Na przykład, sortowanie listy w porządku alfabetycznym pozwala na tak zwaną technikę wyszukiwania binarnego, w której pozostała część listy do przeszukiwania na każdym kroku jest cięta na pół. Ta technika wyszukiwania jest podobna do wyszukiwania książki telefonicznej dla konkretnej nazwy. Wiedząc, że książka jest w porządku alfabetycznym pozwala szybko przejść do strony, która jest blisko strony zawierającej żądaną nazwę. Opracowano wiele algorytmów do efektywnego sortowania i przeszukiwania list danych.,

chociaż pozycje danych są przechowywane kolejno w pamięci, mogą być połączone ze sobą za pomocą wskaźników (zasadniczo adresy pamięci przechowywane razem z elementem, aby wskazać, gdzie znajduje się następny element lub elementy w strukturze), dzięki czemu dane mogą być zorganizowane w sposób podobny do tych, w których będą dostępne. Najprostsza taka struktura nazywa się listą połączoną, w której można uzyskać dostęp do niestandardowo przechowywanych elementów w określonej kolejności, podążając za wskaźnikami od jednego elementu na liście do następnego., Lista może być okrągła, z ostatnim elementem wskazującym na pierwszy, lub każdy element może mieć wskaźniki w obu kierunkach, tworząc podwójnie połączoną listę. Algorytmy zostały opracowane do efektywnego manipulowania takimi listami poprzez wyszukiwanie, wstawianie i usuwanie elementów.

wskaźniki zapewniają również możliwość implementacji bardziej złożonych struktur danych. Na przykład wykres jest zbiorem węzłów (elementów) i łączy (zwanych krawędziami), które łączą pary elementów., Taki wykres może przedstawiać zestaw miast i łączących je autostrad, układ elementów obwodów i przewodów łączących na chipie pamięci lub konfigurację osób wchodzących w interakcję za pośrednictwem sieci społecznościowej. Typowe algorytmy grafowe obejmują strategie przechodzenia grafów, takie jak podążanie za łączami od węzła do węzła (być może szukanie węzła o określonej właściwości) w taki sposób, aby każdy węzeł był odwiedzany tylko raz. Pokrewnym problemem jest określenie najkrótszej ścieżki pomiędzy dwoma podanymi węzłami na dowolnym wykresie. (Patrz teoria grafów.,) Problem praktycznego zainteresowania algorytmami sieciowymi, na przykład, polega na określeniu, ile „zepsutych” linków można tolerować, zanim komunikacja zacznie zawodzić. Podobnie, w projektowaniu układów VLSI (ang. very-large-scale integration) ważne jest, aby wiedzieć, czy Wykres reprezentujący układ jest płaski, czyli czy można go narysować w dwóch wymiarach bez krzyżowania się łączy (stykania się przewodów).

złożoność (obliczeniowa) algorytmu jest miarą ilości zasobów obliczeniowych (czasu i przestrzeni), które dany algorytm zużywa podczas jego działania., Informatycy używają matematycznych miar złożoności, które pozwalają im przewidzieć, przed napisaniem kodu, jak szybko algorytm będzie działał i ile pamięci będzie wymagał. Takie przewidywania są ważnymi przewodnikami dla programistów implementujących i wybierających algorytmy dla rzeczywistych aplikacji.,

złożoność obliczeniowa jest kontinuum, w którym niektóre algorytmy wymagają czasu liniowego (tj. wymagany czas wzrasta bezpośrednio z liczbą elementów lub węzłów w liście, wykresie lub sieci przetwarzanej), podczas gdy inne wymagają kwadratowego lub nawet wykładniczego czasu do ukończenia (tj. wymagany czas wzrasta wraz z liczbą elementów do kwadratu lub z wykładniczym tej liczby). Na końcu tego kontinuum leżą mętne morza trudnych do rozwiązania problemów—tych, których rozwiązań nie da się skutecznie wdrożyć., W przypadku tych problemów informatycy starają się znaleźć algorytmy heurystyczne, które mogą prawie rozwiązać problem i działać w rozsądnym czasie.

Dalej są te problemy algorytmiczne, które można stwierdzić, ale nie są rozwiązywalne; to znaczy, można udowodnić, że żaden program nie może być napisany w celu rozwiązania problemu. Klasycznym przykładem nierozwiązywalnego problemu algorytmicznego jest problem zatrzymania, który stwierdza, że żaden program nie może być napisany, który może przewidzieć, czy jakikolwiek inny program zatrzyma się po skończonej liczbie kroków., Nierozwiązywalność problemu zatrzymania ma natychmiastowy praktyczny wpływ na rozwój oprogramowania. Na przykład, byłoby niepoważne próbować opracować narzędzie programowe, które przewiduje, czy inny rozwijany program ma nieskończoną pętlę (chociaż posiadanie takiego narzędzia byłoby ogromnie korzystne).