Auf der Suche nach dem fehlenden Datentyp
- Ein Graph ist eine Menge von Knoten, die durch Pfeile (Kanten) verbunden sind.
- Knoten und Kanten können Daten enthalten.
- Im Software Engineering treten Graphen in vielen Formen auf, etwa als Paketabhängigkeiten, Internet-Links, Zustandsräume von Software, relationale Datenbanken, verkettete Listen, binäre Bäume und Hash-Tabellen.
- Auch in der Business-Logik werden Graphen genutzt, etwa für Verweise in Zitaten, Verkehrsnetze und soziale Netzwerke.
- Wer lange genug Software entwickelt, trifft wahrscheinlich überall auf Graphen.
Überlegungen zum Einsatz von Graphen
- Graphen sind nützlich, aber ihr Einsatz in echtem Code ist unerquicklich.
- In den meisten Mainstream-Sprachen gibt es keinen eingebauten Graph-Typ, in Standardbibliotheken ist er ebenfalls selten, und auch robuste Third-Party-Bibliotheken sind nicht zahlreich.
- Oft muss man Graphen selbst implementieren.
- Es gibt eine Lücke zwischen der Häufigkeit, mit der Software Engineers Graphen einsetzen könnten, und der Unterstützung dafür im Programmierökosystem.
Warum es keinen Graph-Typ gibt
Zu viele Designentscheidungen
- Es gibt viele Graph-Typen: gerichtete und ungerichtete Graphen, einfache Graphen und Multigraphen, Hypergraphen, Ubergraphs und weitere.
- Für jeden Typ muss entschieden werden, ob Knoten und Kanten IDs erhalten und welche Daten gespeichert werden sollen.
- Eine perfekte Graph-Bibliothek, die alle Möglichkeiten abdeckt, würde sehr viel Zeit erfordern.
- Die Performance von Graph-Algorithmen ist wichtig, und Spezialfälle sind relevant.
- Graph-Algorithmen korrekt zu implementieren ist schwierig.
Zu viele Implementierungsentscheidungen
- Selbst wenn man nur einfache gerichtete Graphen unterstützt, gibt es viele Möglichkeiten, einen Graphen intern darzustellen.
- Es gibt Kantenlisten, Adjazenzlisten, Adjazenzmatrizen, Mengen von Structs und weitere Speicherformen.
- Verschiedene Graph-Operationen haben je nach Darstellungsform unterschiedliche Performance-Eigenschaften.
- Je nachdem, ob ein Graph dünn oder dicht besetzt ist, ist eine andere interne Repräsentation optimal.
- Knotendaten, Kantendaten sowie verschiedene Arten von Knoten und Kanten zu implementieren, macht alles noch komplexer.
Performance ist zu wichtig
- Viele Graph-Algorithmen sind NP-vollständig oder noch schwieriger.
- Graphen können sehr große Probleme darstellen, und je nach Repräsentation und Implementierungsdetails des Algorithmus unterscheidet sich die Performance stark.
- Man braucht viel Kontrolle über Datenrepräsentation und Algorithmen.
Ein gemeinsamer Nenner
- Die Vielfalt an Graph-Typen, Repräsentationen und Algorithmen, die Sensibilität gegenüber Performance und die teuren Algorithmen auf großen Graphen sind Gründe dafür, dass Graph-Unterstützung nicht weit verbreitet ist.
- Das erklärt, warum Sprachen Graphen nicht in ihrer Standardbibliothek unterstützen.
- Es erklärt, warum Programmierer Third-Party-Graph-Bibliotheken meiden.
- Weil die Arbeit mit Graphen schwierig ist, möchte man außer in extremen Fällen gar nicht erst in Graphen denken.
Meinung von GN⁺
- Dieser Artikel liefert Einsichten dazu, warum sich Graphen in Programmiersprachen und Bibliotheken nicht als grundlegender Datentyp etabliert haben.
- Die Graphentheorie ist ein wichtiges Gebiet der Informatik und wird in vielen Bereichen angewendet, darunter Algorithmen, Netzwerkanalyse und Datenbanken.
- Um Graphen effektiv zu nutzen, sind Performance-Optimierung und die Wahl einer geeigneten Datenstruktur wichtig.
- Zu den Third-Party-Bibliotheken gehören NetworkX, Boost Graph Library und Graph-tool; sie können zur Lösung verschiedenster Graph-Probleme eingesetzt werden.
- Beim Einsatz von Graphen ist es wichtig, den zum Problem passenden Graph-Typ und Algorithmus auszuwählen, da dies direkten Einfluss auf die System-Performance hat.
1 Kommentare
Hacker-News-Kommentare
Graphviz verfügt über eine eigene Graphbibliothek, die in anderen Projekten nicht verwendet wird. Das hat Vor- und Nachteile.
Wenn man in .NET entwickelt, sollte man die kleine, nicht besonders funktionsreiche Graphbibliothek Arborescence ausprobieren.
Graphen sind keine Datenstruktur und kein Datentyp, sondern eine Abstraktion.
Ich wurde oft gefragt, warum es in Programmiersprachen keinen eingebauten Graph-Datentyp gibt.
Das zentrale Hindernis ist Folgendes:
Dieser Artikel beantwortet weitgehend auch die Frage, warum Graph-Algorithmen in Programmiersprachen nicht besser unterstützt werden.
Auch Werkzeuge zum Zeichnen von Graphen sind sehr enttäuschend.
Dieser Beitrag ist wirklich großartig.
Electric Clojure verwendet Clojure selbst (S-Ausdrücke) als Syntax zum Schreiben von Graphen.
Es gibt noch einen weiteren nützlichen Datentyp, nämlich Tabellen (wie Tabellen in einer Datenbank).