ホームページ ウェブフロントエンド jsチュートリアル JavaScriptのデータ構造とアルゴリズム グラフとグラフアルゴリズム_基礎知識

JavaScriptのデータ構造とアルゴリズム グラフとグラフアルゴリズム_基礎知識

May 16, 2016 pm 04:14 PM
javascript グラフアルゴリズム データ構造 アルゴリズム

グラフの定義

グラフは、有限の空ではない頂点のセットと頂点間のエッジのセットで構成されます。通常、G(V,E) のように表されます。ここで、G はグラフを表し、V はグラフ G の頂点です。セット、E はグラフ G のエッジのセットです。

有向グラフ

有向エッジ: 頂点 Vi から Vj へのエッジに方向がある場合、このエッジは有向エッジと呼ばれ、弧 (Arc) とも呼ばれ、順序ペア で表され、Vi と呼ばれます。はアークテール、Vj はアークヘッドと呼ばれます。

順序なしグラフ

無向エッジ: 頂点 Vi と Vj の間のエッジに方向がない場合、このエッジは無向エッジ (Edge) と呼ばれ、順序のないペア (Vi, Vj) で表されます。

簡単な写真

単純グラフ: グラフ構造において、頂点から頂点までの辺がなく、同じ辺が繰り返し現れない場合、そのようなグラフを単純グラフと呼びます。

グラフィック

は頂点

を表します

グラフ クラス作成の最初のステップは、頂点とエッジを保存する Vertex クラスを作成することです。このクラスの機能は、連結リストや二分探索木の Node クラスと同じです。 Vertex クラスには 2 つのデータ メンバーがあります。1 つは頂点を識別するもの、もう 1 つは頂点が訪問されたかどうかを示すブール値です。それぞれ label と wasVisited という名前が付けられます。

コードをコピーします コードは次のとおりです:

関数頂点(ラベル){
This.label = label;
}

すべての頂点を配列に保存し、グラフ クラスでは配列内の位置によって頂点を参照できます

はエッジを表します

グラフの実際の情報は「エッジ」に格納されます。これは、「エッジ」がグラフの構造を記述するためです。バイナリ ツリーの親ノードは 2 つの子ノードのみを持つことができますが、グラフの構造はより柔軟であり、頂点には 1 つのエッジまたは複数のエッジを接続できます。

グラフのエッジを表現する方法を隣接リストまたは隣接リスト配列と呼びます。頂点の隣接する頂点のリストで構成される配列を保存します

構造図

次のように Graph クラスを定義します:

コードをコピー コードは次のとおりです:

関数グラフ(v){
This.vertices = v;//頂点の最高点
This.edges = 0;
This.adj = [];
for(var i =0;I This.adj[i] = [];
This.adj[i].push('');
}
This.addEdge = addEdge;
This.toString = toString;
}

このクラスは、グラフが表すエッジの数を記録し、長さとグラフ内の頂点の数を使用して頂点の数を記録します。
コードをコピー コードは次のとおりです:

関数 addEdge(){
This.adj[v].push(w);
This.adj[w].push(v);
This.edges ;
}

ここでは、for ループを使用して配列内の各要素にサブ配列を追加し、隣接するすべての頂点を格納し、すべての要素を空の文字列に初期化します。

グラフトラバーサル

深さ優先トラバーサル

DepthFirstSearch (深さ優先検索とも呼ばれ、DFS とも呼ばれます)。

たとえば、部屋の鍵を探す場合は、部屋の隅、ベッドサイドテーブル、ベッド、ベッドの下、ワードローブ、テレビキャビネットなどを 1 つずつ検索します。 、どれも見逃さないように、すべての引き出しと収納キャビネットを調べた後、次の部屋を探します。

深さ優先検索:

深さ優先検索では、未訪問の頂点を訪問し、訪問済みとしてマークし、最初の頂点の隣接リスト内の他の未訪問の頂点に再帰的にアクセスします

配列を Graph クラスに追加します:

コードをコピー コードは次のとおりです:

this.marked = [];//訪問した頂点を保存
for(var i=0;i This.marked[i] = false;// false に初期化されます
}

深さ優先検索関数:

コードをコピー コードは次のとおりです:

関数 dfs(v){
This.marked[v] = true;
//ここでは if ステートメントは必要ありません
If(this.adj[v] != 未定義){
print("訪問した頂点: " v );
for each(this.adj[v] の var w){
If(!this.marked[w]){
This.dfs(w);
}
}
}
}

幅優先検索

幅優先検索 (BFS) は、結果を見つけるためにグラフ内のすべてのノードを体系的に拡張して検査することを目的としたブラインド検索方法です。言い換えれば、結果が存在する可能性のある場所は考慮されず、結果が見つかるまでグラフ全体が徹底的に検索されます。

幅優先検索は、以下に示すように、最初の頂点から開始し、その頂点にできるだけ近い頂点を訪問しようとします。

