> 데이터 베이스 > MySQL 튜토리얼 > 재귀 CTE를 사용하여 무방향 그래프에서 연결된 하위 그래프를 식별하는 방법은 무엇입니까?

재귀 CTE를 사용하여 무방향 그래프에서 연결된 하위 그래프를 식별하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-29 10:05:30
원래의
442명이 탐색했습니다.

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

무방향 그래프의 연결된 모든 하위 그래프를 찾는 방법

문제:

무방향 그래프에서 연결된 노드 쌍을 나타내는 두 개의 열(식별자1 및 식별자2)이 있는 테이블에서 하위 그래프의 각 노드가 동일한 하위 그래프의 다른 모든 노드에 연결되도록 노드를 하위 그래프로 그룹화합니다.

해결책:

문제 설명의 원래 쿼리는 노드를 연결된 하위 그래프로 그룹화하는 재귀적 접근 방식을 사용하여 구체화할 수 있습니다. 다음은 재귀 CTE를 사용하여 그래프 가장자리를 순회하고 연결된 구성 요소를 식별하는 쿼리의 수정된 버전입니다.

<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>
로그인 후 복사

작동 방식:

CTE라는 CTE(공통 테이블 표현식)는 입력 테이블 @T에서 모든 행을 선택하여 시작하는 재귀 쿼리 역할을 합니다. 그런 다음 UNION ALL 절이 그래프의 가장자리를 나타내는 CTE에 행을 추가하는 재귀적 합집합을 수행합니다. 구체적으로, t1.Ident2가 t2.Ident1과 같다는 조건으로 CTE를 입력 테이블 @T와 조인하여 각 노드에서 그래프의 가장자리를 효과적으로 통과합니다.

연결된 하위 그래프를 식별하기 위해 쿼리는 CTE의 GroupPath 열을 활용합니다. 이 열은 재귀 순회 중에 발견된 식별자의 누적 경로로 계산됩니다. CTE를 GroupPath로 분할하고 MIN(CTE.Ident) OVER (PARTITION BY CTE.GroupPath)를 사용하여 각 파티션 내의 최소 Ident 값을 선택함으로써 노드를 연결된 하위 그래프로 그룹화합니다.

예 :

다음 입력 테이블을 고려하세요.

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

수정된 쿼리를 실행하면 다음 결과가 생성됩니다.

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

이 예에서는 노드 " a", "c", "g" 및 "h"는 GroupID=1인 하나의 연결된 하위 그래프를 형성하고, 노드 "b", "d", "f" 및 "j"는 GroupID=2인 또 다른 하위 그래프를 형성합니다. 노드 "e"와 "k"는 GroupID=3인 별도의 하위 그래프에 있고 노드 "i"는 GroupID=4인 자체 하위 그래프에 있습니다(다른 노드와 연결되지 않기 때문입니다).

위 내용은 재귀 CTE를 사용하여 무방향 그래프에서 연결된 하위 그래프를 식별하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