en algoritme er en specifik procedure til løsning af et veldefineret beregningsproblem. Udviklingen og analysen af algoritmer er grundlæggende for alle aspekter af datalogi: kunstig intelligens, databaser, grafik, netværk, operativsystemer, sikkerhed og så videre. Algoritme udvikling er mere end bare programmering., Det kræver en forståelse af de tilgængelige alternativer til løsning af et beregningsproblem, herunder Hard .are, netværk, programmeringssprog og ydelsesbegrænsninger, der ledsager en bestemt løsning. Det kræver også at forstå, hvad det betyder for en algoritme at være “korrekt” i den forstand, at den fuldt ud og effektivt løser det aktuelle problem.

et ledsagende begreb er designet af en bestemt datastruktur, der gør det muligt for en algoritme at køre effektivt., Betydningen af datastrukturer stammer fra det faktum, at hovedhukommelsen på en computer (hvor dataene er gemt) er lineær, bestående af en sekvens af hukommelsesceller, der er serielt nummereret 0, 1, 2,…. Således er den enkleste datastruktur et lineært array, hvor tilstødende elementer er nummereret med fortløbende heltal “indekser”, og et elements værdi er adgang til dets unikke indeks. Bruges til at gemme en liste over navne, og der kræves effektive metoder til effektivt at søge efter og hente et bestemt navn fra arrayet., For eksempel tillader sortering af listen i alfabetisk rækkefølge en såkaldt binær søgeteknik, der skal bruges, hvor resten af listen, der skal søges i hvert trin, skæres i halvdelen. Denne søgeteknik svarer til at søge en telefonbog efter et bestemt navn. At vide, at bogen er i alfabetisk rækkefølge, giver en mulighed for hurtigt at vende sig til en side, der ligger tæt på siden, der indeholder det ønskede navn. Mange algoritmer er blevet udviklet til sortering og søgning lister over data effektivt.,

selvom dataelementer gemmes fortløbende i hukommelsen, kan de være forbundet med pointers (i det væsentlige hukommelsesadresser gemt med et element for at angive, hvor det næste element eller elementer i strukturen findes), så dataene kan organiseres på måder, der ligner dem, hvor de vil blive adgang til. Den enkleste sådan struktur kaldes den linkede liste, hvor noncontiguously lagrede elementer kan fås i en forudbestemt rækkefølge ved at følge pegerne fra et element i listen til det næste., Listen kan være cirkulær, med det sidste element peger på den første, eller hvert element kan have pointers i begge retninger for at danne en dobbelt linket liste. Algoritmer er udviklet til effektivt at manipulere sådanne lister ved at søge efter, indsætte og fjerne elementer.

Pointers giver også mulighed for at implementere mere komplekse datastrukturer. En graf er for eksempel et sæt noder (elementer) og links (kendt som kanter), der forbinder par elementer., En sådan graf kan repræsentere et sæt byer og motorveje, der forbinder dem, layoutet af kredsløbselementer og forbindelsesledninger på en hukommelseschip eller konfigurationen af personer, der interagerer via et socialt netværk. Typiske graf algoritmer omfatter graf traversal strategier, såsom hvordan man følger links fra node til node (måske søger efter en node med en bestemt egenskab) på en måde, at hver node besøges kun .n gang. Et relateret problem er bestemmelsen af den korteste vej mellem to givne noder på en vilkårlig graf. (Se grafteori.,) Et problem af praktisk interesse for netværksalgoritmer er for eksempel at bestemme, hvor mange “ødelagte” links der kan tolereres, før kommunikationen begynder at mislykkes. Tilsvarende er det i meget storskala integration (VLSI) chipdesign vigtigt at vide, om grafen, der repræsenterer et kredsløb, er plan, det vil sige, om den kan tegnes i to dimensioner uden nogen krydsning af forbindelser (ledninger rører).

algoritmens (beregningsmæssige) kompleksitet er et mål for mængden af computerressourcer (tid og rum), som en bestemt algoritme bruger, når den kører., Computerforskere bruger matematiske mål for kompleksitet, der giver dem mulighed for at forudsige, før de skriver koden, hvor hurtigt en algoritme vil køre, og hvor meget hukommelse det vil kræve. Sådanne forudsigelser er vigtige vejledninger for programmører, der implementerer og vælger algoritmer til applikationer i den virkelige verden.,

Beregningsmæssige kompleksitet er et kontinuum, i, at nogle algoritmer kræver lineær tid (det vil sige, den tid, der kræves øger direkte med antallet af elementer eller knudepunkter i listen, graf, eller netværk, der bliver behandlet), mens andre kræver kvadratiske eller endda eksponentiel tid til at fuldføre (som er den tid, der kræves stiger med antallet af elementer, kvadreret eller med den eksponentielle af dette nummer). I den yderste ende af dette kontinuum ligger det grumsede hav af vanskelige problemer—dem, hvis løsninger ikke kan implementeres effektivt., For disse problemer søger computerforskere at finde heuristiske algoritmer, der næsten kan løse problemet og løbe inden for en rimelig tid.længere væk er der stadig de algoritmiske problemer, der kan angives, men som ikke kan løses; det vil sige, man kan bevise, at der ikke kan skrives noget program for at løse problemet. Et klassisk eksempel på et uopløseligt algoritmisk problem er stopproblemet, som siger, at der ikke kan skrives noget program, der kan forudsige, om et andet program stopper efter et begrænset antal trin., Uopløseligheden af stopproblemet har øjeblikkelig praktisk indflydelse på soft .areudvikling. For eksempel ville det være useriøst at forsøge at udvikle et Soft .areværktøj, der forudsiger, om et andet program, der udvikles, har en uendelig løkke i det (selvom det ville være enormt fordelagtigt at have et sådant værktøj).