[DS] Graph
12040 ワード
私以外にこの文章を読む人がいるかどうか分かりません...ほほほ...修正が必要な箇所があればコメントでお知らせください🙇🏻♀️
Graph
から始まり、近い頂点をすべて探索し、次の頂点を探索する方法です. の2つの頂点間の最短パスを探します. 図で参照する場合は、無限ループに陥らないように、参照されたノードを表示します. を順次格納した後、再帰を使用せずに、格納から取り出せる構造キューを先に使用する.
深度優先ナビゲーション方法DFS(深度優先検索)
1-2-5-9-10-6-3-4-7-11-8-12の順にナビゲート自己呼び出しループアルゴリズムの形式で、ルートノードから1つの方向に歩き続け、道がなくなった場合、最寄りの分岐点に戻り、その後、1つの方向に探索する方法. BFSより少し簡単ですが、簡単な検索ではBFSより遅いです. 図で参照する場合は、無限ループに陥らないように、参照されたノードを表示します. のすべてのノードにアクセスできます.
image - wiki
BFS & DFS
Graph
グラフといえば、まずExcelでよく使われる表、x軸、y軸が存在する割合反比例図などが考えられます.しかし、資料構造図によると、下図のように複数の点が線で複雑に接続されている.
1と5、あるいは1と2のように1と直接つながっている点も、1と4のように5を通ってつながっている点もあります.ここで、数値点は頂点(頂点)となり、直線は辺(幹線)となる.
グラフィック用語
undirected graph & directed graph
undirected? 方向がないの?こんなふうに混同したつもりで双方向かどうか(?)そう思うのは分かりやすいためです.付加的なイメージでは,2と3が互いにつながっている.これを無方向図と呼ぶ.しかし、1と2から見ると、1から2には幹線がありますが、2から1までの幹線はありません.このように、双方向の幹線がなく、一方向のみのものを有向図(単方向図)と呼ぶ.一方向図は完全に単行です.
self loop & cycle
self loopとは、頂点から入った幹線が直接自分に入る場合のこと.他の頂点を通らず、直接自分の身に戻る場合.上記の画像では、1はself loopを有する.
cycleは、一つの頂点から再び戻ることができれば、cycleがあると言います.
in-degree & out-degree
1つの頂点に入る、入る回数(入る回数)、退出回数(入る回数)の幹線が何本あるかを表します.
グラフィック表現
✅Adjanity(隣接):2つの頂点の間に直接の幹線がある場合、この2つの頂点は隣接する頂点です.
Adjancency matrix
隣接行列
隣接する頂点間の隣接(幹線)を表す行列は、2次元配列の様子です.つながっていれば1、つながっていなければ0で表します.上のパターンは隣接行列で表され、以下のようになります.頂点はadjMatrix[i]になり、各配列要素内で0と1で表される要素が幹線になります.
表の形式に似ていて、隣接していない情報もすべて確認できるので、便利そうに見えますが、不要な情報を読む必要があるという欠点があるかもしれません.let adjMatrix = [
To
0 1 2
From 0 [0, 1, 0]
1 [0, 0, 1]
2 [1, 1, 0]
]
隣接マトリクス-JSコード実装
function createMatrix(edges) {
// 1) 가장 큰 수를 갖는 정점 찾기
let max = edges.flat().filter((el) => typeof el === 'number');
max = Math.max(...max);
// 2) 0 ~ 1)에서 찾은 정점까지의 크기를 갖는 매트릭스 만들기
let matrix = Array(max + 1).fill(0).map((row) => Array(max + 1).fill(0));
// 3) 정점을 만들었으니, 연결되는 간선을 만들어줌
for(let i = 0; i < edges.length; i++) {
let [row, col, direction] = edges[i];
if(direction === 'directed') {
matrix[row][col] = 1;
}
else if(direction === 'undirected') {
matrix[row][col] = 1;
matrix[col][row] = 1;
}
}
return matrix;
}
let output1 = createMatrix([
[0, 3, "directed"],
[0, 2, "directed"],
[1, 3, "directed"],
[2, 1, "directed"],
]);
console.log(output1);
/**
* [
* [0, 0, 1, 1],
* [0, 0, 0, 1],
* [0, 1, 0, 0],
* [0, 0, 0, 0]
* ]
*/
Adjacency list
りんせつひょう
各頂点がどの頂点に隣接しているかをリスト形式で表し、リスト内の隣接する他の頂点を値とします.let adjList = {0: [1], 1 : [2], 2 : [0, 1]};
隣接マトリクスは、すべての場合の数を格納するため、多くのメモリを消費します.メモリを効率的に使用するには、隣接するリストを使用します.
グラフィックの参照
BFS
幅優先ナビゲーション方法
1-2-3-4-5-6-7-8-9-10-11-12の順にナビゲート
これは
let adjMatrix = [
To
0 1 2
From 0 [0, 1, 0]
1 [0, 0, 1]
2 [1, 1, 0]
]
function createMatrix(edges) {
// 1) 가장 큰 수를 갖는 정점 찾기
let max = edges.flat().filter((el) => typeof el === 'number');
max = Math.max(...max);
// 2) 0 ~ 1)에서 찾은 정점까지의 크기를 갖는 매트릭스 만들기
let matrix = Array(max + 1).fill(0).map((row) => Array(max + 1).fill(0));
// 3) 정점을 만들었으니, 연결되는 간선을 만들어줌
for(let i = 0; i < edges.length; i++) {
let [row, col, direction] = edges[i];
if(direction === 'directed') {
matrix[row][col] = 1;
}
else if(direction === 'undirected') {
matrix[row][col] = 1;
matrix[col][row] = 1;
}
}
return matrix;
}
let output1 = createMatrix([
[0, 3, "directed"],
[0, 2, "directed"],
[1, 3, "directed"],
[2, 1, "directed"],
]);
console.log(output1);
/**
* [
* [0, 0, 1, 1],
* [0, 0, 0, 1],
* [0, 1, 0, 0],
* [0, 0, 0, 0]
* ]
*/
let adjList = {0: [1], 1 : [2], 2 : [0, 1]};
DFS
深度優先ナビゲーション方法DFS(深度優先検索)
1-2-5-9-10-6-3-4-7-11-8-12の順にナビゲート
Reference
image - wiki
BFS & DFS
Reference
この問題について([DS] Graph), 我々は、より多くの情報をここで見つけました https://velog.io/@soor/DS-Graphテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol