Ich werde die gleiche Antwort geben wie beim letzten Mal, als diese Frage auftauchte.
Verstehen Sie zunächst, dass es zum Zeitpunkt des Schreibens keine gute formale Definition von "Algorithmus" gibt. Das Schlüsselwort hier ist "formal".
Es gibt jedoch kluge Leute, die daran arbeiten.
Was wir wissen ist, dass was auch immer ein "Algorithmus" ist, er irgendwo zwischen "mathematischer Funktion" und "Computerprogramm" liegt.
Eine mathematische Funktion ist der formale Begriff einer Zuordnung von Eingaben zu Ausgaben. So ist beispielsweise "sortieren" eine Zuordnung zwischen einer Folge von bestellbaren Elementen und einer Folge von bestellbaren Elementen desselben Typs, die jede Folge ihrer geordneten Reihenfolge zuordnet. Diese Funktion kann mit verschiedenen Algorithmen implementiert werden (z. B. Zusammenführungssortierung, Heap-Sortierung). Jeder Algorithmus könnte wiederum mit unterschiedlichen Programmen implementiert werden (sogar mit derselben Programmiersprache).
Der beste Griff, den wir in Bezug auf einen "Algorithmus" haben, ist, dass es sich um eine Art Äquivalenzklasse für Programme handelt, bei der zwei Programme äquivalent sind, wenn sie "im Wesentlichen dasselbe" tun. Zwei beliebige Programme, die denselben Algorithmus implementieren, müssen dieselbe Funktion berechnen, aber das Gegenteil ist nicht der Fall.
In ähnlicher Weise gibt es eine Äquivalenzklasse zwischen Algorithmen, wobei zwei Algorithmen äquivalent sind, wenn sie dieselbe mathematische Funktion berechnen.
Das Schwierige dabei ist, zu erfassen, was wir unter "im Wesentlichen dasselbe" verstehen.
Es gibt einige offensichtliche Dinge, die wir einbeziehen sollten. Beispielsweise sind zwei Programme im Wesentlichen gleich, wenn sie sich nur durch variable Umbenennungen unterscheiden. Die meisten Modelle von Programmiersprachen haben native Begriffe von "Äquivalenz" (z. B. Beta-Reduktion und Eta-Konvertierung in Lambda-Kalkül), daher sollten wir diese auch einwerfen.
Unabhängig von der gewählten Äquivalenzbeziehung erhalten wir eine gewisse Struktur. Algorithmen bilden eine Kategorie aufgrund der Tatsache, dass sie die Quotientenkategorie von Programmen sind. Es ist bekannt, dass einige interessante Äquivalenzbeziehungen zu interessanten kategorialen Strukturen führen. Beispielsweise ist die Kategorie der primitiven rekursiven Algorithmen ein universelles Objekt in der Kategorie der Kategorien. Wann immer Sie eine solche interessante Struktur sehen, wissen Sie, dass diese Untersuchungslinie wahrscheinlich nützlich sein wird.