Was ist die komplizierteste Datenstruktur, die Sie in einer praktischen Situation verwendet haben? [geschlossen]


16

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.


Geschrieben von anderen oder von uns selbst?

Meine ursprüngliche Absicht war, was auch immer sich selbst entwickelt hat, aber ich denke, es fügt der Frage eine interessante Dimension hinzu. Originalfrage bearbeitet.
Fanatic23

Komplexität bedeutet nicht, dass es anspruchsvoll ist. Einfacher = immer besser.
tp1

Die komplexesten waren immer bei STL erhältlich. Komplexität beruht normalerweise auf verschachtelten Datenstrukturen, nicht auf deren Typ. Einfache Struktur = gut, sofern sich der Profiler nicht beschwert.
Coder

-1 für nicht benötigte Wertermittlung. Ich könnte genauso gut sagen: Wenn Sie heutzutage Datenstrukturen selbst implementieren, sind Sie dumm und stur. Seien Sie nicht der nächste schlaue Kerl, der glaubt, eine Datenstruktur falsch implementieren zu können.
Pieter B

Antworten:


7

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.


7

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 :)


4

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.


5
Mein Rat an alle, die eine "down" -Stimme abgeben, ist, dass man einen Kommentar hinzufügt, der angibt, warum man seine "down" -Stimme abgibt. Ich kann mit jemandem umgehen, der eine andere Meinung hat. Was ich jedoch nicht verarbeiten kann, ist Feigheit.
Bit-Twiddler

2
@ bit-twiddler Ich habe in meinem Philosophiestudium den Satz von De Morgan gelernt. Jetzt mache ich CS, es wurde nicht erwähnt. Ehrlich gesagt sehe ich diese Art von Dingen als Abkürzung, die am besten mit Erfahrung einhergeht. Müssen Sie sich wirklich an die Regeln (und den Namen!) Erinnern, die Sie bei der Faktorisierung einer Gleichung anwenden? Ich weiß nichts über dich, aber ich arbeite es auf der Grundlage dessen aus, was vor mir liegt und nicht auswendig. Gleiches gilt für das Ändern logischer Ausdrücke.
Rupert Madden-Abbott

2
@ Rupert: De Morgans Theorem wird normalerweise in diskreten Mathematik- und Computerorganisationen behandelt (beide sind in den USA für Grundstudiengänge erforderlich). Ich habe mich als Student auf Computerarchitektur / Systemsoftware konzentriert. De Morgans Theorem wird häufig im digitalen Logikdesign verwendet. Es gibt Bereiche in der Low-Level-Softwareentwicklung, in denen die Kenntnis des Satzes von De Morgan von entscheidender Bedeutung ist. Beispielsweise gibt es Computer mit minimalem Befehlssatz, die keinen vollständigen Satz von Booleschen Anweisungen enthalten. Daher muss es möglich sein, eine Boolesche Operation von einer anderen abzuleiten.
Bit-Twiddler

1
(Forts.) Hier ist ein Test, bei dem die meisten Absolventen von Nicht-Informatik / Computertechnik / Elektrotechnik (Konzentration auf Computertechnik) entweder scheitern oder die Beantwortung sehr lange in Anspruch nehmen. Leiten Sie die folgenden Booleschen Operationen ab, wenn Sie nur die (negative) NAND-Operation verwenden: NOT, AND, OR, NOR, XOR und XNOR. Wenn Sie den Satz von De Morgan kennen, können Sie diese sechs booleschen Operationen viel einfacher ableiten. Der Satz von De Morgan ist mit Abstand der wichtigste Satz im digitalen Logikdesign.
Bit-Twiddler

1
..... obwohl, um fair zu sein, in einer Branche, in der ein Großteil der Arbeit in das Schreiben von halbherzigen RoR-Apps für ein kleines Unternehmen fließt, gibt es wahrscheinlich 1 Mal in 1000000000, in denen Sie sogar HEARD of the benötigen würden Konzept der Logikgatter und der Booleschen Algebra, anstatt nur die Bedeutung der englischen Wörter "oder" und "und" zu kennen. Wenn Sie nicht sagen, dass diese Dinge nicht relevant sind, um zu wissen, ob Sie CS-Arbeit oder komplexe Algorithmen oder Optimierungen oder Low-Level-Programmierung ausführen, ist dies für die Mehrheit der als Programmierer tätigen Personen eine Art nutzloser Trivia.
Sara

2

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.


2

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.


1

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.


In C ++ ist das so std::listund es gibt wirklich nichts Kompliziertes: / Ich finde den rot-schwarzen Baum / den AVL-Baum viel komplizierter, mit all diesen Bedingungen für das Rebalancing!
Matthieu M.

@ Mathieu std :: map und Sie erhalten höchstwahrscheinlich einen RB-Baum.
aufather

1

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 ...


nimmt Brille ab "Lieber Gott."
Len Joseph

1

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.


1
Das klingt für einen Sudoku-Löser wie ein Overkill, da ein Brute-Force-Backtracking-Algorithmus das Rätsel schneller löst, als Sie die Daten eingeben können.
Kevin Cline

3
@kevin, dancing links ist ein Brute-Force-Backtracking-Algorithmus - allerdings mit einer plausiblen Heuristik.
Peter Taylor

Sie benötigen eine Heuristik, wenn Sie beispielsweise die Gesamtzahl der Lösungen aufzählen und behaupten möchten, dass ein Sudoku nur eine einzige Lösung enthält.
ProdigySim

1

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.


0

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.


Meine Absicht war es, keine exotische Datenstruktur zu erzwingen. Aber es ist eine traurige Situation, wenn Sie etwas aus der Box brauchen und sich mit dem auseinandersetzen müssen, was bereits verfügbar ist, nur weil es die Unternehmensrichtlinie vorschreibt.
Fanatic23

0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.