Miklix

PHP에서의 분리된 집합(Union-Find 알고리즘)

게시됨: 2025년 2월 16일 오후 12시 25분 57초 UTC

이 문서에서는 최소 신장 트리 알고리즘의 Union-Find에 일반적으로 사용되는 Disjoint Set 데이터 구조의 PHP 구현을 소개합니다.


이 페이지는 가능한 한 많은 사람이 이용할 수 있도록 영어에서 기계 번역되었습니다. 안타깝게도 기계 번역은 아직 완성된 기술이 아니므로 오류가 발생할 수 있습니다. 원하시는 경우 여기에서 영어 원문을 보실 수 있습니다:

Disjoint Set (Union-Find Algorithm) in PHP

Disjoint Set(일반적으로 Union-Find, Disjoint Set Union에 사용됨)은 요소를 분리된(겹치지 않는) 세트로 분할하는 데 사용되는 데이터 구조입니다. 두 가지 주요 작업을 효율적으로 지원합니다.

  1. 찾기 : 요소가 어느 집합에 속하는지 판별합니다.
  2. 합집합 : 두 개의 집합을 합칩니다.

이 구조는 크루스칼 알고리즘과 같은 최소 신장 트리 알고리즘에 특히 유용합니다.

무작위 미로를 생성하는 데 사용되는 Kruskal 알고리즘 구현이 있는데, 이는 Disjoint Set의 아래 PHP 구현에 의존하여 효율적으로 세트를 병합합니다. 관심이 있다면 여기에서 실제로 볼 수 있습니다: 크루스칼 알고리즘 미로 생성기

어쨌든, 이게 제가 Disjoint Set을 PHP로 구현한 것입니다.

class DisjointSet
{
    private $parent = [];
    private $rank   = [];

    public function __construct($size)
    {
        for ($i = 0; $i < $size; $i++)
        {
            $this->parent[$i]   = $i;
            $this->rank[$i]     = 0;
        }
    }

    public function find($x)
    {
        if ($this->parent[$x] != $x)
        {
            $this->parent[$x] = $this->find($this->parent[$x]);
        }

        return $this->parent[$x];
    }

    public function union($x, $y)
    {
        $rootX = $this->find($x);
        $rootY = $this->find($y);

        if ($rootX != $rootY)
        {
            if ($this->rank[$rootX] > $this->rank[$rootY])
            {
                $this->parent[$rootY] = $rootX;
            }
            elseif ($this->rank[$rootX] < $this->rank[$rootY])
            {
                $this->parent[$rootX] = $rootY;
    
            }
            else
            {
                $this->parent[$rootY] = $rootX;
                $this->rank[$rootX]++;
            }
        }
    }
}

재미 삼아 미로를 만드는 것 외에도, Disjoint Set 데이터 구조는 실제 상황에도 확실히 사용할 수 있습니다.

예를 들어, 사용자에게 새로운 친구를 추천하고 싶어하는 소셜 네트워크를 상상해 보세요. 그리고 이미 이러한 친구 관계가 있는 사람이 6명 있다고 가정해 봅시다.

  • 1과 2는 친구입니다.
  • 2와 3은 친구입니다.
  • 4와 5는 친구입니다.
  • 6은 친구가 없습니다.

이러한 개별 그룹에 Union-Find 알고리즘을 적용하면 다음과 같은 결과를 얻을 수 있습니다.

  • 1, 2, 3이 한 그룹에 속함.
  • 두 번째 그룹은 4와 5입니다.
  • 세 번째 그룹은 6명.

이를 바탕으로, 1과 3은 사람 2와 공통점이 있으므로 친구가 되는 것이 합리적입니다.

물론, 이와 같은 작은 예에서는 여러분도 쉽게 이 사실을 알아낼 수 있겠지만, 이 알고리즘의 효율성 덕분에 수십억 명의 사람들과 친구 그룹으로 확장하는 것이 가능합니다.

블루스카이에서 공유하기페이스북에서 공유하기LinkedIn에서 공유하기Tumblr에 공유하기X에서 공유LinkedIn에서 공유하기Pinterest에 고정

미켈 방 크리스텐슨

저자 소개

미켈 방 크리스텐슨
남자 이름은 miklix.com의 창시자이자 소유자입니다. 전문 컴퓨터 프로그래머/소프트웨어 개발자로 20년 이상 경력을 쌓았으며 현재 유럽의 대형 IT 기업에서 정규직으로 근무하고 있습니다. 블로그를 운영하지 않을 때는 여가 시간을 다양한 관심사, 취미, 활동으로 보내며 이 웹사이트에서 다루는 다양한 주제에 어느 정도 반영되어 있습니다.