egy algoritmus egy speciális eljárás egy jól definiált számítási probléma megoldására. Az algoritmusok fejlesztése és elemzése alapvető fontosságú a számítástechnika minden területén: mesterséges intelligencia, adatbázisok, grafika, hálózatépítés, operációs rendszerek, biztonság stb. Algoritmus fejlesztés több, mint a programozás., Meg kell érteni a számítási probléma megoldására rendelkezésre álló alternatívákat, beleértve a hardvert, a hálózatot, a programozási nyelvet, valamint az adott megoldást kísérő teljesítménykorlátokat. Azt is megköveteli, hogy megértsük, mit jelent egy algoritmus “helyes” abban az értelemben, hogy teljes mértékben és hatékonyan megoldja a problémát.

a kísérő fogalom egy adott adatstruktúra kialakítása, amely lehetővé teszi az algoritmus hatékony futtatását., Az adatstruktúrák fontossága abból a tényből ered ,hogy a számítógép fő memóriája (ahol az adatokat tárolják) lineáris, amely sorszámozott memóriacellákból áll 0, 1, 2,…. Így a legegyszerűbb adatstruktúra egy lineáris tömb, amelyben a szomszédos elemek egymás utáni egész “indexekkel” vannak számozva, az elem értékét pedig egyedi indexe adja meg. Egy tömb használható például a nevek listájának tárolására, és hatékony módszerekre van szükség ahhoz, hogy hatékonyan keressünk és lekérjünk egy adott nevet a tömbből., Például a lista betűrendbe rendezése lehetővé teszi az úgynevezett bináris keresési technika használatát, amelyben az egyes lépésekben keresendő lista fennmaradó része felére csökken. Ez a keresési technika hasonló a telefonkönyv kereséséhez egy adott névhez. Annak tudatában, hogy a könyv betűrendben van, lehetővé teszi, hogy gyorsan forduljon egy olyan oldalra, amely közel van a kívánt nevet tartalmazó oldalhoz. Számos algoritmust fejlesztettek ki az adatok listáinak hatékony válogatására és keresésére.,

bár az adatelemeket egymás után tárolják a memóriában, összekapcsolhatók mutatókkal (lényegében egy elemet tartalmazó memóriacímekkel, hogy jelezzék, hol található a következő elem vagy elemek a struktúrában), hogy az adatok a hozzáférésükhöz hasonló módon szervezhetők. A legegyszerűbb ilyen struktúrát összekapcsolt listának nevezik, amelyben a nem szigorúan tárolt elemek előre meghatározott sorrendben érhetők el a lista egyik eleméből a másikba mutató mutatók követésével., A lista kör alakú lehet, az utolsó elem az elsőre mutat, vagy minden elemnek mindkét irányban mutatói lehetnek, hogy kétszeresen összekapcsolt listát alkossanak. Algoritmusokat fejlesztettek ki az ilyen listák hatékony manipulálására az elemek keresésével, beillesztésével és eltávolításával.

a mutatók lehetővé teszik a bonyolultabb adatstruktúrák megvalósítását is. A gráf például egy olyan csomópont (elem) és Hivatkozás (más néven él) halmaza, amely elempárokat kapcsol össze., Egy ilyen grafikon egy sor várost és az őket összekötő autópályát, áramköri elemek elrendezését és a memória chipen lévő vezetékek összekötését, vagy a közösségi hálózaton keresztül interakcióba lépő személyek konfigurációját jelentheti. Tipikus grafikon algoritmusok közé grafikon útját stratégiák, mint például, hogy kövesse a hivatkozásokat csomópont csomópont (talán keres egy csomópont egy adott tulajdonság), úgy, hogy minden elem csak egyszer látogatott. A kapcsolódó probléma a legrövidebb út meghatározása két adott csomópont között egy tetszőleges grafikonon. (Lásd a gráfelméletet.,) A hálózati algoritmusok gyakorlati érdeklődésének problémája például annak meghatározása, hogy hány “törött” linket lehet tolerálni, mielőtt a kommunikáció meghibásodik. Hasonlóképpen, a nagyon nagy léptékű integrációban (VLSI) a chip kialakításában fontos tudni, hogy az áramkört ábrázoló grafikon sík, vagyis két dimenzióban rajzolható-e linkek keresztezése nélkül (vezetékek megérintése).

egy algoritmus (számítási) komplexitása az adott algoritmus által futáskor felhasznált számítási erőforrások (idő és tér) mennyiségének mérése., A számítógépes tudósok olyan bonyolult matematikai méréseket alkalmaznak, amelyek lehetővé teszik számukra, hogy a kód írása előtt megjósolják, milyen gyorsan fut egy algoritmus, és mennyi memóriát igényel. Ezek a jóslatok fontos útmutatók a valós alkalmazásokhoz algoritmusokat végrehajtó és kiválasztó programozók számára.,

A számítási komplexitás folytonosság, mivel egyes algoritmusok lineáris időt igényelnek (vagyis a szükséges idő közvetlenül növekszik a listában, grafikonban vagy a feldolgozandó hálózatban lévő elemek vagy csomópontok számával), míg mások kvadratikus vagy akár exponenciális időt igényelnek a befejezéshez (vagyis a szükséges idő növekszik a négyzetben vagy az adott szám exponenciális számával). Ennek a kontinuumnak a túlsó végén a megoldhatatlan problémák homályos tengerei fekszenek-azok, amelyek megoldásait nem lehet hatékonyan végrehajtani., Ezekre a problémákra a számítógépes tudósok olyan heurisztikus algoritmusokat keresnek, amelyek szinte megoldják a problémát, és ésszerű idő alatt futnak.

távolabb vannak azok az algoritmikus problémák, amelyek kijelenthetők, de nem oldhatók meg; vagyis bizonyítani lehet, hogy egyetlen program sem írható a probléma megoldására. A klasszikus példa egy megoldhatatlan algoritmikus probléma a megállító probléma, amely kimondja, hogy nincs program lehet írni, hogy tudja megjósolni, hogy bármely más program leáll után véges lépések száma., A megállítási probléma megoldhatatlansága azonnali gyakorlati hatással van a szoftverfejlesztésre. Például komolytalan lenne megpróbálni olyan szoftvereszközt kifejleszteni, amely megjósolja, hogy egy másik kifejlesztett program végtelen hurokkal rendelkezik-e benne (bár egy ilyen eszköz rendkívül hasznos lenne).