algoritmus je konkrétní postup pro řešení dobře definované výpočetní problém. Vývoj a analýza algoritmů je zásadní pro všechny aspekty počítačové vědy: umělá inteligence, databáze, grafika, sítě, operační systémy, bezpečnost, a tak dále. Vývoj algoritmů je víc než jen programování., Vyžaduje pochopení alternativ dostupných pro řešení výpočetního problému, včetně hardwarových, síťových, programovacích jazyků a omezení výkonu, která doprovázejí jakékoli konkrétní řešení. Vyžaduje také pochopení toho, co to znamená, aby algoritmus byl „správný“ v tom smyslu, že plně a efektivně řeší problém.

doprovodným pojmem je návrh konkrétní datové struktury, která umožňuje efektivní běh algoritmu., Význam datové struktury vyplývá ze skutečnosti, že hlavní paměti počítače (kde jsou uložena data) je lineární, skládající se z posloupnosti paměťových buněk, které jsou sériově číslované 0, 1, 2,…. Nejjednodušší datová struktura je tedy lineární pole, ve kterém jsou sousední prvky očíslovány po sobě jdoucími celočíselnými „indexy“ a hodnota prvku je přístupná svým jedinečným indexem. Pole lze použít například k uložení seznamu jmen a jsou potřebné efektivní metody pro efektivní vyhledávání a načítání konkrétního jména z pole., Například třídění seznamu do abecedního pořadí umožňuje použít takzvanou binární vyhledávací techniku, ve které je zbytek seznamu, který má být prohledán v každém kroku, snížen na polovinu. Tato vyhledávací technika je podobná vyhledávání telefonního seznamu pro konkrétní jméno. Vědomí, že kniha je v abecedním pořadí, umožňuje rychle se obrátit na stránku, která je blízko stránky obsahující požadovaný název. Pro efektivní třídění a vyhledávání seznamů dat bylo vyvinuto mnoho algoritmů.,

i když datové položky jsou uloženy za sebou v paměti, mohou být propojeny pomocí ukazatelů (v podstatě, adresy paměti uložen s položkou ukazují, kde jsou další položky nebo položky ve struktuře se nacházejí), tak, že data mohou být organizována v ohledech podobné těm, v nichž budou přistupovat. Nejjednodušší taková struktura se nazývá propojený seznam, ve kterém mohou být nesouvisle uložené položky přístupné v předem určeném pořadí podle ukazatelů z jedné položky v seznamu na další., Seznam může být kruhový, s poslední položka ukazuje na první, nebo každý prvek může mít ukazatele v obou směrech tvořit dvojnásob spojový seznam. Algoritmy byly vyvinuty pro efektivní manipulaci s takovými seznamy hledáním, vkládáním a odstraněním položek.ukazatele

také poskytují schopnost implementovat složitější datové struktury. Graf je například sada uzlů (položek) a odkazů (známých jako hrany), které spojují dvojice položek., Takový graf může představovat řadu měst a silnic k nim, rozložení prvků obvodu a připojovacích vodičů na paměti čipu, nebo konfigurace osob, komunikovat přes sociální sítě. Typické grafové algoritmy patří grafu funkce traversal strategií, jako je například, jak sledovat odkazy z uzlu do uzlu (možná hledá uzel s konkrétní nemovitostí) tak, že každý uzel navštívili pouze jednou. Souvisejícím problémem je určení nejkratší cesty mezi dvěma danými uzly na libovolném grafu. (Viz teorie grafů.,) Problémem praktického zájmu o síťové algoritmy je například zjistit, kolik“ nefunkčních “ odkazů lze tolerovat dříve, než komunikace začne selhávat. Podobně, ve velmi velkého stupně integrace (VLSI) čipů je důležité vědět, zda je graf představující obvodu je rovinný, že je, zda to může být vypracován ve dvou rozměrech bez vazby křížení (dráty dotykem).

(výpočetní) složitost algoritmu je měřítkem množství výpočetních zdrojů (času a prostoru), že konkrétní algoritmus spotřebuje, když to běží., Počítačoví vědci používají matematická opatření složitosti, která jim umožňují předvídat, před napsáním kódu, jak rychle bude algoritmus spuštěn a kolik paměti bude vyžadovat. Takové předpovědi jsou důležité návody pro programátory provádění a výběr algoritmů pro real-svět aplikací.,

Výpočetní složitost je kontinuum, v tom, že některé algoritmy vyžadují lineární čas (to je čas potřebný zvyšuje přímo s počtem položek nebo uzlů v seznamu, grafu nebo sítě zpracovávány), zatímco jiné vyžadují kvadratický nebo dokonce exponenciální čas na dokončení (to znamená, že čas potřebný zvyšuje s počtem položek na druhou, nebo s exponenciálním tohoto čísla). Na vzdáleném konci tohoto kontinua leží kalné moře neřešitelných problémů – těch, jejichž řešení nelze efektivně implementovat., Pro tyto problémy se počítačoví vědci snaží najít heuristické algoritmy, které mohou problém téměř vyřešit a běžet v přiměřeném čase.

dále jsou stále ty algoritmické problémy, které lze uvést, ale nejsou řešitelné; to znamená, že lze prokázat, že k vyřešení problému nelze napsat žádný program. Klasický příklad neřešitelný algoritmické problémem je problém zastavení, který stanoví, že žádný program může být napsáno, že může předpovědět, zda je či není žádný jiný program se zastaví po konečném počtu kroků., Neřešitelnost problému zastavení má okamžitý praktický dopad na vývoj softwaru. Například, to by bylo povrchní, aby se pokusili vyvinout softwarový nástroj, který předpovídá, zda jiný program vyvíjen má v nekonečné smyčce (i když mít takový nástroj by bylo nesmírně přínosné).