国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ ウェブフロントエンド jsチュートリアル ダイクストラアルゴリズムを理解する: 理論から実裝まで

ダイクストラアルゴリズムを理解する: 理論から実裝まで

Dec 14, 2024 am 03:18 AM

Understanding Dijkstra

ダイクストラのアルゴリズムは、グラフ理論でソース ノードからグラフ內(nèi)の他のすべてのノードへの最短パスを見つけるために使用される古典的な経路探索アルゴリズムです。この記事では、アルゴリズムとその正しさの証明を検討し、JavaScript での実裝を提供します。

ダイクストラのアルゴリズムとは何ですか?

ダイクストラのアルゴリズムは、非負(fù)のエッジ重みを持つ重み付きグラフ內(nèi)の単一のソース ノードからの最短パスを見つけるように設(shè)計(jì)された貪欲なアルゴリズムです。これは 1956 年に Edsger W. Dijkstra によって提案され、現(xiàn)在でもコンピューター サイエンスで最も広く使用されているアルゴリズムの 1 つです。

入出力

  • 入力: グラフ G=(V、E)G = (V, E) G=(V,E) 、 どこ VV V は頂點(diǎn)の集合であり、 EE E はエッジのセットとソースノードです sVs in V s∈V .
  • 出力: からの最短パス距離 ss s の他のすべてのノードに VV V .

中心となる概念

  1. 緩和: ノードまでの既知の最短距離を更新するプロセス。
  2. Priority Queue: 暫定距離が最小のノードを効率的にフェッチします。
  3. 貪欲なアプローチ: 距離が短い順にノードを処理します。

アルゴリズム

  1. 距離の初期化:

    dist(s )=0,dist(v)= ?vs テキスト{dist}(s) = 0、テキスト{dist}(v) = infty ;クワッドフォーオールvneq s dist(s)=0,dist(v)=∞?v=s
  2. 優(yōu)先キューを使用して、距離に基づいてノードを保存します。

  3. 距離が最小のノードを繰り返し抽出し、その近傍を緩和します。

リラクゼーション - 數(shù)學(xué)的説明

  • 初期化: dist(s)=0,dist(v )= すべて vstext{dist}(s) = 0、text{dist}(v) = infty、text{for all}、v neq s dist(s)=0,dist(v)=のためにllv=s

どこ (s)( s ) (s) はソースノードであり、 (v)( v ) (v) 他のノードを表します。

  • リラックスステップ: 各エッジごと (u,v) (う、う) (u,v) 重さで w(u,v )w(u, v) w(u,v) : もし dist(v)>dist(u) w(u,v)text{距離}(v) > text{dist}(u) w(u, v) dist(v)>dist (う) w(u,v) 、 アップデート:
    dist(v) =dist(u) w(u,v),prev(v)=utext{dist}(v ) = text{dist}(u) w(u, v)、quad text{prev}(v) = u dist(v)=dist(u) w(u,v),(v)=u

機(jī)能する理由: 緩和により、より短いパスが見つかった場(chǎng)合に距離を段階的に更新することで、ノードへの最短パスが常に見つかるようになります。


優(yōu)先キュー - 數(shù)學(xué)的説明

  • キュー操作:

    • 優(yōu)先キューは常にノードをデキューします (u)( u ) (u) 最小の暫定距離:
      u=a rg?? vQdist(v)u = arg min_{v in Q} text{dist}(v) u=arg v∈Q 距離(v)
    • なぜ機(jī)能するのか: 最小のノードを処理することによって (dist(v) )( text{dist}(v) ) (dist(v)) 、ソースからへの最短パスを保証します。 (u)( u ) (u) .

正しさの証明

強(qiáng)帰納法を使用してダイクストラのアルゴリズムの正しさを証明します。

強(qiáng)力な誘導(dǎo)とは何ですか?

強(qiáng)い帰納法は數(shù)學(xué)的帰納法の変形であり、ステートメントを証明するために、 (P(n) )( P(n) ) (P(n)) 、私たちは次の真実を仮定します (P( 1),P(2)、P(k))( P(1), P(2), ドット, P(k) ) (P(1),P(2),…,P(k)) 証明する (P(k 1))( P(k 1) ) ( P(k 1)) 。これは、次のことだけを前提とする通常の誘導(dǎo)とは異なります。 (P(k) )( P(k) ) (P(k)) 証明する (P(k 1))( P(k 1) ) ( P(k 1)) 。私の他の投稿で詳しく調(diào)べてください。

