データ構造図の基本概念

1. グラフの概念

グラフ: 有限の空ではない頂点のセットと頂点間のエッジのセットで構成されます。
頂点: グラフ内のデータ要素。
エッジ (エッジ): 頂点間の論理関係。エッジは有向または無向で、重みを持つこともできます (距離、コストなどを表すことができます) 無向エッジ: 頂点間のエッジに方向がない場合、このエッジをエッジと呼び
ます無向エッジ
と有向エッジ: 頂点 vi から νj までのエッジに方向がある場合、このエッジは有向エッジと呼ばれます (無向エッジは 2 つの有向エッジで表すことができます)

無向グラフ

グラフ内の任意の 2 つの頂点間のエッジは無向エッジです。これは、ノード 1 からノード 2、またはノード 2 からノード 1 へのエッジを意味します。
203f4472814137b3a06686ed16217bad.png

有向グラフ

グラフ内の任意の 2 つの頂点間のエッジは方向を持っています。グラフ内の方向は 1 つの方向を向いています。すべての有向グラフが 1 つの方向を向いているわけではありません。これは便宜上のものです。有向グラフは、次のパスを持つパスとして理解できます。方向、方向、矢印の方向のみ
a80c9ba9f1a09fbad0955fcb2085427b.png

2. 画像の保存

グラフの保存に一般的に使用される隣接行列と隣接
リストは、保存とクエリが簡単で便利です。欠点は、遭遇したグラフが疎グラフの場合、多くのスペースが無駄になることです。隣接リストは隣接行列よりも複雑です
。 . その利点は明らかではありません

隣接行列

配列 (i, j) は、i から j まで接続されているかどうかを示します。0 は接続されていないことを意味し、0 以外は接続されていることを意味します

無向グラフストレージ

有向エッジを 2 つの有向エッジに変換します。たとえば、頂点 1 と頂点 2 の無向エッジを、頂点 1 から頂点 2 および頂点 2 から頂点 1 への 2 つの有向エッジに変換します。08b830c3a1176dfae173d4012a2450a2.png

有向グラフストレージ

50273bd040989184dd29d91876d1c6d3.png
有向グラフ二次元配列.png

隣接リスト

551bfc02c48a233613c5a61922c83235.png
有向グラフ隣接リスト.png
//顶点 
 class POS{
        public POS(int head) {
            this.head = head;

        }
        public  int head;//这个值指向的是边
    }
//边
 class Edge{
        public int v;
        public  int next;
    }

//图的初始化
top =0;//用来记录边的位置
posList =new ArrayList<>();//顶点
edgeList =new ArrayList<>();//边的列表
for(int i = 0;i<=posSize;i++){
     posList.add(new POS(-1));//初始化
     hadVisted[i] =false;//初始化

 }
//添加边邻接表,添加一条从u到v的边
 public void Add_Edge(int u, int v) {
      //  1 -> 4->3->2
        Edge edge =new Edge();
        edge.v =v;
        edge.next =posList.get(u).head;
        posList.get(u).head =top;
        edgeList.add(edge);
        top++;
    }

3. 画像検索

深い検索

ディープ検索は再帰 1、頂点 1 からトラバース、頂点 2 までトラバース、次に頂点 2 から 2 をトラバース、頂点 2 から頂点a3c6378273932d92fab51789d0159ee2.png5 までトラバース、頂点 5 から頂点 8 までトラバースします。

d687a0423c6a59e1e6fdc4d3e996d70d.png3. 頂点 8 へのパスはありません。頂点 5 にバックトラックし、次に頂点 2 にバックトラックし、頂点 6 を横断し、頂点 6 から頂点 7 に横断します。 4、頂点 8 を横断し、6 にバックトラックし、次に 2 にバックトラックし、f9278d164b2481689dfa80fc4fb7c5b3.pngその後1 f756f4b7d850fa9d34e2bdea17fb3255.png5 にバックトラックし、頂点 3、4 をトラバースしますa15e74c9ebecde8587622e9823480699.png

//深搜
 public void dfsVist(int u){
        for(int i = posList.get(u).head;i!=-1;i=edgeList.get(i).next){
            Edge edge = edgeList.get(i);
            if(!hadVisted[edge.v]){
    System.out.println("访问节点:"+edge.v);
                hadVisted[edge.v] =true;
                vist(edge.v);
            }
        }

    }

広範囲の検索

Guangsou には、1 に接続されている 2、3、4 を 1 からのキューに追加するのに役立つキューが必要です9d43f06f3059ef532b81ec7787751b9c.png。同時に、1 がデキューされてキューd5900009aacf7e64dc421e2dd6795db5.pngの先頭から頂点 2 が取り出され、頂点 2 に接続されている 5 と 6 がキューに追加されます。 2 がキューに追加され、2 がデキューされて 3 が取り出され75f74f491dae23b1b85cc62ef131aedd.png、3 に接続されているすべてが訪問され、4、3、4 が取り出され、7 がキューに入力されて 5 が取り出され、58e6b576af86764b895860869e7561af.png5 に接続されている 8 が取り出されます。キューに追加され、5 がデキューされ、6451e8628e516af1c1cebaaf390d5b1f.png6、7、8 が取り出されます。それらはすべて訪問されているためです。リストが空になると、トラバーサルは終了します。

public void bfsVist(int u){
        Queue queue = new LinkedList();
        queue.add(u);//加入队列
        System.out.println("访问节点="+u);
        while (!queue.isEmpty()){//直至列表为空
            Integer p = (Integer) queue.poll();//取出列表里元素
            for(int i = posList.get(p).head;i!=-1;i=edgeList.get(i).next){
                Edge edge = edgeList.get(i);
                if(!hadVisted[edge.v]){
                    hadVisted[edge.v] =true;
                    System.out.println("访问节点="+edge.v);
                    queue.add((Integer)edge.v);

                }
            }

        }


    }

- 終わり -

Qi Wu 劇団について

Qi Wu Troupe は 360 グループ最大のフロントエンド チームであり、グループを代表して W3C および ECMA メンバー (TC39) の活動に参加しています。Qi Wu Troupe は人材育成を非常に重視しており、エンジニア、講師、翻訳者、ビジネス インターフェース担当者、チーム リーダーなど従業員が選択できるさまざまな育成方向性があり、対応する技術研修、専門研修、一般研修、およびリーダーシップ研修を提供することで補完されています。 . もちろん。Qi Dance Troupe は、あらゆる種類の優れた才能に注目し、オープンで才能を求める姿勢で Qi Dance Troupe に参加することを歓迎します。

5f2aa06f84db051e174290ce3bc84545.png

おすすめ

転載: blog.csdn.net/qiwoo_weekly/article/details/130939351