Die Mathematik, die ich benutze



Kürzlich wurde in einem Online-Forum eine Frage gestellt: Wie stark ist Mathematik unter den Bedingungen eines echten Programmierers gefragt, wie oft verwendet er sie und in welchen Bereichen? Und hier ist meine Antwort.

Zunächst verwende ich, wie fast alle Programmierer, die Boolesche Logik aus der Analyse logischer Ausdrücke für bedingte Anweisungen und Ausstiegskriterien, um solche Ausdrücke beispielsweise mit den Gesetzen von de Morgan in Einklang zu bringen. Der Großteil unserer Arbeit grenzt an die Berechnung von Prädikaten erster Ordnung und anderer Prädikatenlogik in Form der Analyse von Voraussetzungen, Invarianten und mehr (obwohl es den Anschein haben mag, dass wir einige andere Aufgaben ausführen).

Außerdem beschäftige ich mich häufig mit der Analyse der Komplexität von Algorithmen. Die Dimensionen der Datensätze, die heutzutage verarbeitet werden, sind enorm. Auf einer Techonomy- Konferenz 2010 sagte Eric Schmidt , dass das Datenvolumen, das die Menschheit heute in nur zwei Tagen erstellt hat, dem Volumen aller weltweit vorhandenen Daten ab 2003 entspricht. Für mich ist es wichtig, große Segmente dieser Volumina verarbeiten und davon profitieren zu können. In diesem Sinne ist das Verständnis der räumlich-zeitlichen Komplexität von Operationen , die wir auf Daten anwenden, der Schlüssel, um festzustellen, ob bestimmte Berechnungen im Prinzip möglich sind. Im Gegensatz zu den traditionelleren Arten der O-Analyse oder Theta-Analyse haben konstante Faktoren auf solchen Skalen einen signifikanten Effekt: Faktor 2 ändert die asymptotische Zeitkomplexität des Algorithmus nicht, erfordert jedoch eine Erhöhung der Anzahl der Prozessoren von 10.000 auf 20.000 und einen solchen Unterschied im Verbrauch Ressourcen werden greifbar sein. Infolgedessen werden die Berechnungen komplexer. Beispiele: Kann ich eine lineare Berechnung durchführen und auf eine logarithmische reduzieren? Ist es möglich, den Speicherverbrauch um das Dreifache zu reduzieren? Usw.

Oft muss ich die ungünstigste Variante der Obergrenze berechnen, beispielsweise die Größe eines Datensatzes. In vielen Fällen können solche Berechnungen nicht trivial sein. Oder Sie müssen möglicherweise eine Wiederholungsformel analysieren, um zu überprüfen, wie sie sich mit zunehmender Tiefe der Rekursion ändert. Dazu muss ich unter anderem den Grundsatz über Wiederholungsrelationen kennen und die Prinzipien der Analyse von Zahlenreihen verstehen. Und es mag unglaublich erscheinen, aber manchmal bedeutet es, dass ich das Integral berechnen muss (obwohl meistens nur die Riemann- Integrale). Oder kann ich einfach die rekursive Beziehung lösen und eine endliche Anzahl von Lösungen erhalten ? Muss ich auf lineare Algebra zurückgreifen? Dies führt zu Funktionen wie Generieren von Funktionen , Stirling-Zahlen und Matrixberechnungen . Wenn Sie neugierig sind, was in den grundlegenden mathematischen Konzepten enthalten ist, die für das Verständnis der Informatik erforderlich sind, lesen Sie den ersten Band von „The Art of Programming“ von Donald Knuth oder „Concrete Mathematics“ von Knut, Ronald Graham und Oren Patashnik.

Ich führe viele grundlegende Berechnungen in Bezug auf das Aggregieren, Kombinieren und Transformieren von Daten durch, und die Kombinatorik (Zählen der Anzahl, Finden von Symmetrien in verschiedenen Dimensionen usw.) hilft mir dabei. Ich denke, die Beispiele aus diesem Bereich sind offensichtlich.

