Rumah > pangkalan data > tutorial mysql > Bagaimana Mengenalpasti Subgraf Bersambung dalam Graf Tidak Berarah Menggunakan CTE Rekursif?

Bagaimana Mengenalpasti Subgraf Bersambung dalam Graf Tidak Berarah Menggunakan CTE Rekursif?

Patricia Arquette
Lepaskan: 2024-10-29 10:05:30
asal
410 orang telah melayarinya

How to Identify Connected Subgraphs in an Undirected Graph Using Recursive CTEs?

Cara Mencari Semua Subgraf Bersambung bagi Graf Tidak Berarah

Masalah:

Diberikan jadual dengan dua lajur (Pengecam1 dan Pengecam2) yang mewakili pasangan nod bersambung dalam graf tidak berarah, kumpulkan nod ke dalam subgraf supaya setiap nod dalam subgraf disambungkan kepada setiap nod lain dalam subgraf yang sama.

Penyelesaian:

Pertanyaan asal daripada pernyataan masalah boleh diperhalusi menggunakan pendekatan rekursif untuk mengumpulkan nod ke dalam subgraf yang disambungkan. Di bawah ialah versi pertanyaan yang diubah suai yang menggunakan CTE rekursif untuk melintasi tepi graf dan mengenal pasti komponen yang disambungkan:

<code class="sql">WITH RECURSIVE CTE AS (
    SELECT * FROM @T
    UNION ALL
    SELECT t2.Ident1, t2.Ident2 
    FROM CTE t1
    JOIN @T t2 ON t1.Ident2 = t2.Ident1
)
SELECT CTE.Ident, GroupID = MIN(CTE.Ident) OVER (PARTITION BY CTE.GroupPath)
FROM CTE
ORDER BY CTE.Ident</code>
Salin selepas log masuk

Cara ia Berfungsi:

The CTE (Ungkapan Jadual Biasa) bernama CTE bertindak sebagai pertanyaan rekursif yang bermula dengan memilih semua baris daripada jadual input @T. Kemudian, ia melakukan kesatuan rekursif dirinya sendiri, di mana klausa UNION ALL menambah baris pada CTE yang mewakili tepi graf. Khususnya, ia bergabung dengan CTE dengan jadual input @T dengan syarat t1.Ident2 adalah sama dengan t2.Ident1, dengan berkesan merentasi tepi graf dari setiap nod.

Untuk mengenal pasti subgraf yang disambungkan, pertanyaan memanfaatkan lajur GroupPath dalam CTE. Lajur ini dikira sebagai laluan terkumpul Pengecam yang ditemui semasa traversal rekursif. Dengan membahagikan CTE oleh GroupPath dan memilih nilai Ident minimum dalam setiap partition menggunakan MIN(CTE.Ident) OVER (PARTITION BY CTE.GroupPath), ia mengumpulkan nod ke dalam subgraf yang disambungkan.

Contoh :

Pertimbangkan jadual input berikut:

Identifier1 Identifier2
a c
b f
a g
c h
b j
d f
e k
i NULL
c b

Menjalankan pertanyaan yang diubah suai akan menghasilkan hasil berikut:

Identifier GroupID
a 1
b 2
c 1
d 2
e 3
f 2
g 1
h 1
j 2
k 3
l 4

Dalam contoh ini, nod " a", "c", "g", dan "h" membentuk satu subgraf bersambung dengan GroupID=1, manakala nod "b", "d", "f", dan "j" membentuk subgraf lain dengan GroupID=2. Nod "e" dan "k" berada dalam subgraf berasingan dengan GroupID=3 dan nod "i" berada dalam subgraf sendiri dengan GroupID=4 (kerana ia tidak mempunyai sambungan ke nod lain).

Atas ialah kandungan terperinci Bagaimana Mengenalpasti Subgraf Bersambung dalam Graf Tidak Berarah Menggunakan CTE Rekursif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan