データ構造図10|JS

14184 ワード


画像ソース

グラフィック|グラフィック

  • 頂点(頂点)とedge(幹線)からなる.
  • edge接続頂点と頂点
  • りんせつひょう



    画像ソース
  • パターン内に少量の幹線しかない場合は、
  • が使いやすい.
  • は、各頂点の隣接する頂点
  • をリストする.
  • は、アレイや接続リスト等により
  • を実現することができる.
  • 接続された幹線情報のみが格納され、O(E)空間が必要となり、空間効率が高い
  • O(v)の時間的複雑さ
  • は、各頂点間の接続を決定するために使用される.

    隣接行列



    画像ソース
  • 二次元アレイ
  • を採用
  • パターンに密集する複数の幹線パターンは
  • が使いやすい.
  • 線の数は常にn^2個のメモリ領域
  • を必要とする
  • 特定のノードの隣接ノード
  • にナビゲートするには、すべてのノードをチェックする必要があります.
  • 頂点間の接続にO(1)時間が必要かどうかを確認する
  • .

    グラフィックタイプ

  • 無方向図:幹線無方向図
  • 方向図:幹線有向図(=ダイナミック図)
  • 重み付けパターン:幹線重み付けパターン(=ネットワーク)
  • グラフィックとツリー



    画像ソース

    無方向図実装

    class UndirectedGraph {
      constructor() {
        this.edges = {};
      }
      // 정점 추가하기
      addVertex(vertex) {
        this.edges[vertex] = {};
      }
    
      // 간선 추가하기
      addEdge(vertex1, vertex2, weight = 0) {
        this.edges[vertex1][vertex2] = weight;
        this.edges[vertex2][vertex1] = weight;
      }
    
      // 간선 삭제하기
      removeEdge(vertex1, vertex2) {
        if (this.edges[vertex1] && this.edges[vertex1][vertex2] !== undefined) {
          delete this.edges[vertex1][vertex2];
        }
        if (this.edges[vertex2] && this.edges[vertex2][vertex1] !== undefined) {
          delete this.edges[vertex2][vertex1];
        }
      }
    
      // 정점 삭제하기 (반대편 정점에서도 간선을 삭제해야함)
      removeVertex(vertex) {
        for (let adjacentVertex in this.edges[vertex]) {
          this.removeEdge(adjacentVertex, vertex);
        }
        delete this.edges[vertex];
      }
    }

    方向図

    class DirectedGraph {
      constructor() {
        this.edges = {};
      }
      // 정점 추가
      addVertex(vertex) {
        this.edges[vertex] = {};
      }
      // 간선 추가
      addEdge(from, to, weight = 0) {
        // 시작 정점, 도착 정점, 가중치
        this.edges[from][to] = weight;
      }
      // 간선 삭제
      removeEdge(vertex1, vertex2) {
        if (this.edges[vertex1] && this.edges[vertex1][vertex2] !== undefined) {
          delete this.edges[vertex1][vertex2];
        }
      }
      // 정점 삭제하기 (반대편 정점에서도 간선을 삭제해야함)
      removeVertex(vertex) {
        for (let adjacentVertex in this.edges[vertex]) {
          this.removeEdge(adjacentVertex, vertex);
        }
        delete this.edges[vertex];
      }

    📚 リファレンス


    Github | tech-interview-for-developer
    Github | Interview_Question_for_Beginner
    Github | javascript-algorithms | trekhleb
    「データ構造」グラフィック(JavaScript)
    Photo by Alain Pham on Unsplash