en algoritm är ett specifikt förfarande för att lösa ett väldefinierat beräkningsproblem. Utvecklingen och analysen av algoritmer är grundläggande för alla aspekter av datavetenskap: artificiell intelligens, databaser, grafik, nätverk, operativsystem, säkerhet och så vidare. Algoritm utveckling är mer än bara programmering., Det kräver en förståelse av de alternativ som finns tillgängliga för att lösa ett beräkningsproblem, inklusive hårdvara, nätverk, programmeringsspråk och prestandabegränsningar som åtföljer en viss lösning. Det kräver också att förstå vad det innebär för en algoritm att vara ”korrekt” i den meningen att det löser problemet fullt ut och effektivt.

ett åtföljande begrepp är utformningen av en viss datastruktur som gör att en algoritm kan köras effektivt., Betydelsen av datastrukturer härrör från det faktum att huvudminnet på en dator (där data lagras) är linjär, bestående av en sekvens av minnesceller som är seriellt numrerade 0, 1, 2,…. Således är den enklaste datastrukturen en linjär array, där intilliggande element numreras med på varandra följande heltal ”index” och ett Elements värde nås av sitt unika index. En array kan till exempel användas för att lagra en lista med namn, och effektiva metoder behövs för att effektivt söka efter och hämta ett visst namn från matrisen., Till exempel tillåter sortering av listan i alfabetisk ordning att en så kallad binär sökteknik används, där resten av listan som ska sökas vid varje steg skärs i hälften. Denna sökteknik liknar att söka i en telefonbok för ett visst namn. Att veta att boken är i alfabetisk ordning gör att man snabbt kan vända sig till en sida som ligger nära sidan med önskat namn. Många algoritmer har utvecklats för att sortera och söka listor över data effektivt.,

även om dataposter lagras i följd i minnet, kan de kopplas samman av pekare (i huvudsak minnesadresser som lagras med ett objekt för att ange var nästa objekt eller objekt i strukturen finns) så att data kan organiseras på sätt som liknar dem där de kommer att nås. Den enklaste strukturen kallas den länkade listan, där noncontiguously lagrade objekt kan nås i en förutbestämd ordning genom att följa pekarna från ett objekt i listan till nästa., Listan kan vara cirkulär, med det sista objektet som pekar på det första, eller varje element kan ha pekare i båda riktningarna för att bilda en dubbelt länkad lista. Algoritmer har utvecklats för att effektivt manipulera sådana listor genom att söka efter, infoga och ta bort objekt.

pekare ger också möjlighet att implementera mer komplexa datastrukturer. En graf, till exempel, är en uppsättning noder (objekt) och länkar (kallas kanter) som ansluter par av objekt., En sådan graf kan representera en uppsättning städer och motorvägarna som förenar dem, layouten av kretselement och anslutning av ledningar på ett minneschip eller konfigurationen av personer som interagerar via ett socialt nätverk. Typiska graphalgoritmer inkluderar graph traversal strategier, till exempel hur man följer länkarna från nod till nod (kanske söker efter en nod med en viss egenskap) på ett sätt som varje nod besöks endast en gång. Ett relaterat problem är bestämningen av den kortaste vägen mellan två givna noder på en godtycklig graf. (Se grafteori.,) Ett problem av praktiskt intresse för nätverksalgoritmer, till exempel, är att bestämma hur många ”trasiga” länkar kan tolereras innan kommunikation börjar misslyckas. På samma sätt är det i mycket storskalig integration (VLSI) chipdesign viktigt att veta om grafen som representerar en krets är plan, det vill säga om den kan ritas i två dimensioner utan några länkar som korsar (ledningar som rör).

algoritmens (beräkningsmässiga) komplexitet är ett mått på mängden datorresurser (tid och rum) som en viss algoritm förbrukar när den körs., Dataforskare använder matematiska åtgärder av komplexitet som gör det möjligt för dem att förutsäga, innan de skriver koden, hur snabbt en algoritm kommer att springa och hur mycket minne det kommer att kräva. Sådana förutsägelser är viktiga guider för programmerare som implementerar och väljer algoritmer för verkliga applikationer.,

beräkningskomplexitet är ett kontinuum, eftersom vissa algoritmer kräver linjär tid (det vill säga den tid som krävs ökar direkt med antalet objekt eller noder i listan, grafen eller nätverket som behandlas), medan andra kräver kvadratisk eller till och med exponentiell tid att slutföra (det vill säga den tid som krävs ökar med antalet objekt kvadrerade eller med exponentialen för det numret). I den bortre änden av detta kontinuum ligger de mörka Haven av svårlösta problem-de vars lösningar inte kan genomföras effektivt., För dessa problem försöker Dataforskare hitta heuristiska algoritmer som nästan kan lösa problemet och springa i rimlig tid.

längre bort är fortfarande de algoritmiska problem som kan anges men inte lösbara; det vill säga man kan bevisa att inget program kan skrivas för att lösa problemet. Ett klassiskt exempel på ett olösligt algoritmiskt problem är stoppproblemet, vilket säger att inget program kan skrivas som kan förutsäga huruvida något annat program stannar efter ett begränsat antal steg., Det olösliga problemet med att stoppa problemet har omedelbar praktisk betydelse för mjukvaruutveckling. Det skulle till exempel vara frivolous att försöka utveckla ett programverktyg som förutspår om ett annat program som utvecklas har en oändlig slinga i den (även om det skulle vara oerhört fördelaktigt att ha ett sådant verktyg).