Ein Algorithmus ist ein spezifisches Verfahren zur Lösung eines genau definierten Rechenproblems. Die Entwicklung und Analyse von Algorithmen ist für alle Aspekte der Informatik von grundlegender Bedeutung: künstliche Intelligenz, Datenbanken, Grafiken, Netzwerke, Betriebssysteme, Sicherheit usw. Algorithmusentwicklung ist mehr als nur Programmierung., Es erfordert ein Verständnis der verfügbaren Alternativen zur Lösung eines Computerproblems, einschließlich der Hardware, des Netzwerks, der Programmiersprache und der Leistungseinschränkungen, die mit einer bestimmten Lösung einhergehen. Es erfordert auch zu verstehen, was es bedeutet, dass ein Algorithmus in dem Sinne „korrekt“ ist, dass er das vorliegende Problem vollständig und effizient löst.

Ein begleitender Begriff ist das Design einer bestimmten Datenstruktur, mit der ein Algorithmus effizient ausgeführt werden kann., Die Bedeutung von Datenstrukturen ergibt sich aus der Tatsache, dass der Hauptspeicher eines Computers (in dem die Daten gespeichert sind) linear ist und aus einer Folge von Speicherzellen besteht, die seriell nummeriert sind 0, 1, 2,…. Somit ist die einfachste Datenstruktur ein lineares Array, in dem benachbarte Elemente mit aufeinanderfolgenden ganzzahligen „Indizes“ nummeriert werden und auf den Wert eines Elements über seinen eindeutigen Index zugegriffen wird. Ein Array kann beispielsweise zum Speichern einer Liste von Namen verwendet werden, und effiziente Methoden sind erforderlich, um einen bestimmten Namen effizient zu suchen und aus dem Array abzurufen., Beispielsweise erlaubt das Sortieren der Liste in alphabetischer Reihenfolge die Verwendung einer sogenannten binären Suchtechnik, bei der der Rest der bei jedem Schritt zu durchsuchenden Liste halbiert wird. Diese Suchtechnik ähnelt der Suche in einem Telefonbuch nach einem bestimmten Namen. Wenn Sie wissen, dass das Buch in alphabetischer Reihenfolge ist, können Sie schnell zu einer Seite wechseln, die sich in der Nähe der Seite befindet, die den gewünschten Namen enthält. Viele Algorithmen wurden entwickelt, um Listen von Daten effizient zu sortieren und zu suchen.,

Obwohl Datenelemente nacheinander im Speicher gespeichert werden, können sie durch Zeiger miteinander verknüpft werden (im Wesentlichen Speicheradressen, die mit einem Element gespeichert sind, um anzuzeigen, wo sich das nächste Element oder die nächsten Elemente in der Struktur befinden), so dass die Daten auf ähnliche Weise organisiert werden können, wie auf sie zugegriffen wird. Die einfachste solche Struktur wird als verknüpfte Liste bezeichnet, in der auf nicht zusammenhängend gespeicherte Elemente in einer vordefinierten Reihenfolge zugegriffen werden kann, indem den Zeigern von einem Element in der Liste zum nächsten gefolgt wird., Die Liste kann kreisförmig sein, wobei das letzte Element auf das erste zeigt, oder jedes Element kann Zeiger in beide Richtungen haben, um eine doppelt verknüpfte Liste zu bilden. Algorithmen wurden entwickelt, um solche Listen effizient zu manipulieren, indem Elemente gesucht, eingefügt und entfernt werden.

Zeiger bieten auch die Möglichkeit, komplexere Datenstrukturen zu implementieren. Ein Diagramm ist beispielsweise eine Reihe von Knoten (Elementen) und Links (als Kanten bezeichnet), die Elementpaare verbinden., Ein solches Diagramm kann eine Reihe von Städten und Autobahnen darstellen, die sie verbinden, das Layout von Schaltungselementen und Verbindungsdrähten auf einem Speicherchip oder die Konfiguration von Personen, die über ein soziales Netzwerk interagieren. Typische Diagrammalgorithmen umfassen Diagrammdurchlaufstrategien, z. B. wie man den Links von Knoten zu Knoten folgt (möglicherweise auf der Suche nach einem Knoten mit einer bestimmten Eigenschaft), sodass jeder Knoten nur einmal besucht wird. Ein verwandtes Problem ist die Bestimmung des kürzesten Pfades zwischen zwei gegebenen Knoten in einem beliebigen Graphen. (Siehe Graphentheorie.,) Ein Problem von praktischem Interesse bei Netzwerkalgorithmen besteht beispielsweise darin, zu bestimmen, wie viele „defekte“ Links toleriert werden können, bevor die Kommunikation fehlschlägt. In ähnlicher Weise ist es beim sehr großen Integrations-Chipdesign (VLSI) wichtig zu wissen, ob der Graph, der eine Schaltung darstellt, planar ist, dh ob er in zwei Dimensionen gezeichnet werden kann, ohne dass sich Verbindungen kreuzen (Drähte berühren).

Die (rechnerische) Komplexität eines Algorithmus ist ein Maß für die Menge an Rechenressourcen (Zeit und Raum), die ein bestimmter Algorithmus verbraucht, wenn er ausgeführt wird., Informatiker verwenden mathematische Komplexitätsmaße, mit denen sie vor dem Schreiben des Codes vorhersagen können, wie schnell ein Algorithmus ausgeführt wird und wie viel Speicher er benötigt. Solche Vorhersagen sind wichtige Anleitungen für Programmierer, die Algorithmen für reale Anwendungen implementieren und auswählen.,

der Komplexität ist ein Kontinuum, in, dass einige algorithmen erfordern die lineare Zeit (, dass ist, die benötigte Zeit erhöht, die direkt mit der Anzahl der Elemente oder Knoten in der Liste, Diagramm oder Netzwerk verarbeitet), während andere erfordern, quadratische oder sogar exponentielle Zeit in Anspruch (, dass ist, die benötigte Zeit wächst mit der Anzahl der Elemente, kariert oder mit der exponentiellen der Zahl). Am anderen Ende dieses Kontinuums liegen die düsteren Meere hartnäckiger Probleme-diejenigen, deren Lösungen nicht effizient umgesetzt werden können., Für diese Probleme versuchen Informatiker, heuristische Algorithmen zu finden, die das Problem fast lösen und in angemessener Zeit ausführen können.

Weiter entfernt sind noch jene algorithmischen Probleme, die zwar angegeben werden können, aber nicht lösbar sind; das heißt, man kann beweisen, dass kein Programm geschrieben werden kann, um das Problem zu lösen. Ein klassisches Beispiel für ein unlösbares algorithmisches Problem ist das Halteproblem, das besagt, dass kein Programm geschrieben werden kann, das vorhersagen kann, ob ein anderes Programm nach einer endlichen Anzahl von Schritten angehalten wird oder nicht., Die Unlösbarkeit des Halteproblems hat unmittelbare praktische Auswirkungen auf die Softwareentwicklung. Zum Beispiel wäre es leichtfertig zu versuchen, ein Software-Tool zu entwickeln, das vorhersagt, ob ein anderes zu entwickelndes Programm eine Endlosschleife enthält (obwohl ein solches Tool sehr vorteilhaft wäre).