En algoritme er en spesifikk prosedyre for å løse et godt definert computational problem. Utvikling og analyse av algoritmer er grunnleggende for alle aspekter av computer science: kunstig intelligens, databaser, grafikk, nettverk, operativsystemer, sikkerhet, og så videre. Algoritmen utvikling er mer enn bare programmering., Det krever en forståelse av de alternativene som er tilgjengelig for å løse en beregningsorientert problemet, inkludert maskinvare, nettverk, programmering språk, ytelse og begrensninger som følger en bestemt løsning. Det krever også forstå hva det betyr for en algoritme for å være «riktig» i den forstand at det fullt og effektivt løser problemet for hånden.

En medfølgende tanken er utformingen av en bestemt data-struktur som muliggjør en algoritme for å kunne kjøre effektivt., Viktigheten av data strukturer stammer fra det faktum at de viktigste minne for en datamaskin (der dataene er lagret) er lineær, som består av en sekvens av minne celler som er nummerert sammen 0, 1, 2,…. Dermed er den enkleste datastruktur er en lineær matrise, der tilstøtende elementer er nummerert med etterfølgende heltall «indekser», og en klar verdi som er tilgjengelig av sin unik indeks. En matrise kan for eksempel brukes til å lagre en liste over navn og effektive metoder som er nødvendig for effektivt å søke etter og hente et bestemt navn fra tabellen., For eksempel sortere listen i alfabetisk rekkefølge tillater en såkalt binært søk teknikk for å bli brukt, som i resten av lista til å bli søkte på hvert trinn er kuttet i to. Dette søket teknikken er lik for å søke telefonkatalogen for et bestemt navn. Å vite at boken er i alfabetisk rekkefølge gjør det mulig å slå raskt til en side som er i nærheten til siden som inneholder det ønskede navnet. Mange algoritmer har blitt utviklet for sortering og søking lister av data effektivt.,

Selv om data elementer som er lagret fortløpende i minne, de kan være knyttet sammen av pekere (i hovedsak, minne adresser som er lagret med et element for å indikere hvor den neste elementet eller elementene i strukturen er funnet), slik at data kan være organisert på måter som ligner de som de vil nås. Den enkleste slik struktur kalles lenket liste, der noncontiguously lagret elementer som kan benyttes i en pre-spesifiserte ordre ved å følge tips fra ett element i listen til den neste., Listen kan være sirkulær, med siste element som peker til den første, eller hvert element kan ha tips i begge retninger for å danne en dobbelt lenket liste. Algoritmene har blitt utviklet for effektivt å manipulere slike lister ved å søke etter, sette inn og fjerne elementer.

Tips også gi muligheten til å gjennomføre mer komplekse datastrukturer. En graf, for eksempel, er et sett av noder (elementer) og linker (kjent som kanter) som kobler par av elementer., En slik graf kan representere et sett av byer og motorveier med dem, utformingen av kretsen elementer og koble ledningene på en minnebrikke, eller konfigurasjonen av mennesker i samspill via et sosialt nettverk. Typisk grafen algoritmer inkluderer grafen traversal strategier, slik som hvordan å følge lenker fra node til node (kanskje søker etter en node med en bestemt eiendel) på en slik måte at hver node besøkes bare én gang. Et beslektet problem er fastsettelse av den korteste veien mellom to gitte noder på en vilkårlig graf. (Se grafen teori.,) Et problem av praktisk interesse i nettverket algoritmer, for eksempel, er å finne ut hvor mange «brutt» linker som kan tolereres før kommunikasjon begynner å mislykkes. På samme måte, i svært stor skala integrasjon (VLSI) chip design det er viktig å vite om grafen som representerer en krets er plane, det er, om det kan trekkes i to dimensjoner uten noen linker krysset (ledninger berører).

(computational) kompleksiteten av en algoritme er et mål på mengden av computing ressurser (tid og plass) som en bestemt algoritme forbruker når det kjører., Datamaskinen forskere bruker matematiske tiltak av kompleksitet som tillater dem å forutsi, før du skriver koden, hvor fort en algoritme vil kjøre, og hvor mye minne det vil kreve. Slike spådommer er viktig guider for programmerere å implementere og velge algoritmer for virkelige verden programmer.,

Computational kompleksitet er en sammenheng, i og med at noen algoritmer krever lineær tid (som er, den tiden som kreves øker direkte med antall elementer eller noder i listen, graf, eller nettverket blir behandlet), mens andre krever kvadratiske eller til og med eksponensiell tid til å fullføre (som er, den tiden som kreves øker med antall elementer squared eller med den eksponentielle av at antall). Helt til slutt i denne sammenheng ligger det mørke hav av uløselige problemer—de som har løsninger kan ikke være effektivt iverksatt., For disse problemene, datamaskinen forskere forsøker å finne heuristiske algoritmer som nesten kan løse problemet og kjøre i en viss tid.

Videre unna fortsatt er de algoritmiske problemer som kan være oppgitt, men er ikke løsbar; det vil si at man kan bevise at ingen program kan være skrevet for å løse problemet. Et klassisk eksempel på et uløselig problem algoritmisk er å stoppe problemet, som sier at ingen program kan skrives som kan forutsi om ikke alle andre program stopper etter et endelig antall steg., Den uavgjørbarhet for å stoppe problemet har umiddelbar praktisk betydning for utvikling av programvare. For eksempel, ville det være lettsindig å prøve å utvikle en programvare verktøyet som spår om et annet program som utvikles har et uendelig loop i det (selv om å ha et slikt verktøy ville være uhyre gunstig).