Ich verwende viel diskrete Mathematik , insbesondere für die Suche nach algebraischen Systemen in Operationen mit besonders großen Datenmengen. Ist es möglich, diese oder jene Struktur mit Hilfe des Homomorphismus als eine bestimmte Gruppe oder einen bestimmten Ring darzustellen, was mir klarer wird? Gibt es eine Option mit einer weniger engen Verbindung? Kann ich die Aktion einer Gruppe auf eine bestimmte Menge anwenden, um ein spekulatives Transformationsmodell zu erstellen, das die Argumentation vereinfacht? Kann ich eine Topologie für die Datenanalyse definieren? Sie wären überrascht, wenn Sie wüssten, wie viele Dinge mit diskreten Topologien beschrieben werden können. Und noch weniger überraschend wäre die Forderung nach Dreiecksungleichheit .

Ich arbeite viel mit Graphentheorie . "Erstellen von Websites" - erfordert nicht nur die Fähigkeit, niedliche Bilder von Katzen auf der Seite zu platzieren. Bei diesem Vorgang werden auch Knoten in das globale Diagramm der Hyperlinks eingefügt . Das Hinzufügen einer einzelnen Seite führt zu einer potenziellen Erhöhung der Anzahl der Diagrammkanten. Dies kann wiederum Auswirkungen haben, die auf den ersten Blick auf Leistung, Analyse, Suchmaschinenranking und andere Merkmale nicht offensichtlich sind. Das Verständnis der Konsequenzen solcher Änderungen kann dazu beitragen, interessante Informationen zu erhalten, z. B. wie das Diagramm wächst. Es stellt sich heraus, dass diese Dynamik einem Potenzgesetz schmerzlich ähnlich ist : Das World Wide Web ist ein skalierungsloses Netzwerk . Was ist der kürzeste Weg zwischen zwei Knoten dieses Graphen? Wie sieht ein solches Netzwerk aus, wenn Sie versuchen, es als planaren oder zweigeteilten Graphen darzustellen ? Wann ist es möglich, diese Eigenschaften einzuhalten, wenn es natürlich überhaupt möglich ist? Was aber, wenn wir das World Wide Web nicht als Grafik betrachten, sondern das gesamte Straßennetz Nordamerikas, Europas oder Asiens?

Dieses Wissen hat andere Konsequenzen. Oft verstehen die Leute nicht, dass moderne Webseiten nicht nur HTML- Dokumente mit Links und anderen Ressourcen sind, sondern baumartige Datenstrukturen , die in einem Diagramm miteinander verbunden sind . Diese Bäume werden aufgrund der Interaktion zwischen dem Webbrowser des Benutzers und einem Server (dank Technologien wie AJAX ) häufig gecrawlt, verarbeitet und dynamisch aktualisiert.

Ein gutes und geeignetes Beispiel ist MathJax . Oder Google Mail . Um zu verstehen, wie sie funktionieren, sind einige Kenntnisse über symbolisches Rechnen und die semantische Analyse von Seitenelementen erforderlich. Die Autoren von MathJax mussten ein Programm schreiben, das in der Lage ist, den auf der Grundlage des Objektmodells des Dokuments generierten Baum zu durchlaufen, mathematische Elemente zu finden, sie zu „ verstauen “ und dynamisch durch neue gezeichnete Elemente zu ersetzen. Vielleicht sind einige Benutzer, die nur sehen, wie es funktioniert, nicht sehr beeindruckend, aber unter der Haube passieren ziemlich komplizierte Dinge. Normalerweise muss ich nichts Ähnliches tun (ich arbeite nicht mit dem Frontend), aber die ganze Zeit mache ich ähnliche Dinge in Lisp . Bitte beachten Sie, dass Lisp ursprünglich durch die mathematische Verarbeitung symbolischer Informationen geschärft wurde: Die Makros decken die Probleme der Verarbeitung symbolischer Ausdrücke vollständig ab.