その動作原理は次のとおりです:

1. まず、現在の頂点に隣接する未訪問の頂点を見つけて、それらを訪問済みの頂点リストとキューに追加します。
2. 次に、グラフから次の頂点 v を取得し、それを訪問頂点リストに追加します
3. 最後に、v に隣接するすべての未訪問の頂点をキューに追加します
以下は幅優先検索関数の定義です:

コードをコピー コードは次のとおりです:

関数 bfs(s){
var queue = [];
This.marked = true;
Queue.push(s);//キューの最後に追加
While(queue.length>0){
var v = queue.shift();//キューの先頭から削除
If(v == 未定義){
print("訪問した頂点: " v);
}
for each(this.adj[v] の var w){
If(!this.marked[w]){
This.edgeTo[w] = v;
This.marked[w] = true;
queue.push(w);
}
}
}
}

最短パス

幅優先検索を実行すると、ある頂点から接続された別の頂点への最短パスが自動的に見つかります

パスを決定する

最短パスを見つけるには、ある頂点から別の頂点までのパスを記録するために幅優先検索アルゴリズムを変更する必要があります。これを 1 つの頂点から次の頂点までのすべてのエッジを保存するために必要です。配列edgeTo

コードをコピー コードは次のとおりです:

this.edgeTo = [];//この行を Graph クラスに追加します

//bfs 関数
関数 bfs(s){
var queue = [];
This.marked = true;
Queue.push(s);//キューの最後に追加
While(queue.length>0){
var v = queue.shift();//キューの先頭から削除
If(v == 未定義){
print("訪問した頂点: " v);
}
for each(this.adj[v] の var w){
If(!this.marked[w]){
This.edgeTo[w] = v;
This.marked[w] = true;
queue.push(w);
}
}
}
}

トポロジカルソートアルゴリズム

トポロジカルソートは、有向エッジが前の頂点から後の頂点を指すように、有向グラフのすべての頂点をソートします。
トポロジカル ソート アルゴリズムは BFS と似ていますが、違いは、トポロジカル ソート アルゴリズムは、訪問した頂点をすぐに出力しないことです。代わりに、現在の頂点の隣接リスト内のすべての隣接頂点を参照します。リストがスタック内で使い果たされています。

トポロジカル ソート アルゴリズムは 2 つの関数に分割されます。最初の関数は topSort() で、ソート プロセスを設定し、補助関数 topSortHelper() を呼び出して、ソートされた頂点リストを表示します。

トポロジカル ソート アルゴリズムの主な作業は、再帰関数 topSortHelper() で完了します。この関数は、現在の頂点を訪問済みとしてマークし、現在の頂点隣接リスト内の各頂点に再帰的にアクセスして、これらの頂点を訪問済みとしてマークします。最後に、現在の頂点がスタックにプッシュされます。

コードをコピーします コードは次のとおりです:

//topSort() 関数
関数topSort(){
var stack = [];
訪問した変数 = [];
for(var i =0;i 訪問[i] = false;
}
for(var i = 0;i If(visited[i] == false){
This.topSortHelper(i,visited,stack);
}
}
for(var i = 0;i If(スタック[i] !=未定義 && スタック[i] != false){
print(this.vertexList[stack[i]]);
}
}
}

//topSortHelper() 関数
関数 topSortHelper(v,visited,stack){
訪問[v] = true;
for each(this.adj[v] の var w){
If(!visited[w]){
This.topSortHelper(visited[w],visited,stack);
}
}
stack.push(v);
}

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C++ での機械学習アルゴリズムの実装: 一般的な課題と解決策 C++ での機械学習アルゴリズムの実装: 一般的な課題と解決策 Jun 03, 2024 pm 01:25 PM

C++ の機械学習アルゴリズムが直面する一般的な課題には、メモリ管理、マルチスレッド、パフォーマンスの最適化、保守性などがあります。解決策には、スマート ポインター、最新のスレッド ライブラリ、SIMD 命令、サードパーティ ライブラリの使用、コーディング スタイル ガイドラインの遵守、自動化ツールの使用が含まれます。実践的な事例では、Eigen ライブラリを使用して線形回帰アルゴリズムを実装し、メモリを効果的に管理し、高性能の行列演算を使用する方法を示します。

C++sort 関数の基礎となる原則とアルゴリズムの選択を調べる C++sort 関数の基礎となる原則とアルゴリズムの選択を調べる Apr 02, 2024 pm 05:36 PM

C++sort 関数の最下層はマージ ソートを使用し、その複雑さは O(nlogn) で、クイック ソート、ヒープ ソート、安定したソートなど、さまざまなソート アルゴリズムの選択肢を提供します。

Java 関数比較を使用して複雑なデータ構造を比較する Java 関数比較を使用して複雑なデータ構造を比較する Apr 19, 2024 pm 10:24 PM

