Praktische Verwendung verschiedener Datenstrukturen [geschlossen]

102

Es wird viel über Datenstrukturen gesprochen, aber ich kann keine einfache Liste von Datenstrukturen und deren praktischer Verwendung finden. Ich versuche für ein Interview zu lernen und ich denke, das würde mir helfen, zusammen mit vielen anderen. Ich suche so etwas:

Datenstruktur - Beispiel / Verwendet für

Hash-Tabelle - schnelle Daten-Suche ... dann geben Sie ein Beispiel

Array - ...

Binärer Baum - ...

Wenn es irgendwo eine solche Ressource gibt, lassen Sie es mich bitte wissen.

Vielen Dank!

EDIT: Ich meine, Wikipedia ist gut und alles, aber auf den meisten Seiten werden praktische Verwendungen nicht aufgeführt. Ich suche etwas mehr als das.

Joel
quelle

Antworten:

96

Fand die Liste in einer ähnlichen Frage, zuvor auf StackOverflow:

Hash-Tabelle - wird für die schnelle Suche nach Daten verwendet - Symboltabelle für Compiler, Datenbankindizierung, Caches, eindeutige Datendarstellung.

Trie - Wörterbuch, wie es auf einem Mobiltelefon zur automatischen Vervollständigung und Rechtschreibprüfung zu finden ist.

Suffixbaum - schnelle Volltextsuche, die in den meisten Textverarbeitungsprogrammen verwendet wird.

Stack - Undo \ Redo-Operation in Textverarbeitungsprogrammen, Ausdrucksauswertung und Syntaxanalyse. Viele virtuelle Maschinen wie JVM sind stapelorientiert.

Warteschlangen - Transport- und Betriebsforschung, bei der verschiedene Entitäten gespeichert und zur späteren Verarbeitung gehalten werden, dh die Warteschlange erfüllt die Funktion eines Puffers.

Prioritätswarteschlangen - Prozessplanung im Kernel

Bäume - Parser, Dateisystem

Radix-Baum - IP-Routing-Tabelle

BSP-Baum - 3D-Computergrafik

Grafiken - Verbindungen / Beziehungen in Websites sozialer Netzwerke, Routing, Kommunikationsnetzwerke, Datenorganisation usw.

Heap - Dynamische Speicherzuordnung in lisp

Dies ist die Antwort, die ursprünglich von RV Pradeep gepostet wurde

Einige andere, weniger nützliche Links:

Anwendungen werden nur für einige Datenstrukturen aufgelistet

Nicht anwendungsorientiert, durch gute Zusammenfassung und relevant

MXMLLN
quelle
1
Ihr erster Link ist kaputt
Dan Beaulieu
Vielen Dank, @DanBeaulieu. Ich habe den toten Link entfernt.
MXMLLN
1
Sehr schöne Zusammenfassung. Wahrscheinlich endet die Liste der Verwendungen nie, aber man bekommt den Punkt.
Nick L.
1
Wäre das Rückgängigmachen / Wiederherstellen wirklich ein Stapel? Wenn das Rückgängigmachen oben auf dem Stapel angezeigt wird, können Sie es nicht wiederholen.
Tony L.
5
@ TonyL. Ich weiß, dass dies eine ältere Frage ist, aber ich glaube, dass 2 Stapel verwendet werden oder Rückgängig / Wiederherstellen. Wenn Sie eine Aktion rückgängig machen, wird sie vom Aktionsstapel entfernt und auf den Wiederherstellungsstapel gelegt. Wenn Sie wiederholen, nehmen Sie es vom Redo-Stapel und schieben es auf den Aktionsstapel. Ich habe vielleicht eine falsche Terminologie, aber es sollte Beispiele geben.
Rick Henderson
14

Ich bin im selben Boot wie Sie. Ich muss für technische Interviews lernen, aber das Auswendiglernen einer Liste ist nicht wirklich hilfreich. Wenn Sie 3-4 Stunden Zeit haben und einen tieferen Tauchgang machen möchten, empfehle ich das Auschecken

mycodeschool
Ich habe mir Coursera und andere Ressourcen wie Blogs und Lehrbücher angesehen, aber ich finde sie entweder nicht umfassend genug oder am anderen Ende des Spektrums, zu dicht mit den erforderlichen Terminologien der Informatik.

Der Typ im Video hat eine Reihe von Vorträgen über Datenstrukturen. Kümmere dich nicht um die albernen Zeichnungen oder den leichten Akzent. Sie müssen nicht nur verstehen, welche Datenstruktur ausgewählt werden soll, sondern auch einige andere Punkte, die zu berücksichtigen sind, wenn Menschen über Datenstrukturen nachdenken:

  • Vor- und Nachteile der gemeinsamen Datenstrukturen
  • warum jede Datenstruktur existiert
  • wie es tatsächlich im Speicher funktioniert
  • spezifische Fragen / Übungen und Entscheidung, welche Struktur für maximale Effizienz verwendet werden soll
  • luzide Big 0 Erklärung

Ich habe auch Notizen auf Github gepostet, wenn Sie interessiert sind.

the_answer_is_xyz
quelle
7

Nach meinem Verständnis handelt es sich bei der Datenstruktur um alle Daten, die sich im Speicher eines elektronischen Systems befinden und effizient verwaltet werden können. Oft ist es ein Gedächtnisspiel oder eine schnellere Zugänglichkeit von Daten. Auch in Bezug auf den Arbeitsspeicher gibt es Kompromisse bei der Verwaltung von Daten auf der Grundlage der Kosten für das Unternehmen dieses Endprodukts. Effizient verwaltet zeigt uns, wie am besten auf die Daten zugegriffen werden kann, basierend auf den Hauptanforderungen des Endprodukts. Dies ist eine Erklärung auf sehr hoher Ebene, aber Datenstrukturen sind ein großes Thema. Die meisten Interviewer tauchen in Datenstrukturen ein, die sie sich leisten können, um sie je nach Zeit in den Interviews zu diskutieren. Dabei handelt es sich um verknüpfte Listen und verwandte Themen.