ダイクストラのアルゴリズムの正しさ (帰納的証明)

  1. 基本ケース:

    ソースノード (s)( s ) (s) で初期化されます dist(s)=0テキスト{距離}(s) = 0 距離(s)=0 正解です。

  2. 帰納仮説:

    これまでに処理されたすべてのノードには正しい最短パス距離があると仮定します。

  3. 帰納的ステップ:

    次のノード (u)( u ) (u) 優(yōu)先キューからデキューされます。以來 dist(u)text{dist} (う) 距離(u) は殘りの最小距離であり、以前のノードはすべて正しい距離を持っています。 dist(u)text{dist} (う) 距離(u)

  4. も正しいです。

JavaScriptの実裝

前提條件 (優(yōu)先キュー):

// Simplified Queue using Sorting
// Use Binary Heap (good)
// or  Binomial Heap (better) or Pairing Heap (best) 
class PriorityQueue {
  constructor() {
    this.queue = [];
  }

  enqueue(node, priority) {
    this.queue.push({ node, priority });
    this.queue.sort((a, b) => a.priority - b.priority);
  }

  dequeue() {
    return this.queue.shift();
  }

  isEmpty() {
    return this.queue.length === 0;
  }
}

これは、優(yōu)先キューを使用したダイクストラのアルゴリズムの JavaScript 実裝です。

function dijkstra(graph, start) {
  const distances = {}; // hold the shortest distance from the start node to all other nodes
  const previous = {}; // Stores the previous node for each node in the shortest path (used to reconstruct the path later).
  const pq = new PriorityQueue(); // Used to efficiently retrieve the node with the smallest tentative distance.

  // Initialize distances and previous
  for (let node in graph) {
    distances[node] = Infinity; // Start with infinite distances
    previous[node] = null; // No previous nodes at the start
  }
  distances[start] = 0; // Distance to the start node is 0

  pq.enqueue(start, 0);

  while (!pq.isEmpty()) {
    const { node } = pq.dequeue(); // Get the node with the smallest tentative distance

    for (let neighbor in graph[node]) {
      const distance = graph[node][neighbor]; // The edge weight
      const newDist = distances[node] + distance;

      // Relaxation Step
      if (newDist < distances[neighbor]) {
        distances[neighbor] = newDist; // Update the shortest distance to the neighbor
        previous[neighbor] = node; // Update the previous node
        pq.enqueue(neighbor, newDist); // Enqueue the neighbor with the updated distance
      }
    }
  }

  return { distances, previous };
}

// Example usage
const graph = {
  A: { B: 1, C: 4 },
  B: { A: 1, C: 2, D: 5 },
  C: { A: 4, B: 2, D: 1 },
  D: { B: 5, C: 1 }
};

const result = dijkstra(graph, 'A'); // start node 'A'
console.log(result);

パスを再構(gòu)築

// Simplified Queue using Sorting
// Use Binary Heap (good)
// or  Binomial Heap (better) or Pairing Heap (best) 
class PriorityQueue {
  constructor() {
    this.queue = [];
  }

  enqueue(node, priority) {
    this.queue.push({ node, priority });
    this.queue.sort((a, b) => a.priority - b.priority);
  }

  dequeue() {
    return this.queue.shift();
  }

  isEmpty() {
    return this.queue.length === 0;
  }
}

チュートリアルの例

グラフ表現(xiàn)

  • ノード: AB、C、DA、 B、C、D A、B、C、D
  • エッジ:
    • AB=( 1)AC=(4)A ~B = (1)、A ~ C = (4) A→B=(1),A→C=(4)
    • BC=( 2)BD=(5)B C ~ C = (2)、B ~ D = (5) B→C=(2),B→D=(5)
    • CD=(1)C to D = (1) C→D=(1)