Java で複雑なデータ構造を使用する場合、Comparator を使用して柔軟な比較メカニズムを提供します。具体的な手順には、コンパレータ クラスの定義、比較ロジックを定義するための比較メソッドの書き換えが含まれます。コンパレータインスタンスを作成します。 Collections.sort メソッドを使用して、コレクションとコンパレータのインスタンスを渡します。

改良された検出アルゴリズム: 高解像度の光学式リモートセンシング画像でのターゲット検出用 改良された検出アルゴリズム: 高解像度の光学式リモートセンシング画像でのターゲット検出用 Jun 06, 2024 pm 12:33 PM

01 今後の概要 現時点では、検出効率と検出結果の適切なバランスを実現することが困難です。我々は、光学リモートセンシング画像におけるターゲット検出ネットワークの効果を向上させるために、多層特徴ピラミッド、マルチ検出ヘッド戦略、およびハイブリッドアテンションモジュールを使用して、高解像度光学リモートセンシング画像におけるターゲット検出のための強化されたYOLOv5アルゴリズムを開発しました。 SIMD データセットによると、新しいアルゴリズムの mAP は YOLOv5 より 2.2%、YOLOX より 8.48% 優れており、検出結果と速度のバランスがより優れています。 02 背景と動機 リモート センシング技術の急速な発展に伴い、航空機、自動車、建物など、地表上の多くの物体を記述するために高解像度の光学式リモート センシング画像が使用されています。リモートセンシング画像の判読における物体検出

Javaのデータ構造とアルゴリズム: 詳細な説明 Javaのデータ構造とアルゴリズム: 詳細な説明 May 08, 2024 pm 10:12 PM

データ構造とアルゴリズムは Java 開発の基礎です。この記事では、Java の主要なデータ構造 (配列、リンク リスト、ツリーなど) とアルゴリズム (並べ替え、検索、グラフ アルゴリズムなど) について詳しく説明します。これらの構造は、スコアを保存するための配列、買い物リストを管理するためのリンク リスト、再帰を実装するためのスタック、スレッドを同期するためのキュー、高速検索と認証のためのツリーとハッシュ テーブルの使用など、実際の例を通じて説明されています。これらの概念を理解すると、効率的で保守しやすい Java コードを作成できるようになります。

58 ポートレート プラットフォームの構築におけるアルゴリズムの適用 58 ポートレート プラットフォームの構築におけるアルゴリズムの適用 May 09, 2024 am 09:01 AM

1. 58 Portraits プラットフォーム構築の背景 まず、58 Portraits プラットフォーム構築の背景についてお話ししたいと思います。 1. 従来のプロファイリング プラットフォームの従来の考え方ではもはや十分ではありません。ユーザー プロファイリング プラットフォームを構築するには、複数のビジネス分野からのデータを統合して、ユーザーの行動や関心を理解するためのデータ マイニングも必要です。最後に、ユーザー プロファイル データを効率的に保存、クエリ、共有し、プロファイル サービスを提供するためのデータ プラットフォーム機能も必要です。自社構築のビジネス プロファイリング プラットフォームとミドルオフィス プロファイリング プラットフォームの主な違いは、自社構築のプロファイリング プラットフォームは単一のビジネス ラインにサービスを提供し、オンデマンドでカスタマイズできることです。ミッドオフィス プラットフォームは複数のビジネス ラインにサービスを提供し、複雑な機能を備えていることです。モデリングを提供し、より一般的な機能を提供します。 2.58 中間プラットフォームのポートレート構築の背景のユーザーのポートレート 58

PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 Jun 03, 2024 am 09:58 AM

AVL ツリーは、高速かつ効率的なデータ操作を保証するバランスのとれた二分探索ツリーです。バランスを達成するために、左回転と右回転の操作を実行し、バランスに反するサブツリーを調整します。 AVL ツリーは高さバランシングを利用して、ツリーの高さがノード数に対して常に小さくなるようにすることで、対数時間計算量 (O(logn)) の検索操作を実現し、大規模なデータ セットでもデータ構造の効率を維持します。

グローバルグラフ強化に基づくニュース推奨アルゴリズム グローバルグラフ強化に基づくニュース推奨アルゴリズム Apr 08, 2024 pm 09:16 PM

著者 | Wang Hao によるレビュー | Chonglou ニュース アプリは、人々が日常生活で情報ソースを入手する重要な方法です。 2010年頃、海外ニュースアプリの人気はZiteやFlipboardなどがあり、国内ニュースアプリの人気は主に4大ポータルでした。 Toutiaoに代表される新時代のニュースレコメンド商品の人気により、ニュースアプリは新時代を迎えました。テクノロジー企業に関しては、どの企業であっても、高度なニュース推奨アルゴリズム技術を習得していれば、基本的に技術レベルでの主導権と発言権を握ることになる。今日は、RecSys2023 Best Long Paper Nomination Award の論文、GoingBeyondLocal:GlobalGraph-EnhancedP を見てみましょう。

See all articles