Diese Datentypen können nun basierend auf der Art und Weise, wie sie logisch aufgebaut sind und auf sie zugegriffen wird, in primitive, abstrakte und zusammengesetzte Datentypen unterteilt werden.

  • Primitive Datenstrukturen sind Grundbausteine ​​für alle Datenstrukturen, sie haben einen kontinuierlichen Speicher für sie: Boolean, Char, Int, Float, Double, String.
  • Zusammengesetzte Datenstrukturen sind Datenstrukturen, die aus mehr als einem primitiven Datentyp bestehen. Klasse, Struktur, Vereinigung, Array / Datensatz.
  • abstrakte Datentypen sind zusammengesetzte Datentypen, auf die effizient zugegriffen werden kann, was als Algorithmus bezeichnet wird. Abhängig von der Art und Weise, wie auf die Daten zugegriffen wird, werden Datenstrukturen in lineare und nichtlineare Datentypen unterteilt. Verknüpfte Listen, Stapel, Warteschlangen usw. sind lineare Datentypen. Heaps, Binärbäume und Hash-Tabellen usw. sind nichtlineare Datentypen.

Ich hoffe, das hilft dir beim Eintauchen.

JavaUSer
quelle
6

Das ausgezeichnete Buch " Algorithm Design Manual" von Skienna enthält ein riesiges Repository an Algorithmen und Datenstrukturen.

Für Tonnen von Problemen werden Datenstrukturen und Algorithmen beschrieben, verglichen und die praktische Verwendung diskutiert. Der Autor verweist auch auf Implementierungen und die Originalarbeiten.

Das Buch ist großartig, wenn Sie die beste Datenstruktur für Ihr zu lösendes Problem suchen. Es ist auch sehr hilfreich für die Vorbereitung von Interviews.

Eine weitere großartige Ressource ist das NIST Dictionary of Data Strukturen und Algorithmen .

dmeister
quelle
4

Nur wenige weitere praktische Anwendung von Datenstrukturen

Rot-Schwarz-Bäume (Wird bei häufigem Einfügen / Löschen und wenigen Suchvorgängen verwendet) - K-Mittelwert-Clustering mit rotem Schwarzbaum, Datenbanken, einfältiger Datenbank, Suchen von Wörtern in Wörterbüchern, Suchen im Web

AVL-Bäume (mehr Suche und weniger Einfügen / Löschen) - Datenanalyse und Data Mining sowie die Anwendungen, bei denen mehr gesucht wird

Min Heap - Clustering-Algorithmen

Aravind Krishnakumar
quelle
3

Jedes Ranking verschiedener Datenstrukturen ist zumindest teilweise an den Problemkontext gebunden. Es wäre hilfreich zu lernen, wie man die zeitliche und räumliche Leistung von Algorithmen analysiert. Typischerweise wird die "große O-Notation" verwendet, z. B. erfolgt die binäre Suche in der Zeit O (log n), was bedeutet, dass die Zeit für die Suche nach einem Element das Protokoll (implizit in Basis 2) der Anzahl der Elemente ist. Intuitiv erhöht die Verdoppelung der Anzahl der Elemente die Zeit um 1 Schritt, da bei jedem Schritt die Hälfte der verbleibenden Daten als irrelevant verworfen wird. (Die binäre Suche lässt sich recht gut skalieren.) Die Speicherleistung betrifft, wie der Speicher für größere Datenmengen wächst. Beachten Sie außerdem, dass die Big-O-Notation konstante Faktoren ignoriert. Bei kleineren Datensätzen ist ein O (n ^ 2) -Algorithmus möglicherweise immer noch schneller als ein O (n * log n) -Algorithmus mit einem höheren konstanten Faktor.

Neben Zeit und Raum gehören zu den weiteren Merkmalen, ob eine Datenstruktur sortiert ist (Bäume und Skiplisten werden sortiert, Hash-Tabellen nicht), Persistenz (Binärbäume können Zeiger aus älteren Versionen wiederverwenden, während Hash-Tabellen an Ort und Stelle geändert werden) usw.

Während Sie das Verhalten mehrerer Datenstrukturen lernen müssen, um sie vergleichen zu können, besteht eine Möglichkeit, ein Gefühl dafür zu entwickeln, warum sie sich in der Leistung unterscheiden, darin, einige genau zu untersuchen. Ich würde vorschlagen, einfach verknüpfte Listen, binäre Suchbäume und Sprunglisten zu vergleichen , die alle relativ einfach sind, aber sehr unterschiedliche Eigenschaften haben. Überlegen Sie, wie viel Arbeit erforderlich ist, um einen Wert zu finden, einen neuen Wert hinzuzufügen, alle Werte in der richtigen Reihenfolge zu finden usw.

Es gibt verschiedene Texte zur Analyse der Leistung von Algorithmen / Datenstrukturen, die von den Leuten empfohlen werden, aber was sie für mich wirklich sinnvoll machte, war das Erlernen von OCaml. Der Umgang mit komplexen Datenstrukturen ist die Stärke von ML, und ihr Verhalten ist viel klarer, wenn Sie Zeiger und Speicherverwaltung wie in C vermeiden können. (OCaml nur zu lernen, um Datenstrukturen zu verstehen, ist jedoch mit ziemlicher Sicherheit der lange Weg. :))

stilles Fahrrad
quelle