een algoritme is een specifieke procedure voor het oplossen van een welomschreven computationeel probleem. De ontwikkeling en analyse van algoritmen is fundamenteel voor alle aspecten van de informatica: kunstmatige intelligentie, databases, graphics, netwerken, besturingssystemen, beveiliging, enzovoort. Algoritme ontwikkeling is meer dan alleen programmeren., Het vereist inzicht in de beschikbare alternatieven voor het oplossen van een computationeel probleem, met inbegrip van de hardware, netwerken, programmeertaal, en prestatiebeperkingen die een bepaalde oplossing begeleiden. Het vereist ook begrip van wat het betekent voor een algoritme om “correct” te zijn in de zin dat het volledig en efficiënt het probleem bij de hand oplost.

een bijbehorend begrip is het ontwerp van een bepaalde gegevensstructuur die een algoritme in staat stelt efficiënt te werken., Het belang van datastructuren komt voort uit het feit dat het hoofdgeheugen van een computer (waar de gegevens worden opgeslagen) lineair is, bestaande uit een opeenvolging van geheugencellen die in serie zijn genummerd 0, 1, 2,…. De eenvoudigste datastructuur is dus een lineaire array, waarin aangrenzende elementen worden genummerd met opeenvolgende integer “indexen” en de waarde van een element wordt benaderd door zijn unieke index. Een array kan bijvoorbeeld worden gebruikt om een lijst met namen op te slaan, en er zijn efficiënte methoden nodig om een bepaalde naam efficiënt te zoeken en uit de array op te halen., Het sorteren van de lijst in alfabetische volgorde maakt het bijvoorbeeld mogelijk een zogenaamde binaire zoektechniek te gebruiken, waarbij de rest van de lijst die bij elke stap moet worden doorzocht, in tweeën wordt gesneden. Deze zoektechniek is vergelijkbaar met het zoeken in een telefoonboek naar een bepaalde naam. Wetende dat het boek is in alfabetische volgorde kunt u snel naar een pagina die dicht bij de pagina met de gewenste naam. Veel algoritmen zijn ontwikkeld voor het efficiënt sorteren en doorzoeken van lijsten met gegevens.,

hoewel gegevensitems opeenvolgend in het geheugen worden opgeslagen, kunnen ze aan elkaar worden gekoppeld door pointers (in wezen geheugenadressen die bij een item worden opgeslagen om aan te geven waar het volgende item of items in de structuur worden gevonden), zodat de gegevens kunnen worden georganiseerd op een manier die vergelijkbaar is met die waarin ze worden benaderd. De eenvoudigste structuur is de linked list, waarin niet-contiguously opgeslagen items kunnen worden benaderd in een vooraf gespecificeerde volgorde door het volgen van de pointers van het ene item in de lijst naar het volgende., De lijst kan cirkelvormig zijn, waarbij het laatste item naar het eerste verwijst, of elk element kan in beide richtingen pointers hebben om een dubbel gelinkte lijst te vormen. Algoritmen zijn ontwikkeld voor het efficiënt manipuleren van dergelijke lijsten door te zoeken naar, Invoegen en verwijderen van items.

Pointers bieden ook de mogelijkheid om complexere datastructuren te implementeren. Een grafiek is bijvoorbeeld een verzameling knooppunten (items) en koppelingen (bekend als randen) die paren van items verbinden., Een dergelijke grafiek kan een set van steden en de snelwegen die hen verbinden, de lay-out van circuit elementen en aansluitdraden op een geheugenchip, of de configuratie van personen interactie via een sociaal netwerk. Typische grafiekalgoritmen omvatten grafiektraversale strategieën, zoals hoe de koppelingen van knooppunt naar knooppunt te volgen (misschien op zoek naar een knooppunt met een bepaalde eigenschap) op een manier dat elk knooppunt slechts één keer wordt bezocht. Een gerelateerd probleem is de bepaling van het kortste pad tussen twee gegeven knooppunten op een willekeurige grafiek. (Zie grafiek theorie., Een probleem van praktisch belang in netwerkalgoritmen, bijvoorbeeld, is om te bepalen hoeveel “gebroken” verbindingen kunnen worden getolereerd voordat communicatie begint te mislukken. Ook in very-large-scale integration (VLSI) chip ontwerp is het belangrijk om te weten of de grafiek die een circuit is vlak, dat wil zeggen, of het kan worden getekend in twee dimensies zonder enige links kruising (draden aanraken).

de (computationele) complexiteit van een algoritme is een maat voor de hoeveelheid rekenmiddelen (tijd en ruimte) die een bepaald algoritme verbruikt wanneer het draait., Computerwetenschappers gebruiken wiskundige metingen van complexiteit die hen in staat stellen om, voordat ze de code schrijven, te voorspellen hoe snel een algoritme zal draaien en hoeveel geheugen het nodig zal hebben. Dergelijke voorspellingen zijn belangrijke handleidingen voor programmeurs die algoritmen implementeren en selecteren voor real-world applicaties.,

Computationele complexiteit is een continuum, dat sommige algoritmen vereisen lineaire tijd (dat is, de benodigde tijd vergroot direct met het aantal items of knooppunten in de lijst, grafiek, of het netwerk worden verwerkt), terwijl anderen vereisen kwadratische of zelfs exponentieel meer tijd in beslag (dat is, de benodigde tijd neemt toe met het aantal items in het kwadraat of met de exponent van dat nummer). Aan het eind van dit continuüm liggen de troebele zeeën van onoplosbare problemen—die waarvan de oplossingen niet efficiënt kunnen worden uitgevoerd., Voor deze problemen zoeken computerwetenschappers heuristische algoritmen die het probleem bijna kunnen oplossen en in een redelijke tijd kunnen draaien.

verder weg zijn nog steeds die algoritmische problemen die kunnen worden gesteld maar niet oplosbaar zijn; dat wil zeggen, men kan bewijzen dat er geen programma kan worden geschreven om het probleem op te lossen. Een klassiek voorbeeld van een onoplosbaar algoritmisch probleem is het stoppen probleem, dat stelt dat er geen programma kan worden geschreven dat kan voorspellen of een ander programma stopt na een eindig aantal stappen., De onoplosbaarheid van het stilleggingsprobleem heeft onmiddellijke praktische gevolgen voor de softwareontwikkeling. Bijvoorbeeld, het zou frivool zijn om te proberen om een software tool die voorspelt of een ander programma dat wordt ontwikkeld heeft een oneindige lus in het te ontwikkelen (hoewel het hebben van een dergelijke tool zou enorm nuttig zijn).