Ich arbeite viel mit Zeitreihen . Wie verändert sich der Verbrauch von Verkehr oder Ressourcen? Welche Trends können hervorgehoben werden? Zeigt sich dieser oder jener Sprung in der Verzögerung bei der saisonalen Beantwortung von Anfragen oder beim Speicherverbrauch? Wie reagiert die Änderungsrate von etwas, wenn die Eingabedaten in verschiedenen Dimensionen variieren? Gibt es eine Korrelation mit einem externen Ereignis?

Ich arbeite viel mit statistischer Datenanalyse, um nicht nur Leistungsmerkmale zu bestimmen, sondern auch die Daten als solche zu verstehen. Neben der Suche nach den oben genannten semantischen Metadaten im DOM-Baum (z. B. Mikrodaten und Mikroformate , RDF , andere XML- Daten mit einem bestimmten Schema ) versuche ich auch, unstrukturierte Daten zu erfassen . Wie hoch ist die Wahrscheinlichkeit, dass dieser Text eine Adresse ist? Oder sind es grafische Koordinaten ? In welchem ​​Kontext erscheint er? Ist es Spam ? Macht es überhaupt Sinn? Sieht es aus wie das Ergebnis eines Textgenerators, der auf Markov- Ketten basiert? Vielleicht ist dies eine Reihe von Zitaten aus einem bekannten literarischen Werk? Oder ein Fragment einer literarischen Diskussion? Oder ist dies eine Diskussion über Spam, der ein literarisches Fragment enthält? Ich lache immer noch jedes Mal, wenn ich an Spam-E-Mail-Werbemittel denke, die in ein Fragment von Bulgakovs „Meister und Margarita“ eingewickelt sind.

Kategorietheorie . Typen in Computerprogrammiersprachen entsprechen in etwa Kategorien, und Monaden und Funktoren können verwendet werden, um einige Konstruktionen ernsthaft und elegant zu vereinfachen. In der funktionalen Programmiersprache Haskell werden beispielsweise Monaden für E / A und für die Zustandsmodellierung verwendet. Wenn es um vereinfachte Programme geht, ist es einfacher, sie zum Laufen zu bringen. Es ist einfacher, über sie zu sprechen, es ist einfacher zu verstehen, sich zu ändern und so weiter. Typen können oft auf der Grundlage logischer Überlegungen bestimmt werden, was zum Auftreten von Sonderfällen führt (die auch bei allgemeinen Argumentationsproblemen verwendet werden können). Überlegen Sie, was passiert, wenn Sie die Schlussfolgerungen verwenden , um logische Funktionen anzuwenden, wie sie beispielsweise in Prolog verwendet werden , um Diagramme in verteilten Systemen zu transformieren .

Verteilte Systeme bringen uns zur Graphentheorie zurück. Im realen Maßstab beschädigen Systemabstürze, Bagger Fasern, Erdbeben, Vulkanausbrüche und Fischtrawler die Seekabel. Um die Konsequenzen solcher Ereignisse zu verstehen und die besten Reaktionsmöglichkeiten zu ermitteln, müssen die Merkmale des Netzwerkgraphen verstanden werden. Routing-Algorithmen und Netzwerkanalysen hängen eng mit Dingen wie dem Finden des kürzesten Pfades zwischen Knoten in einem Diagramm zusammen. Der Dijkstra-Algorithmus hilft Ihnen dabei.

Und doch, wie können Sie die Last aus einer großen Berechnung auf Rechenzentren in verschiedenen Teilen der Welt verteilen? Hier benötigen Sie auch einige physikalische Kenntnisse: Auf der Skala des Internets wird die Lichtgeschwindigkeit zu einem „Engpass“. Wärmeableitung , Stromdichte pro Flächeneinheit und mehr sind Beispiele dafür, was Programmierer bei der Arbeit mit realen Aufgaben berücksichtigen müssen. Soll ich ein Rechenzentrum in Island hosten? Günstige Kühl- und Geothermiequellen schaffen attraktive Bedingungen, aber wie steht es mit der minimalen Verzögerung für Benutzer, die möglicherweise daran interessiert sind, Geräte in einem solchen Rechenzentrum zu mieten? Wie groß ist die Entfernung entlang des Bogens eines großen Kreises zwischen beispielsweise Island und London oder Berlin und Amsterdam? All dies zu berechnen ist recht einfach, aber dafür sind bestimmte mathematische Kenntnisse erforderlich. Können wir Fasern von Island zu einem anderen Zentrum schicken? Was ist die durchschnittliche Verzögerung? Wie hoch ist die Wahrscheinlichkeit eines U-Boot-Kabelbruchs in der Nordsee während eines Betriebs von 12 Monaten? Und für 48 Monate?

