Mapを隣接リストとして使用してグラフクラスを実装しています。グラフ内の各ノードを表すために使用している単純なクラスVertexを使用しています。
export class Vertex {
constructor(value) {
if (value) this.value = value;
else throw new Error("Value must be specified");
}
getValue() {
return this.value;
}
setValue(value) {
if (value) this.value = value;
else throw new Error("Value must be specified");
}
}
次に、グラフクラスで、頂点とエッジを追加するためのコンストラクターと2つのメソッドを実装しました。
export class UndirectedGraph {
constructor() {
this.adjacencyList = new Map();
}
addVertex(value) {
if (value) {
const vertex = new Vertex(value);
this.adjacencyList.set(vertex, []);
}
}
addEdge(to, from) {
if (
!to ||
!from ||
!(to.constructor === Vertex && from.constructor === Vertex)
) {
throw new Error("Arguments must be of type Vertex");
}
if (
!this.adjacencyList.get(to) ||
!this.adjacencyList.get(from)
) {
throw new Error(
"Both arguments must already be nodes in this undirected graph"
);
}
this.adjacencyList.get(to).push(from);
this.adjacencyList.get(from).push(to);
}
getAdjacencyList() {
return this.adjacencyList;
}
}
次に、addEdge()
関数を呼び出して、Vertexタイプの2つのインスタンス間にエッジを作成します。
const graph = new UndirectedGraph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("B");
graph.addEdge(..., ...);
addEdge()
「A」と「B」の特定のインスタンスの間にエッジを作成するには、関数に何を渡しますか?参照できる頂点インスタンスの変数がありません。
グラフに名前などの重複する値を格納できるようにしたいので、クラスインスタンスを使用するのは当然の選択のようですが、クラスインスタンス内でクラスインスタンスを検索する方法がわからないため、含まれている値にアクセスする方法に固執しています。マップすなわちgraph.getAdjacencyList().get(...)
。すべての助けに感謝
あなたの考えるaddVertex
方法を作成しVertex
、インスタンスとaddEdge
パラメータとしてメソッド期待していることは非常にインスタンスを、あなたは、これらのメソッドの呼び出し側が利用できるようにする必要があり-によってreturn
それをINGの。
…
addVertex(value) {
if (value) {
const vertex = new Vertex(value);
this.adjacencyList.set(vertex, []);
return vertex;
}
// else throw new Error("no value given")?
}
…
その後、あなたはそれを次のように使用することができます
const graph = new UndirectedGraph();
const vertex1 = graph.addVertex("A");
const vertex2 = graph.addVertex("B");
const vertex3 = graph.addVertex("B");
graph.addEdge(vertex1, vertex2);
graph.addEdge(vertex1, vertex3);
graph.addEdge(vertex2, vertex3);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加