Frage

Ich brauche also einen Weg, um eine ungerichtete Implementierung zu implementieren Netzwerk (Ich denke, das ist der richtige Begriff) in C#

Nehmen wir an, ich habe die folgenden Daten:

Foo1 <-> Bar1
Foo2 <-> Bar1
Foo2 <-> Bar2
Foo2 <-> Bar3
Foo3 <-> Bar2
Foo3 <-> Bar3

Wie würde ich etwas implementieren, das dies unterstützen könnte?

Eine Möglichkeit, dies zu tun, besteht darin, eine Klasse mit einem Foo und einer Balken zu erstellen, und für mein Beispiel würde ich 6 davon mit jeder möglichen Kombination haben, aber das verdoppelt Daten.

Mit diesen Daten muss ich in der Lage sein, Berechnungen auf FOO1 durchzuführen, basierend auf der Anzahl der Bars, und wie viele FOOs der Bars auch der Bars sind usw. usw. usw. usw.

Ich suche keine Antwort, ich würde lieber eine Richtung darüber, wie ich dies implementieren soll, vielleicht sogar ein paar Links.

War es hilfreich?

Lösung

Sie haben im Grunde ein Graph -Modell beschrieben, das traditionell als "Knoten" und "Kanten" angesehen wird. Aber die Wertpapiere/Darlehen funktionieren.

Es gibt zwei klassische Antworten auf solche Dinge.

Es hängt davon ab, welche Fragen Sie von Ihren Daten stellen möchten, wie effizient Sie sie speichern möchten und wie dicht Ihre Daten sind.

Wenn beispielsweise 30% der möglichen Beziehungen zwischen Wertpapieren und Darlehen existieren, zahlt sich eine dichte Datenstruktur definitiv aus. Halten Sie einfach eine große Matrix: Wertpapiere auf X. Darlehen auf Y. (x, y) bedeutet, dass das Darlehen vorhanden ist.

Wenn der Satz nicht sehr dicht ist, verwenden Sie "Sparse Edge -Datenstrukturen". Abhängig von Ihrer Bewerbung können Sie:

  1. Jedes S -Objekt hat eine Liste von It's Ls.{ S->L,L,L; S->L; S->L,L,L }. Macht es wirklich leicht, S -Nachbarn zu finden, aber es schwer zu finden, L zu finden

  2. S Objekte haben eine Liste von LS, LS haben eine Liste von S: (S->L,L,L und L->S,S,S). Nutzt mehr Platz, gibt Ihnen jedoch beide Abfragen von beiden Direktionen.

  3. Lagern Sie eine Reihe von Just (S,L) Paare. Ziemlich schlecht, es sei denn, Sie müssen meistens fragen: "Sind das und und das L verwandt?"

  4. Speichern Sie eine Liste von beidem S,L und L,S und indizieren es irgendwie. Dies ist es, was wir mit "Machen Sie Ihre Datenbank die Arbeit machen".

Siehe auch Datenstruktur für Beziehungen

Andere Tipps

Nun, ohne Ihnen eine Antwort zu geben, denken Sie darüber nach, was mit zweidimensionalen Arrays getan werden kann und über das Problem aus der Sicht des Speicherns von Informationen über Kanten nachdenken kann.

Dies riecht nach einem relationalen Datenbankproblem für mich. Was Sie beschrieben haben, sind zwei Tabellen mit einer vielen zu viele Beziehung. Ob diese Antwort angemessen ist, hängt stark davon ab, wie Ihre Daten tatsächlich aussehen. Der vorherige Vorschlag, dass jedes Objekt eine Liste des anderen Objekts enthält, ist ein Weg, aber nennen wir einen Spaten einen Spaten, dies ist eine relationale Datenbank. Erwägen Sie, eine Technologie wie das ado.net entity Framework oder LINQ zu verwenden, um Ihre Daten als relationale Datenbank zu definieren und LINQ zu verwenden, um die Daten abzufragen.

Sie erwähnen, dass Sie besorgt sind, das Gedächtnis zu verdoppeln. Auch dies hängt davon ab, wie Ihre realen Daten aussehen, aber wenn Sie jedoch massive Datenmengen haben, wird dies wahrscheinlich kein Problem sein. Der einzige verschwendete Speicher ist leerer Speicher. Verwenden Sie den Speicher, wenn es (a) das Problem leichter erleichtert oder (b) Ihnen mehr Flexibilität gibt. Optimieren Sie nicht, es sei denn, Sie haben ein Leistungsproblem.

Jede Klasse könnte eine Liste der Art der anderen haben. Sie duplizieren die Daten nicht auf diese Weise, es sei denn, Sie verwenden Werttypen. Die Kreuzreferenzen könnten für Speicherlecks führen.

Was Joe sagte, ist auf dem richtigen Weg. Jedes Darlehen hätte eine Liste von Sicherheitsinstanzen und jede Sicherheit würde eine Liste von Kreditinstanzen haben. Der Trick besteht darin, sicherzustellen, dass Sie nie einen Kredit haben, der denkt, dass es sich um eine Sicherheit handelt, diese Sicherheit jedoch nicht zustimmt. Ich würde empfehlen, Operationen nur in Paaren hinzuzufügen oder zu entfernen, um sicherzustellen, dass sie parallel durchgeführt werden. Ich sehe nicht, wie dies Speicherlecks verursachen würde, da der GC klug genug ist, um damit umzugehen. Im Gegensatz dazu kann dies ohne einige Tricks nicht damit umgehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top