ステップバイステップの実行

  1. 距離の初期化:

    dist(A)= 0 , dist(B)= dist(C)= dist(D)= テキスト{距離}(A) = 0, ; text{dist}(B) = infty, ; text{dist}(C) = infty, ;テキスト{距離}(D) = 無限 dist(A)=0,dist(B)= ∞、距離(C)=∞、距離(D)=
  2. プロセス A:

    • エッジをリラックス: ABAC.A A→B,A→C.
      距離(B)=1, dist(C)=4テキスト{距離}(B) = 1, ;テキスト{距離}(C) = 4 dist(B)=1,dist(C)=4
  3. プロセス B:

    • エッジをリラックス: BC、BD.B B→C,B→D.
      距離(C)=3, dist(D)=6テキスト{距離}(C) = 3, ;テキスト{距離}(D) = 6 dist(C)=3,dist(D)=6
  4. プロセス C:

    • リラックスエッジ: CD.C から D。 C→D.
      dist(D)=4テキスト{距離}(D) = 4 dist(D)=4
    • プロセス D:

      • 今後の更新はありません。
    • 最終的な距離とパス

      dist(A)= 0 , dist(B)=1、 dist(C)= 3、 dist(D)=4 テキスト{距離}(A) = 0, ;テキスト{距離}(B) = 1, ;テキスト{距離}(C) = 3, ;テキスト{距離}(D) = 4 dist(A)=0,dist(B)= 1、距離(C)=3、距離(D)=4

      AB CD AからB、C、Dへ A→B→C→D

      最適化と時(shí)間計(jì)算量

      ダイクストラのアルゴリズムの時(shí)間計(jì)算量をさまざまな優(yōu)先キュー実裝と比較:

      Priority Queue Type Insert (M) Extract Min Decrease Key Overall Time Complexity
      Simple Array O(1) O(V) O(V) O(V^2)
      Binary Heap O(log V) O(log V) O(log V) O((V E) log V)
      Binomial Heap O(log V) O(log V) O(log V) O((V E) log V)
      Fibonacci Heap O(1) O(log V) O(1) O(V log V E)
      Pairing Heap O(1) O(log V) O(log V) O(V log V E) (practical)

      重要なポイント:

      1. 単純な配列:
        • extract-min の線形検索のため、大きなグラフでは非効率的です。
      2. バイナリ ヒープ:
        • シンプルさと効率のバランスが取れているため、標(biāo)準(zhǔn)であり、一般的に使用されています。
      3. 二項(xiàng)ヒープ:
        • 理論上の保証はわずかに優(yōu)れていますが、実裝はより複雑です。
      4. フィボナッチ ヒープ:
        • ( O(1) ) 償卻減少キーを使用すると最高の理論的パフォーマンスが得られますが、実裝は困難です。
      5. ヒープのペアリング:
        • シンプルで、実際にはフィボナッチ ヒープに近いパフォーマンスを発揮します。

      結(jié)論

      ダイクストラのアルゴリズムは、非負(fù)の重みを持つグラフ內(nèi)の最短経路を見つけるための強(qiáng)力かつ効率的な方法です。制限はありますが (負(fù)のエッジの重みを処理できないなど)、ネットワーキング、ルーティング、その他のアプリケーションで広く使用されています。

      • リラクゼーションは、パスを繰り返し更新することで最短距離を保証します。
      • Priority Queue は、常に最も近いノードを処理し、正確さを維持することを保証します。
      • 正確さは帰納法によって証明されます。ノードの距離が確定すると、それが最短パスであることが保証されます。

      ここでは、厳密な証明と例とともにダイクストラのアルゴリズムを探索できる詳細(xì)なリソースをいくつか紹介します。

      • ダイクストラのアルゴリズム PDF
      • SlideShare の最短パス アルゴリズム

      さらに、ウィキペディアではこのトピックの優(yōu)れた概要が提供されています。

      引用:
      [1] https://www.fuhuthu.com/CPSC420F2019/dijkstra.pdf

      ご意見や改善點(diǎn)をコメントでお?dú)葺Xに共有してください!

以上がダイクストラアルゴリズムを理解する: 理論から実裝までの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中國(guó)語版

SublimeText3 中國(guó)語版

中國(guó)語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Java vs. JavaScript:混亂を解消します Java vs. JavaScript:混亂を解消します Jun 20, 2025 am 12:27 AM

JavaとJavaScriptは異なるプログラミング言語であり、それぞれ異なるアプリケーションシナリオに適しています。 Javaは大規(guī)模なエンタープライズおよびモバイルアプリケーション開発に使用されますが、JavaScriptは主にWebページ開発に使用されます。

JSで日付と時(shí)間を操作する方法は? JSで日付と時(shí)間を操作する方法は? Jul 01, 2025 am 01:27 AM

JavaScriptで日付と時(shí)間を処理する場(chǎng)合は、次の點(diǎn)に注意する必要があります。1。日付オブジェクトを作成するには多くの方法があります。 ISO形式の文字列を使用して、互換性を確保することをお?jiǎng)幛幛筏蓼埂?2。時(shí)間情報(bào)を取得および設(shè)定して、メソッドを設(shè)定でき、月は0から始まることに注意してください。 3.手動(dòng)でのフォーマット日付には文字列が必要であり、サードパーティライブラリも使用できます。 4.ルクソンなどのタイムゾーンをサポートするライブラリを使用することをお?jiǎng)幛幛筏蓼?。これらの重要なポイントを?xí)得すると、一般的な間違いを効果的に回避できます。

