algoritmi on erityinen menettely ratkaista hyvin määritellyn laskennallisen ongelman. Kehitys ja analyysi algoritmien on olennaista kaikilla tietojenkäsittelytieteen: artificial intelligence, tietokannat, grafiikka -, verkko -, käyttö-järjestelmät, turvallisuus, ja niin edelleen. Algoritmin kehittäminen on muutakin kuin ohjelmointia., Se edellyttää ymmärrystä vaihtoehtoja käytettävissä ratkaista laskennallisia ongelmia, mukaan lukien laitteisto -, verkko -, ohjelmointi kieli, ja suorituskyvyn rajoitteet, että mukana mitään erityistä ratkaisua. Se edellyttää myös ymmärtää, mitä se tarkoittaa, että algoritmi on ”oikein” siinä mielessä, että se täysin ja tehokkaasti ratkaisee ongelman käsillä.

oheinen käsite on tietyn tietorakenteen suunnittelu, jonka avulla algoritmi toimii tehokkaasti., Merkitystä tietorakenteiden johtuu siitä, että tärkein tietokoneen muistiin (paikan, johon aineisto on tallennettu) on lineaarinen, joka koostuu sekvenssin muisti soluja, jotka ovat sarjaan numeroitu 0, 1, 2,…. Näin yksinkertaisin tietorakenne on lineaarinen joukko, jossa vierekkäiset elementit numeroidaan peräkkäisillä kokonaisluvuilla ”indeksit” ja alkuaineen arvo pääsee käsiksi sen ainutlaatuiseen indeksiin. Array voidaan käyttää, esimerkiksi, tallentaa nimet, ja tehokkaat menetelmät ovat tarpeen tehokkaasti etsiä ja noutaa erityisesti nimi alkaen array., Esimerkiksi, lajittelu luettelo aakkosjärjestykseen mahdollistaa ns. binäärihaku tekniikkaa käytetään, jossa jäljellä luetteloon voidaan hakea kussakin vaiheessa on leikattu kahtia. Tämä hakutekniikka on samanlainen kuin puhelinluettelon etsiminen tietystä nimestä. Tietäen, että kirja on aakkosjärjestyksessä mahdollistaa yhden muuttaa nopeasti sivulle, joka on lähellä sivun, joka sisältää haluamasi nimi. Monia algoritmeja on kehitetty tietojen lajittelua ja etsimistä varten tehokkaasti.,

Vaikka tiedot on tallennettu peräkkäin muistiin, ne voivat olla yhteydessä toisiinsa osoittimia (lähinnä muistin osoitteet tallennetaan kohteen osoittaa, missä seuraava kohde tai kohteita rakenne löytyy) niin, että tiedot voidaan järjestää tavalla, samanlainen kuin ne, joissa ne ovat käsiksi. Yksinkertaisin tällainen rakenne on nimeltään linkitetty lista, jossa noncontiguously tallennettuja kohteita voidaan käyttää ennalta määrätyssä järjestyksessä, jonka jälkeen viitteitä yhden kohteen luettelosta seuraavaan., Luettelo voi olla pyöreä, ja viimeinen kohta osoittaa ensimmäistä, tai jokaisella alkuaineella voi olla osoittimia molempiin suuntiin muodostaen kaksinkertaisesti linkitetyn luettelon. Algoritmeja on kehitetty tällaisten listojen tehokkaaseen manipulointiin etsimällä, lisäämällä ja poistamalla kohteita.

osoittimet tarjoavat myös mahdollisuuden toteuttaa monimutkaisempia tietorakenteita. Kuvaaja on esimerkiksi joukko solmuja (kohteita) ja linkkejä (tunnetaan edges), jotka yhdistävät paria kohteita., Tällainen kuvio voi edustaa joukko kaupunkien ja valtateiden liittymässä ne, layout, piiri-elementtejä ja yhdistää johdot muisti siru, tai kokoonpano henkilöiden vuorovaikutuksessa kautta sosiaalinen verkosto. Tyypillinen kuvaajan algoritmit ovat graph traversal strategioita, kuten miten seurata linkkejä solmujen (ehkä etsii solmun, jonka tiettyä ominaisuutta) siten, että jokainen solmu on käynyt vain kerran. Tähän liittyvä ongelma on lyhimmän polun määrittäminen kahden tietyn solmun välillä mielivaltaisella graafilla. (KS. Graafiteoria.,) Ongelma käytännön kiinnostus verkon algoritmeja, esimerkiksi, on määrittää, kuinka monta ”rikki” linkit voidaan sietää, ennen kuin viestinnän alkavat epäonnistua. Vastaavasti erittäin laajamittainen integrointi (VLSI) siru suunnittelu on tärkeää tietää, onko kuvaaja eli piiri on tasomainen, että on, onko se voi olla piirretty kaksi ulottuvuutta ilman mitään linkkejä ylitys (johdot koskettaa).

algoritmin (laskennallinen) monimutkaisuus on laskentaresurssien määrän (ajan ja avaruuden) mitta, jonka tietty algoritmi kuluttaa toimiessaan., Tietokone tutkijat käyttävät matemaattisia toimenpiteitä, monimutkaisuus, joiden avulla ne voivat ennakoida, ennen kuin kirjoitat koodia, kuinka nopeasti algoritmi toimii ja kuinka paljon muistia se vaatii. Tällaiset ennustukset ovat tärkeitä oppaita ohjelmoijille, jotka toteuttavat ja valitsevat algoritmeja reaalimaailman sovelluksiin.,

Laskennallinen vaativuus on jatkumo, että jotkut algoritmit vaativat lineaarisen ajan (eli aika, joka tarvitaan lisää suoraan useita kohteita tai solmujen luettelon, kaavion, tai verkko on käsitelty), kun taas toiset vaativat toisen asteen tai jopa eksponentiaalinen aika täydellinen (eli tarvittava aika kasvaa useita kohteita, potenssiin tai eksponentiaalinen, että numero). Tämän jatkumon loppupäässä ovat vaikeakulkuisten ongelmien hämärät meret—ne, joiden ratkaisuja ei voida toteuttaa tehokkaasti., Näihin ongelmiin, tietokone tutkijat pyrkivät löytämään heuristisia algoritmeja, jotka voivat lähes ratkaista ongelman ja suorittaa kohtuullisessa ajassa.

kauempana ovat edelleen ne algoritmiset ongelmat, jotka voidaan todeta, mutta joita ei voida ratkaista; toisin sanoen voidaan todistaa, että mitään ohjelmaa ei voida kirjoittaa ongelman ratkaisemiseksi. Klassinen esimerkki ratkaisematon algoritminen ongelma on pysäyttää ongelma, jossa todetaan, että ei ohjelma voi olla kirjoitettu, että voi ennustaa, onko mikä tahansa muu ohjelma, pysähdyksiä, kun rajallinen määrä toimia., Pysäyttämisongelman korjaamattomuudella on välitön käytännön vaikutus ohjelmistokehitykseen. Esimerkiksi, se olisi kevytmielistä yrittää kehittää työkalu, joka ennustaa, onko toinen ohjelma kehitteillä on ääretön silmukka se (vaikka ottaa tällainen työkalu olisi äärimmäisen hyödyllistä).