Der Keim für diese Frage ging aus einer Diskussion hervor, die ich mit einigen Kollegen aus der Branche führte.
Es stellt sich heraus, dass Projektmanager an vielen Stellen mit komplexen Datenstrukturen vorsichtig sind und im Allgemeinen darauf bestehen, was aus Standardbibliotheken / -paketen bereits vorhanden ist. Die allgemeine Idee scheint wie die Verwendung einer Kombination von bereits verfügbaren Elementen zu sein, es sei denn, die Leistung wird ernsthaft beeinträchtigt. Dies hilft dabei, die Codebasis einfach zu halten, was für den Nicht-Diplomaten bedeuten würde, dass "wir einen hohen Abrieb haben und neuere, die wir einstellen, möglicherweise nicht so gut sind".
Also keine Bloom-Filter oder Skip-Listen oder Spreizbäume für deine CS-Junkies. Hier ist also (noch einmal) die Frage: Was ist die komplizierteste Datenstruktur, die Sie im Büro verwendet haben?
Hilft ein Gefühl dafür zu bekommen, wie gut / anspruchsvoll echte Software ist.
quelle
Antworten:
Habe Sprunglisten zum Nachschlagen benutzt. Wo ich arbeite, gibt es eine Standardimplementierung, und jeder wird ermutigt, sie zu verwenden. Habe versucht, IP-Adressen effizient zu speichern und abzurufen. Auch hier war die Umsetzung bereits vorhanden.
quelle
Ich bin Java-Entwickler. Java Collection Framework kann meine 90% Datenstrukturprobleme lösen, andere 10% benötigen Mühe. Ich denke, wenn Sie die von Experten geschriebene hochentwickelte Standardbibliothek wirklich verstehen, werden Sie feststellen, dass sie in den meisten Fällen hilfreich ist.
Komplexe Datenstrukturen sind in der Praxis nur schwer zu pflegen. Um zu vermeiden, dass der Code durcheinander gebracht wird, werde ich einige kleinere Probleme aufteilen. Jedes kleine Problem kann mit Java Collection Framework gelöst werden . Möglicherweise ist die Lösung nicht die intelligenteste (sie benötigt mehr Speicher und ist langsamer), funktioniert jedoch und ist einfach zu warten. Es ist ein Kompromiss.
Wenn ich komplexe Datenstrukturen schreiben muss, nehme ich das Lehrbuch :)
quelle
Die komplizierteste Datenstruktur, die ich im Job verwendet habe, war ein Versuch. Das war jedoch vor zwanzig Jahren.
Das Problem bei der industriellen Softwareentwicklung ist, dass die meisten industriellen Programmierer keine Informatik-Absolventen (CompSci) sind. Aus diesem Grund werden Techniken, die ein durchschnittlicher CompSci-Abschluss für selbstverständlich hält, als zu schwierig für Brot-und-Butter-Programmierer angesehen.
Das Fehlen allgemeiner CompSci-Kenntnisse in der Branche ist ein ernstes Problem. Zum Beispiel habe ich die Anzahl der Softwareentwickler, die ich getroffen habe, die diese Ausdrücke wie! (A! = 5 && b! = 3) und a == 5 || nicht verstehen, verloren b == 3 sind logisch äquivalent. Jeder, der weiß, wie man den Satz von DeMorgan anwendet, kann erkennen, dass diese Ausdrücke logisch äquivalent sind. Die meisten Nicht-CompSci-Absolventen haben noch nie von DeMorgan's Theorem gehört. Wenn man eine wesentliche Codebasis untersucht, findet man viele Vorkommen von Ausdrücken, die negative logische Unterausdrücke negieren. Die Lesbarkeit von Code, der negierte negative logische Unterausdrücke enthält, wird fast immer verbessert, indem diese Ausdrücke in ihre nicht negierte Form umgewandelt werden.
quelle
Ich habe einmal eine Kalenderwarteschlange (O (1) -Prioritätswarteschlange) für eine ereignisbasierte Simulation geschrieben, bei der die Profilerstellung zeigte, dass der vorhandene Heap ein Engpass war.
Ich habe auch ein Produkt herausgebracht, das eine Finite-State-Maschine mit ungefähr 80000 Zuständen enthielt - der Code, mit dem es generiert wurde, war, gelinde gesagt, etwas fummelig.
quelle
Vor langer, langer Zeit in einer Galaxie ... Arbeitete in einem Team, das Knuths "Buddy Buffer" in einem RTOS in Assembler verwendete.
Außerdem Conways Spiel des Lebens mit 256 Generationen für eine Welt von 1024 x 1024.
quelle
Nicht wirklich etwas zu Besonderes verwendet, von Grund auf wäre es eine doppelt verknüpfte Liste .
Nicht sehr aufregend, ich habe andere Strukturen verwendet. Aber Ihre Frage wurde von Grund auf neu gestellt.
quelle
std::list
und es gibt wirklich nichts Kompliziertes: / Ich finde den rot-schwarzen Baum / den AVL-Baum viel komplizierter, mit all diesen Bedingungen für das Rebalancing!Ein Baum von Hashtabellen mit allgemeinen Listen von Finanzdaten - fragen Sie nicht einmal. Manchmal wünschte ich, ich wäre ein Cowboy. Ah, das einfache Leben unter den Sternen ...
quelle
Für den Dancing Links-Algorithmus eines Sudoku-Lösers musste ich von Grund auf eine Circular Double-Linked-List-Struktur schreiben . Es fühlte sich an, als würde man einen Zauberwürfel entwerfen. Die gesamte Struktur bestand im Wesentlichen aus einer Liste von Listen - wobei jeder Knoten auf vier andere verweist.
quelle
Ich habe einmal einen Baum mit gewichteter Pfadlänge für einen speziellen Cache verwendet. Das hat Spaß gemacht. Ich habe auch meine eigenen Heap-Management-Routinen für einen
malloc()
Ersatz geschrieben, aber viele Leute haben das getan.quelle
Nachdem ich es mir überlegt habe, ist die "komplizierteste" Datenstruktur, die ich von Grund auf erstellt habe, die Modellierung eines Netzwerks von Elementen, das auf doppelt verknüpften Listen basierte. Aber das war vor Jahren, als ich auf Systemebene programmierte.
Heute erstelle ich kaum noch ausgefallene Datenstrukturen. Das meiste davon geschieht in der Datenbank, in der Sie entscheiden, was Sie in eine Tabelle einfügen, möglicherweise einen vorberechneten Wert, möglicherweise die ID eines verwandten Datensatzes zum schnellen Abrufen, um ein unnötiges Nachschlagen zu vermeiden.
Ich persönlich finde, dass die vorliegende Aufgabe die Mittel definiert. Warum sollte man sich bemühen, eine exotische Datenstruktur zu verwenden, wenn es keine Verwendung dafür gibt? Und wenn ich sagen darf, dass es bei den meisten praktischen angewandten Programmen wahrscheinlich nicht notwendig ist, das Rad neu zu erfinden.
quelle
Zählt eine Prioritätswarteschlange? Das kommt in fast jeder Echtzeitanwendung vor, die ich geschrieben habe. Es wurde erst kürzlich Teil der Java-Standardbibliothek (Java 1.5).
Abgesehen davon fällt mir nichts Kompliziertes ein, was ich wirklich wollte und das ich nicht aus einer Bibliothek herausholen konnte. Das würde mich nicht aufhalten lassen, aber ich würde fragen, warum ich eine Datenstruktur brauchte, die zu exotisch für die Bibliotheken war. Ich würde auf jeden Fall nach einer vorhandenen Open-Source-Implementierung eines Trie- oder Bloom-Filters oder einer Skip-Liste suchen, bevor ich selbst versuchte, eine zu schreiben.
Im Allgemeinen stimme ich Ihrem Vorgesetzten zu, dass die Kosten für die Erstellung und Pflege einer benutzerdefinierten Datenstruktur, die zu hoch sind, als dass keine Bibliotheksversion verfügbar wäre, den daraus resultierenden Leistungsvorteil überwiegen könnten. Ich möchte, dass Sie durch Profilerstellung zeigen, dass die einfachen Bibliotheksstrukturen einen erheblichen Leistungsverlust verursachen, bevor Sie sie mit etwas Besonderem optimieren können. Weil es in der Regel billiger ist, Prozessorzyklen als Entwicklungszyklen zu kaufen.
quelle