Adjacency List
次のコードのように、C#を使用し
てグラフを表現しようとしています。しかし、C#でより良い実装を見つけることができる場所を知りたいです。Java用のこのWebサイトのように:http://algs4.cs.princeton.edu/41undirected/Graph.java.html
この実装を改善するために、私はいくつかの質問があります:
- 使用する別の単純なデータ構造があり、、、など
DFS
の操作BFS
をFind the Shortest-path
簡単にすることができますか?または、解決すべき問題に応じてデータ構造が大きく変化しますか?
===編集済み===
以下のようにデータ構造を実装してみました。
OBS:このアプローチは単純に見えますが、たとえば、常に最初の要素を追跡する必要があるため、DFSにはあまり適していないことに後で気付きますLinkedList
。私のソリューションでは、カスタムを使用する方が良いようです。の代わりにリンクリストを作成しました
LinkedList<Vertex>
。
以下のコメントを考慮し、単純さを維持するために、いくつかの変更を加えました。しかし、その変更が。のような以降の操作に影響を与えるかどうかはわかりませんBFS
。直接および間接のグラフを作成できるようにするには、プロパティよりもインターフェイスを使用する方が良いと思います。
public interface IGraph
{
void InsertEdge(int edgeAKey, int edgeBKey);
void IsertNewVertex(int vertexKey);
LinkedList<Vertex> FindByKey(int vertexKey);
bool ExistKey(int vertexKey);
}
できるだけ単純にするために、Dictionary
やのようなすでに実装されているデータ構造を使用できますLinkedList
。object
また、 asを使用する代わりに、Dictionary key
簡単にするために、別のにすでに存在する値を追加する場合はVertex
、key
(またはlabel
)とを作成できます。value
Vertex
public class GraphDirect : IGraph
{
private Dictionary<int,LinkedList<Vertex>> Vertexes { get; set; }
public GraphDirect()
{
Vertexes = new Dictionary<int, LinkedList<Vertex>>();
}
public bool ExistKey(int vertexKey)
{
if (this.FindByKey(vertexKey) == null)
return false;
else
return true;
}
public void IsertNewVertex(int vertexKey)
{
if (!this.ExistKey(vertexKey))
{
Vertex vertex = new Vertex(vertexKey);
LinkedList<Vertex> listVertexes = new LinkedList<Vertex>();
listVertexes.AddFirst(vertex);
this.Vertexes.Add(vertexKey, listVertexes);
}
}
public void InsertEdge(int vertexAKey, int vertexBKey)
{
//Create the vertex A, if it doesn't exist
if (!this.ExistKey(vertexAKey))
{
this.IsertNewVertex(vertexAKey);
}
//Will always insert the vertex B on this edge
this.FindByKey(vertexAKey).AddLast(new Vertex(vertexBKey));
//Create the vertex B, if doesn't exist
if (!this.ExistKey(vertexBKey))
{
this.IsertNewVertex(vertexBKey);
}
}
public LinkedList<Vertex> FindByKey(int vertexKey)
{
if (this.Vertexes.ContainsKey(vertexKey))
return this.Vertexes[vertexKey];
return null;
}
}
Vertexクラスは他のポインタを必要とせず、必要に応じてkey
とを保持するだけvalue
です。
public enum State { Visited = 0, UnVisited = 1, Processed = 2 }
public class Vertex
{
public int Key;
public int Value;
public State Status = State.UnVisited;
public Vertex(int key)
{
this.Key = key;
this.Value = 0;
}
public Vertex(int key, int value)
{
this.Key = key;
this.Value = value;
}
}
public class Start
{
public static void Main(){
GraphDirect gDirect = new GraphDirect();
gDirect.InsertEdge(2, 3);
gDirect.InsertEdge(2, 8);
gDirect.InsertEdge(5, 6);
}
}