Ich fand es nicht so wichtig, außer um Ideen zu kommunizieren, und ich arbeite in leistungskritischen Bereichen (Raytracing, Bild- und Netzverarbeitung, Partikelsysteme, Physik-Engines usw.) und musste viele proprietäre Algorithmen und Datenstrukturen entwickeln bei der Arbeit in F & E. In diesen Bereichen kann eine Handvoll sehr effizienter Datenstrukturen und Algorithmen zu völlig neuen Spitzenprodukten führen, während die gestrigen Algorithmen vorhandene Produkte überflüssig machen, sodass stets eine effizientere Arbeitsweise angestrebt wird. Aus Sicherheitsgründen habe ich noch nie Artikel zu den von mir entwickelten Algorithmen veröffentlicht. Sie waren alle Eigentum. Wenn ich das tun würde, würde ich die Hilfe eines Mathematikers brauchen, um Beweise und so weiter zu formulieren.
Meiner Meinung nach ist die Menge an Rechenarbeit pro Iteration jedoch oft von unmittelbarerem Interesse als die Skalierbarkeit des Algorithmus, es sei denn, der Algorithmus skaliert wirklich schlecht. Wenn sich jemand ein innovatives Raytracing-Verfahren einfallen lässt, interessieren mich eher Computertechniken wie die Darstellung und der Zugriff auf Daten als die algorithmische Komplexität, da in diesem wettbewerbsorientierten und innovativen Szenario eine angemessene Skalierbarkeit bereits gegeben ist. Sie können nicht wettbewerbsfähig sein, wenn Sie Algorithmen entwickeln, die sich nicht skalieren lassen.
Wenn Sie die quadratische Komplexität mit der linearen vergleichen, ist das natürlich ein großer Unterschied. Aber die meisten Leute auf meinem Gebiet sind kompetent genug, um die Anwendung eines quadratischen Komplexitätsalgorithmus auf einen epischen Eingang zu vermeiden. Die Skalierbarkeit ist also oft tiefgreifend impliziert, und die aussagekräftigeren und interessanteren Fragen lauten: "Haben Sie GPGPU verwendet? SIMD? Wird es parallel ausgeführt? Wie haben Sie die Daten dargestellt? Haben Sie sie für cachefreundliche Zugriffsmuster neu organisiert? Wie viel Speicher benötigt es? Kann es diesen Fall robust behandeln? Verschieben Sie eine bestimmte Verarbeitung oder erledigen Sie alles auf einmal? "
Sogar ein linearithmischer Algorithmus kann einen linearen Zeitalgorithmus übertreffen, wenn der erstere beispielsweise in einem optimaleren Muster auf den Speicher zugreift oder besser für Multithreading und / oder SIMD geeignet ist. Manchmal kann sogar ein linearer Algorithmus aus diesen Gründen einen logarithmischen Algorithmus übertreffen, und natürlich übertreffen Algorithmen mit linearer Zeit logarithmische Algorithmen für Teeny-Eingaben.
Was für mich wichtiger ist, sind die sogenannten "Mikrooptimierungen", wie z. B. Datendarstellungen (Speicherlayouts, Zugriffsmuster mit Hot / Cold-Field-Splitting usw.), Multithreading, SIMD und gelegentlich GPGPU. In einem Bereich, in dem jeder bereits kompetent genug ist, um stets aktuelle Algorithmen für alles zu verwenden und neue Artikel zu veröffentlichen, liegt Ihr Wettbewerbsvorteil gegenüber den Algorithmus-Assistenten nicht in der Verbesserung der algorithmischen Komplexität, sondern vielmehr in der Direktheit Recheneffizienz.
Mein Fachgebiet wird von brillanten Mathematikern dominiert, aber nicht immer von solchen, die den Rechenaufwand für das, was sie tun, oder viele Tricks auf niedrigerer Ebene kennen, um den Code zu beschleunigen. Das ist normalerweise mein Vorteil, wenn es darum geht, schnellere und präzisere Algorithmen und Datenstrukturen zu entwickeln, obwohl ich viel weniger ausgefeilt bin. Ich spiele mit dem, was die Hardware mag, auf Bits und Bytes zu und mache jede Arbeitsiteration viel billiger, selbst wenn ich ein paar Iterationen mehr arbeite als der wirklich ausgefeilte Algorithmus - die Arbeit in meinem Fall ist drastisch billiger. Der Code, den ich schreibe, ist auch viel einfacher. Wenn die Leute denken, dass mikrooptimierte Versionen von einfachen Algorithmen und Datenstrukturen schwer zu verstehen und zu warten sind,
Als grundlegendes Beispiel habe ich eine einfache Gitterstruktur entwickelt, die einen KD-Baum in unserem Unternehmen für die Kollisionserkennung und das Entfernen redundanter Punkte übertrifft. Mein dummes Rohgitter war algorithmisch so viel weniger ausgefeilt und ich bin mathematisch und algorithmisch viel dümmer als der Typ, der den KD-Baum mit seiner neuartigen Methode zum Finden des Medianpunkts implementiert hat, aber ich habe gerade die Speichernutzung und Zugriffsmuster meines Gitters optimiert und das war genug, um etwas viel raffinierteres zu übertreffen.
Ein weiterer Vorteil, den ich habe und der es mir ermöglicht, in einem Umfeld zu überleben, das von Menschen dominiert wird, die viel schlauer sind als ich, besteht darin, wirklich zu verstehen, wie der Benutzer arbeitet, da ich die Software verwende, die ich auf die gleiche Weise entwickle. Das gibt mir Ideen für Algorithmen, die wirklich sehr schnell mit den Benutzerinteressen übereinstimmen. Als grundlegendes Beispiel versuchen die meisten Menschen, Dinge wie die Kollisionserkennung mithilfe der räumlichen Indizierung zu beschleunigen. Ich habe vor fast ein paar Jahrzehnten eine einfache karriereprägende Beobachtung für organische Modelle gemacht, wonach beispielsweise eine räumliche Indexstruktur, wenn ein Charakter seine Hände auf sein Gesicht legt, Knoten aufteilen und teure Aktualisierungen vornehmen müsste, wenn der Charakter dann nahm er die Hand vom Gesicht. Wenn Sie stattdessen anhand von Konnektivitätsdaten und nicht anhand von Scheitelpunktpositionen partitionieren, Sie können eine stabile hierarchische Struktur erhalten, die sehr schnell aktualisiert wird und niemals den Baum teilen oder neu ausbalancieren muss (nur die Begrenzungsrahmen müssen in jedem Bild der Animation aktualisiert werden) Das könnte sich einfallen lassen, wenn sie nur das Grundkonzept verstehen, aber diejenigen, die sich den Mathematikern entziehen, da sie die Dinge nicht so genau betrachten, wie die Benutzer arbeiten, und zu viel über die Eigenschaften der Geometrie nachdenken und nicht über die Geometrie wurde allgemein verwendet. Ich komme gut genug zurecht, indem ich mich mehr auf allgemeine Computer- und Benutzerkenntnisse als auf algorithmische Zauberei stütze. Ich fand es sowieso nicht wirklich wichtig, mich auf die algorithmische Komplexität zu konzentrieren.