Natürlich sind die Theorie der Algorithmen , die Theorie der Automaten , das Parsen , die formale Grammatik und die regulären Sprachen alle Wissensbereiche, mit denen sich Programmierer ständig befassen. Ich arbeite oft mit Parsing und Pattern Matching . Bei der Arbeit mit realen Daten können auch nicht sehr große Mengen Elemente enthalten, die zu pathologisch schlechtem Verhalten führen können, wenn beispielsweise Backtracking-Techniken verwendet werden . Wenn ich reguläre Ausdrücke verwende , um Daten abzugleichen, sollte ich vorsichtig sein und sicherstellen, dass diese Ausdrücke wirklich regulär sind .

Wenn ich einen Computer mit Speicher zum Speichern der kontextfreien Grammatik verwende (was übrigens jedes Mal geschieht, wenn Sie eine Anforderung an einen HTTP- Server senden), muss ich sicherstellen, dass ich die Rekursionstiefe beschränke, um zu vermeiden, dass der Prozessoraufrufstapel erschöpft wird, was Verständnis erfordert zugrunde liegende Berechnungsprinzipien und die Mathematik, auf der sie basieren.

Wenn ich meinen eigenen rekursiven Abstiegsalgorithmus für eine ungewöhnliche Grammatik schreiben muss und er nicht mit LALR (1) übereinstimmt ( ich kann also nicht nur Yacc oder Bison verwenden ), muss ich vorsichtig sein oder den Statusstapel von der prozeduralen Rekursion trennen. Dieses Verständnis ist auch erforderlich, wenn ich den DOM-Baum (oder eine rekursiv definierte Datenstruktur) umrunde. Einige Programmiersprachen betrachten dies als Schwierigkeit bei der Arbeit eines Programmierers und umgehen es durch die Verwendung segmentierter Stapel . Natürlich wäre es großartig, wenn ich meine Sammlung einiger der analysierten Ressourcen in Form einer Funktion (im mathematischen Sinne) definieren könnte. Und wie cool wäre es, wenn es nur um ein Problem der linearen Programmieroptimierung ginge?

Bitte beachten Sie, dass keines der oben genannten esoterischen Kenntnisse ist. All dies basiert auf Erfahrungen mit Aufgaben und realen Daten. Natürlich mache ich das nicht jeden Tag, aber das meiste dieses Wissens wende ich regelmäßig an und nur einige - von Zeit zu Zeit. Wahrscheinlich haben Beobachtung, Erfahrung und Heuristik mehr Einfluss auf den Prozess als sie sollten (heuristische Modelle sind oft unvollständig und ungenau). Verfüge ich über genügend mathematische Kenntnisse, um den durchschnittlichen Fehler zwischen der Realität und meinem heuristischen Modell zu berechnen?

Dies ist die Essenz der Informatik sowie ihre Interaktion mit der Programmierung und den Realitäten des modernen Rechnens. Ein IT-Experte zu sein ist nicht dasselbe wie ein Experte auf dem Gebiet der Computertheorie zu sein, und wie viele zu Recht betonen, ist ein solcher Experte einem angewandten Mathematiker viel näher als einem Fachhandwerker. Auf keinen Fall möchte ich die Bedeutung solcher Fachkräfte herabsetzen, da sie nützlich sind und allgemein anerkannt werden, aber ich möchte nur darauf hinweisen, dass Informatik etwas anderes ist.

(Übrigens bin ich selbst kein Experte für Informatik. Ich habe reine Mathematik studiert und mein beruflicher Beruf ist dem Ingenieurwesen viel näher.)

Bild

Source: https://habr.com/ru/post/de411731/


All Articles