なぜの下部にタグを配置する必要があるのですか? なぜの下部にタグを配置する必要があるのですか? Jul 02, 2025 am 01:22 AM

PLACSTHETTHETTHE BOTTOMOFABLOGPOSTORWEBPAGESERVESPAGESPORCICALPURPOSESESFORSEO、userexperience、andDesign.1.IthelpswithiobyAllowingseNStoAccessKeysword-relevanttagwithtagwithtagwithtagwithemaincontent.2.iTimrovesexperiencebyepingepintepepinedeeping

JavaScript vs. Java:開発者向けの包括的な比較 JavaScript vs. Java:開発者向けの包括的な比較 Jun 20, 2025 am 12:21 AM

javascriptispreferredforwebdevelopment、whilejavaisbetterforlge-scalebackendsystemsandroidapps.1)javascriptexcelsininintingtivewebexperiences withitsdynAmicnature anddommanipulation.2)javaofferstruntypyping-dobject-reientedpeatures

DOMでのイベントの泡立ちとキャプチャとは何ですか? DOMでのイベントの泡立ちとキャプチャとは何ですか? Jul 02, 2025 am 01:19 AM

イベントキャプチャとバブルは、DOMのイベント伝播の2つの段階です。キャプチャは最上層からターゲット要素までであり、バブルはターゲット要素から上層までです。 1.イベントキャプチャは、AddEventListenerのUseCaptureパラメーターをTrueに設(shè)定することにより実裝されます。 2。イベントバブルはデフォルトの動(dòng)作であり、UseCaptureはfalseに設(shè)定されているか、省略されます。 3。イベントの伝播を使用して、イベントの伝播を防ぐことができます。 4.イベントバブルは、動(dòng)的なコンテンツ処理効率を改善するためにイベント委任をサポートします。 5.キャプチャを使用して、ロギングやエラー処理など、事前にイベントを傍受できます。これらの2つのフェーズを理解することは、タイミングとJavaScriptがユーザー操作にどのように反応するかを正確に制御するのに役立ちます。

JavaScript:効率的なコーディングのためのデータ型の調(diào)査 JavaScript:効率的なコーディングのためのデータ型の調(diào)査 Jun 20, 2025 am 12:46 AM

javascripthassevenfundamentaldatypes:number、string、boolean、undefined、null、object、andsymbol.1)numberseadouble-precisionformat、有用であるため、有用性の高いものであるため、but-for-loating-pointarithmetic.2)ストリングリムムット、使用率が有用であること

JavaScriptアプリケーションのペイロードサイズをどのように削減できますか? JavaScriptアプリケーションのペイロードサイズをどのように削減できますか? Jun 26, 2025 am 12:54 AM

JavaScriptアプリケーションがゆっくりとロードされ、パフォーマンスが低い場(chǎng)合、問題はペイロードが大きすぎることです。ソリューションには、次のものが含まれます。1。コード分割(コードスプリッティング)を使用し、React.lazy()またはビルドツールを介して大きなバンドルを複數(shù)の小さなファイルに分割し、最初のダウンロードを減らすために必要に応じてロードします。 2。未使用のコード(Treeshaking)を削除し、ES6モジュールメカニズムを使用して「デッドコード」をクリアして、導(dǎo)入されたライブラリがこの機(jī)能をサポートしていることを確認(rèn)します。 3.リソースファイルを圧縮してマージし、GZIP/BrotliとTerserがJSを圧縮できるようにし、ファイルを合理的にマージし、靜的リソースを最適化します。 4.頑丈な依存関係を交換し、day.jsやフェッチなどの軽量ライブラリを選択します

JavaScriptモジュールの決定的なJSラウンドアップ:ESモジュールvs CommonJS JavaScriptモジュールの決定的なJSラウンドアップ:ESモジュールvs CommonJS Jul 02, 2025 am 01:28 AM

ESモジュールとCommonJSの主な違いは、ロード方法と使用シナリオです。 1.CommonJSは同期的にロードされ、node.jsサーバー側(cè)環(huán)境に適しています。 2.ESモジュールは、ブラウザなどのネットワーク環(huán)境に適した非同期にロードされています。 3。Syntax、ESモジュールはインポート/エクスポートを使用し、トップレベルのスコープに配置する必要がありますが、CommonJSは実行時(shí)に動(dòng)的に呼ばれるrequire/Module.Exportsを使用します。 4.CommonJSは、Expressなどのnode.jsおよびLibrariesの古いバージョンで広く使用されていますが、ESモジュールは最新のフロントエンドフレームワークとnode.jsv14に適しています。 5.混合することはできますが、簡(jiǎn)単に問題を引き起こす可能性があります。

See all articles