Rumah> Java> javaTutorial> teks badan

Mewakili Graf

王林
Lepaskan: 2024-08-09 22:34:32
asal
588 orang telah melayarinya

グラフを表現するとは、その頂点と辺をプログラムに保存することです。グラフを格納するデータ構造は配列またはリストです。グラフを処理および操作するプログラムを作成するには、グラフのデータをコンピューターに保存または表現する必要があります。

頂点の表現

頂点は配列またはリストに保存できます。たとえば、次の配列を使用して、下図のグラフ内のすべての都市名を保存できます:

Representing Graphs

String[] 頂点 = {"シアトル"、"サンフランシスコ"、"ロサンゼルス"、"デンバー"、"カンザスシティ"、"シカゴ"、"ボストン"、"ニューヨーク"、"アトランタ"、"マイアミ" 、「ダラス」、「ヒューストン」};

頂点は、任意のタイプのオブジェクトにすることができます。たとえば、都市をその名前、人口、市長などの情報を含むオブジェクトとして考えることができます。したがって、次のように頂点を定義できます:

都市 city0 = 新しい都市("シアトル", 608660, "マイク・マッギン");
...
都市 city11 = 新しい都市("ヒューストン", 2099451, "アニス パーカー");
City[] 頂点 = {city0, city1, ... , city11};

