Ja und nein. Dies hängt von den Einschränkungen ab, die Sie erfüllen möchten, und von den Voraussetzungen, die zum Ausführen Ihres Algorithmus erforderlich sind.
Im Idealfall ist ein Algorithmus ein abstraktes Rezept , das Schritt für Schritt festlegt, wie etwas zu tun ist. Algorithmen wurden so definiert mit dem Ziel der Reproduzierbarkeit und späteren Automatisierung. Algorithmen stammen aus Lambda-Berechnungen, sodass Sie leicht erkennen können, warum sie so erstellt wurden. Diese Definition ist die übliche, aber moderne Algorithmen können nicht sequentiell (nicht schrittweise, wie bei gleichzeitigen Algorithmen, oder logisch, wie bei der Vereinheitlichung), nicht linear (stochastische Algorithmen) oder einfach nur merkwürdig (Quantenalgorithmen) sein Algorithmen), aber ich werde das weitergeben.
Daher sollte ein Algorithmus im Idealfall so abstrakt wie möglich sein, ohne Hardware zu berücksichtigen.
Aber wie bei jedem System müssen Sie einige Axiome definieren , um nicht nur ein kohärentes System zu erhalten, sondern auch Zeit zu gewinnen. Beispielsweise setzen die meisten Algorithmen zumindest implizit voraus, dass sie auf einer Von-Neumann-Maschine definiert sind. Wenn dies nicht der Fall wäre, müssten sie explizit alle Teile des Systems definieren, auf denen sie ausgeführt werden müssen (da dies für die Reproduktion des Rezepts erforderlich ist, ist dies eine Art Vorbedingung). Außerdem basieren Algorithmen häufig auf allgemeinen Befehlen wie write (), ohne diese vollständig zu definieren.
Ein weiterer Grund, warum Algorithmen nicht so abstrakt von der Hardwarearchitektur sind, liegt darin, dass Sie einige Einschränkungen erfüllen müssen .
Angenommen, Sie arbeiten an eingebetteten Systemen. Dann können Sie sich wahrscheinlich nicht auf dieselbe Menge an Ressourcen verlassen, die Sie auf Arbeitsstationen haben. Eine der zurückhaltendsten Ressourcen ist wahrscheinlich das Gedächtnis. Die meisten Algorithmen tendieren jedoch dazu, die Zeitkomplexität (Ausführungsgeschwindigkeit auf der CPU) und nicht die Speicherkomplexität (Speichermenge, die zum Bearbeiten der Daten erforderlich ist) zu optimieren. Für diese Systeme wurden speicheroptimierte Algorithmen entwickelt, bei denen nicht speicheroptimierte Algorithmen nur fehlschlagen oder viel langsamer laufen würden. In der Tat sind eingebettete Systeme nicht das einzige Ziel speichereffizienter Algorithmen: Beispielsweise gibt es Algorithmen , die den Cache nicht kennen und deren Verarbeitung anpasst, um den CPU-Cache effizient zu nutzen. Ein weiteres Beispiel: Einige Algorithmen für maschinelles Lernen für Big Data sind speziell auf diese Anforderungen zugeschnittenInkrementelles Lernen oder Out-of-Core-Computing zur Verarbeitung großer Datenmengen, die viel größer sind als der auf einem Computer verfügbare Speicher usw.
Es gibt auch Algorithmen, die nicht einen bestimmten Teil des Computers optimieren, sondern einen Standard, der von der Hardwarearchitektur abhängig ist. Beispielsweise werden numerische Daten, die Genauigkeit benötigen, in float oder double gespeichert, die aufgrund von Hardwarebeschränkungen naturgemäß eingeschränkt sind. Das Problem ist, dass komplexe Berechnungen zu Rundungen führen können. Je mehr Berechnungen Sie über gerundete Zahlen durchführen, desto mehr werden Sie davon abweichen. Dies wird als katastrophale Störung bezeichnet . Einige Anwendungen erfordern eine kritische Präzision, selbst auf Kosten der schlimmsten Komplexität. Für diese Art von Anwendungen wurden Algorithmen entwickelt, die ihre Berechnung optimieren, um katastrophale Störungen zu reduzieren oder zu beseitigen.
Das Entwerfen eines Algorithmus kann daher auch ein Kompromiss zwischen Abstraktion und Einschränkungen sein.
Am Ende können wir sagen, dass ein Algorithmus so abstrakt ist wie sein Ziel und wie seine vorausgesetzten (Architektur-) Bedürfnisse . Je spezifischer das Ziel Ihres Algorithmus ist, desto mehr wird er wahrscheinlich von der Hardwarearchitektur abhängen.
Einige verwandte Keywords, die Sie interessieren könnten: