4

したがって、C#で無向ネットワーク(これは正しい用語だと思います)を実装するための何らかの方法が必要です

次のデータがあるとしましょう。

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

これをサポートできるものをどのように実装しますか?

これを行う1つの方法は、FooとBarを含むクラスを作成することです。私の例では、これらを6つ、可能な組み合わせごとに作成しますが、これによりデータが2倍になります。

このデータを使用して、Foo1で、バーのポイントもいくつあるか、Fooのバーのポイントもいくつあるかなどに基づいて計算を実行できる必要があります。

私は答えを探していません。これを実装する方法について、おそらくいくつかのリンクでさえ、いくつかの方向性を示したいと思います。

4

5 に答える 5

1

基本的に、従来は「ノード」および「エッジ」と考えられていたグラフモデルの概要を説明しました。しかし、証券/ローンは機能します。

この種のことに対する2つの古典的な答えがあります。

データについてどのような質問をしたいか、データをどれだけ効率的に保存したいか、データの密度によって異なります。

たとえば、証券とローンの間に考えられる関係の30%が存在する場合、密なデータ構造は間違いなく報われるでしょう。大きなマトリックスを保持するだけです。Xの証券。Yのローン。(X、Y)は、ローンが存在することを意味します。

セットがあまり密集していない場合は、「スパースエッジデータ構造」の使用を開始します。アプリケーションに応じて、次のことができます。

  1. すべてのSオブジェクトには、そのLのリストがあります。 { S->L,L,L; S->L; S->L,L,L }。Sの隣人を見つけるのは本当に簡単ですが、Lの隣人を見つけるのは難しいです

  2. SオブジェクトにはLのリストがあり、LにはSのリストがあります:(S->L,L,LおよびL->S,S,S)。より多くのスペースを使用しますが、双方向のクエリを提供します。

  3. ちょうど(S,L)ペアのセットを保存します。「これはSとそのLは関連していますか?」と尋ねる必要がほとんどない限り、かなり悪いです。

  4. 両方のリストをS,L保存L,Sし、なんらかの方法でインデックスを作成します。これが、「データベースに作業を行わせる」という意味です。

関係のデータ構造も参照してください。

于 2009-09-04T01:11:30.090 に答える
1

さて、答えを出さずに、2次元配列で何ができるかを考え、エッジに関する情報を格納するという観点から問題を考えてください。

于 2009-09-04T00:28:39.337 に答える
1

これは私にはリレーショナルデータベースの問題のようなにおいがします。あなたが説明したのは、多対多の関係を持つ2つのテーブルです。この答えが適切かどうかは、データが実際にどのように見えるかに大きく依存します。各オブジェクトに他のオブジェクトのリストを含めるという以前の提案は1つの方法ですが、スペードをスペードと呼びましょう。これはリレーショナルデータベースです。ADO.Net Entity FrameworkやLINQなどのテクノロジを使用してデータをリレーショナルデータベースとして定義し、LINQを使用してデータをクエリすることを検討してください。

あなたはあなたが記憶を倍増することを心配していると言います。繰り返しますが、これは実際のデータがどのように見えるかによって異なりますが、大量のデータがない限り、これはおそらく問題にはなりません。無駄なメモリは空のメモリだけです。(a)問題の解決が容易になる場合、または(b)柔軟性が高まる場合は、メモリを使用してください。パフォーマンスに問題がない限り、最適化しないでください。

于 2009-09-04T00:41:04.313 に答える
0

各クラスは、他のタイプのリストを持つことができます。値型を使用していない限り、この方法でデータを複製しないでください。相互参照により、メモリリークが発生する可能性があります。

于 2009-09-04T00:31:06.627 に答える
0

ジョーが言ったことは正しい方向に進んでいます。各ローンにはセキュリティインスタンスのリストがあり、各セキュリティにはローンインスタンスのリストがあります。秘訣は、セキュリティに関連していると考えているが、セキュリティが同意していないローンを決して持たないようにすることです。追加または削除操作をペアでのみ許可して、それらが並行して実行されるようにすることをお勧めします。GCはこれを処理するのに十分賢いので、これがどのようにメモリリークを引き起こすのかわかりません。対照的に、参照カウントは、いくつかのトリックなしではこれを処理できません。

于 2009-09-04T00:59:05.083 に答える