パブリッククラスの都市{
プライベート文字列都市名;
プライベート int 人口;
プライベート文字列市長;

リーリー

n 個の頂点のグラフの場合、自然数 0、1、2、...、n - 1 を使用して頂点にラベルを付けることができます。したがって、下の図に示すように、vertices[0]「シアトル」を表し、vertices[1]「サンフランシスコ」を表し、以下同様になります。

Representing Graphs

頂点は名前またはインデックスのどちらか便利な方で参照できます。明らかに、プログラム内のインデックスを介して頂点にアクセスするのは簡単です。

エッジの表現: エッジ配列

エッジは 2 次元配列を使用して表現できます。たとえば、次の配列を使用して、図 28.1 のグラフ内のすべてのエッジを保存できます。

int[][] エッジ = {

{0, 1}、{0, 3}、{0, 5}、

{1, 0}、{1, 2}、{1, 3}、
{2, 1}、{2, 3}、{2, 4}、{2, 10}、
{3, 0}、{3, 1}、{3, 2}、{3, 4}、{3, 5}、
{4, 2}、{4, 3}、{4, 5}、{4, 7}、{4, 8}、{4, 10}、
{5, 0}、{5, 3}、{5, 4}、{5, 6}、{5, 7}、
{6, 5}、{6, 7}、
{7, 4}、{7, 5}、{7, 6}、{7, 8}、
{8, 4}、{8, 7}、{8, 9}、{8, 10}、{8, 11}、
{9、8}、{9、11}、
{10, 2}、{10, 4}、{10, 8}、{10, 11}、
{11, 8}、{11, 9}、{11, 10}
};

この表現は

エッジ配列

として知られています。下図 (a) の頂点と辺は次のように表すことができます:String[] names = {"ピーター"、"ジェーン"、"マーク"、"シンディ"、"ウェンディ"};

int[][] エッジ = {{0, 2}, {1, 2}, {2, 4}, {3, 4}};


Representing Graphsエッジの表現: エッジ オブジェクト

エッジを表現する別の方法は、エッジをオブジェクトとして定義し、エッジを

java.util.ArrayList

に保存することです。Edgeクラスは次のように定義できます:パブリッククラスエッジ{

よろしくね;

int v;
public Edge(int u, int v) {
this.u = u;
this.v = v;
}
public booleanquals(Object o) {
return u == ((エッジ)o).u && v == ((エッジ)o).v;
}
}

たとえば、次のリストを使用して、下図のグラフ内のすべてのエッジを保存できます:

java.util.ArrayList list = 新しい java.util.ArrayList<>();

list.add(新しいエッジ(0, 1));

list.add(new Edge(0, 3));
list.add(new Edge(0, 5));
...

Representing GraphsEdge

オブジェクトを

ArrayListに保存すると、エッジが事前にわからない場合に便利です。前のセクション (エッジの表現: エッジ配列

) とこのセクションの前半でエッジ配列または

Edgeオブジェクトを使用してエッジを表現することは、入力としては直感的かもしれませんが、内部処理としては効率的ではありません。次の 2 つのセクションでは、隣接行列隣接リストを使用したグラフの表現を紹介します。これら 2 つのデータ構造は、グラフの処理に効率的です。

Mewakili Tepi: Matriks Bersebelahan

Anggap bahawa graf mempunyainbucu. Anda boleh menggunakan matriks n * n dua dimensi, katakanadjacencyMatrix, untuk mewakili tepi. Setiap elemen dalam tatasusunan ialah0atau1.adjacencyMatrix[i][j]ialah1jika terdapat tepi dari bucuike bucuj; jika tidak,adjacencyMatrix[i][j]ialah0. Jika graf tidak berarah, matriks adalah simetri, keranaAdjacencyMatrix[i][j]adalah sama denganadjacencyMatrix[j][i]. Contohnya, tepi dalam graf dalam Rajah di bawah boleh diwakili menggunakanmatriks bersebelahanseperti berikut:

int[][] adjacencyMatrix = {
{0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0}, // Seattle
{1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, // San Francisco
{0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, // Los Angeles
{1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0}, // Denver
{0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0}, // Kansas City
{1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0}, // Chicago
{0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0}, // Boston
{0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0}, // New York
{0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1}, // Atlanta
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1}, // Miami
{0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1}, // Dallas
{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0} // Houston
};

Memandangkan matriks adalah simetri untuk graf tidak terarah, untuk menjimatkan storan anda boleh menggunakan tatasusunan compang-camping.

Matriks bersebelahan untuk graf terarah dalam Rajah di bawah (a) boleh diwakili seperti berikut:

int[][] a = {{0, 0, 1, 0, 0}, // Peter
{0, 0, 1, 0, 0}, // Jane
{0, 0, 0, 0, 1}, // Tandakan
{0, 0, 0, 0, 1}, // Cindy
{0, 0, 0, 0, 0} // Wendy
};

Representing Graphs

Mewakili Tepi: Senarai Bersebelahan

Anda boleh mewakili tepi menggunakan senaraibucu bersebelahanatausenarai tepi bersebelahan. Senarai bucu bersebelahan untuk bucu i mengandungi bucu yang bersebelahan dengan i dan senarai tepi bersebelahan untuk bucu i mengandungi tepi yang bersebelahan dengan i. Anda boleh menentukan tatasusunan senarai. Yang
tatasusunan mempunyai n entri, dan setiap entri ialah senarai. Senarai bucu bersebelahan untuk bucu i mengandungi semua bucu j supaya terdapat tepi dari bucu i ke bucu j. Contohnya, untuk mewakili tepi dalam graf dalam Rajah di bawah, anda boleh membuat tatasusunan senarai seperti berikut:

java.util.List [] jiran = java.util.List baharu[12];

Representing Graphs

jiran[0]mengandungi semua bucu bersebelahan dengan bucu0(iaitu, Seattle),jiran[1]mengandungi semua bucu bersebelahan bucu1(iaitu, San Francisco), dan seterusnya dalam Rajah di bawah.

Representing Graphs

Untuk mewakili senarai tepi bersebelahan bagi graf dalam Rajah di bawah, anda boleh membuat tatasusunan senarai seperti berikut:

java.util.List [] jiran = java.util.List baharu[12];

Representing Graphs

jiran[0]mengandungi semua tepi bersebelahan dengan bucu0(iaitu, Seattle),jiran[1]mengandungi semua tepi bersebelahan dengan bucu1(iaitu, San Francisco), dan seterusnya dalam Rajah di bawah.

Representing Graphs

Anda boleh mewakili graf menggunakan matriks bersebelahan atau senarai bersebelahan. Mana satu lebih baik? Jika graf adalah padat (iaitu, terdapat banyak tepi), menggunakan matriks bersebelahan adalah diutamakan. Jika graf sangat jarang (iaitu, sangat sedikit tepi), menggunakan senarai bersebelahan adalah lebih baik, kerana menggunakan matriks bersebelahan akan membazirkan banyak ruang.

Kedua-dua matriks bersebelahan dan senarai bersebelahan boleh digunakan dalam program untuk menjadikan algoritma lebih cekap. Sebagai contoh, diperlukan masa tetap O(1) untuk memeriksa sama ada dua bucu disambungkan menggunakan matriks bersebelahan, dan masa linear O(m) diperlukan untuk mencetak semua tepi dalam graf menggunakan senarai bersebelahan, dengan m ialah bilangan tepi. .

Senarai bucu bersebelahan adalah lebih mudah untuk mewakili graf tidak berwajaran. Walau bagaimanapun, senarai tepi bersebelahan adalah lebih fleksibel untuk pelbagai aplikasi graf. Mudah untuk menambah kekangan tambahan pada tepi menggunakan senarai tepi bersebelahan. Atas sebab ini, buku ini akan menggunakan senarai tepi bersebelahan untuk mewakili graf.

Anda boleh menggunakan tatasusunan, senarai tatasusunan atau senarai terpaut untuk menyimpan senarai bersebelahan. Kami akan menggunakan senarai dan bukannya tatasusunan, kerana senarai itu mudah dikembangkan untuk membolehkan anda menambah bucu baharu. Selanjutnya kami akan menggunakan senarai tatasusunan dan bukannya senarai terpaut, kerana algoritma kami hanya memerlukan mencari bucu bersebelahan dalam senarai. Menggunakan senarai tatasusunan adalah lebih cekap untuk algoritma kami. Menggunakan senarai tatasusunan, senarai tepi bersebelahan dalam Rajah di bawah boleh dibina seperti berikut:

Senaraikan > jiran = ArrayList baharu<>();
neighbors.add(new ArrayList ());
neighbors.get(0).add(new Edge(0, 1));
neighbors.get(0).add(new Edge(0, 3));
neighbors.get(0).add(new Edge(0, 5));
neighbors.add(new ArrayList ());
neighbors.get(1).add(new Edge(1, 0));
neighbors.get(1).add(new Edge(1, 2));
neighbors.get(1).add(new Edge(1, 3));
...
...
neighbors.get(11).add(new Edge(11, 8));
neighbors.get(11).add(new Edge(11, 9));
neighbors.get(11).add(new Edge(11, 10));

Representing Graphs

Atas ialah kandungan terperinci Mewakili Graf. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!