세트의 파티션을 나타내는 간단한 방법은 무엇입니까?


11

세트 파티션을 나타내는 효율적인 데이터 구조 가 있습니다 . 이러한 데이터 구조는 Union 및 Find와 같은 작업에는 시간이 복잡하지만 특히 공간 효율적이지는 않습니다.

세트의 파티션을 나타내는 공간 효율적인 방법은 무엇입니까?

가능한 출발점은 다음과 같습니다.

요소가 있는 세트 의 파티션 수 는 번째 벨 번호 인 이라는 것을 알고 있습니다. 따라서 요소 로 구성된 집합의 파티션을 나타내는 데 필요한 최적의 공간 복잡도 는 비트입니다. 이러한 표현을 찾기 위해 ( 요소 세트의 파티션 세트 )와 ( 에서 사이의 정수 세트) 사이의 일대일 맵핑 을 있습니다.B N NNBNNNN 1 B Nlog2(BN)N1BN

계산하기에 효율적인 매핑이 있습니까? "효율적인"의 의미는 또는 시간 다항식에서이 간단한 표현을 조작하기 쉬운 표현 (예 : 목록 목록)으로 변환하려는 것 입니다.로그 2 ( B N )Nlog2(BN)


궁금한 점은 은 정수가 파티션 번호를 나타내는 집합의 각 요소에 고유 한 정수를 할당하는 순진 / 자연 인코딩에서 얼마나 멀리 떨어져 있습니까? 어쩌면 그것은 "그다지 큰 차이"가 아닙니다 ...log2(BN)
vzn

답변:


7

아래의 되풀이 수식이 파생 된 방식을 사용하여 인코딩을 찾을 수 있습니다 이것은 요소를 포함하는 부분에 몇 개의 다른 요소가 있는지를 고려하여 증명됩니다 . 이 중 가 있으면 선택 항목과 나머지를 분할하기위한 선택 항목이 있습니다.

Bn+1=k=0n(nk)Bk.
n+1nk(nnk)=(nk)Bk

이를 사용하여 의 모든 파티션을 범위의 숫자 로 변환하는 재귀 알고리즘을 제공 할 수 있습니다 . I 이미 크기의 서브 세트로 변환하는 방법이 생각 의를 범위의 숫자 (이러한 알고리즘 Pascal의 재발 사용하여 같은 방식으로 고안 할 수 있습니다 .n+10,,Bn+11k{1,,n}0,,(nk)1(nk)=(n1k)+(n1k1)

포함 하는 부분 에 다른 요소 가 있다고 가정하십시오 . 코드 찾으십시오 . 나머지 모든 요소를 ​​해당 범위로 "압축"하여 의 파티션을 계산하십시오 . 재귀 적으로 코드 계산하십시오 . 새 코드는n+1kC1{1,,nk}C2

C=l=0nk1(nl)Bl+C1Bnk+C2.

코드 주어진 다른 방향에서 , 고유 찾을 되도록 및 정의 이후 ,이 같이 쓸 수있다 , 여기서 . 이제 은 포함하는 부분의 요소를 코딩 하고 는 의 파티션을 코딩합니다.Ck

l=0nk1(nl)BlC<l=0nk(nl)Bl,
C=Cl=0nk1(nl)Bl.
0C<(nk)BnkC1Bnk+C20C2<BnkC1n+1C2{1,,nk}재귀 적으로 디코딩 할 수 있습니다. 디코딩을 완료하려면 후자 파티션을 "압축 해제"하여 포함하는 부분에 나타나지 않는 모든 요소를 ​​포함해야합니다 .n+1


다음은 동일한 기술을 사용하여 크기 의 하위 집합 를 재귀 적 으로 인코딩하는 방법 입니다. 경우 다음 코드는 이므로 가정하자 . 경우 다음하자 규범 수 크기의 서브셋으로, 의 ; 의 코드 는 입니다. 만약 , 을 크기 의 서브 세트로서 로하여 을 의 코드 라 하자 . 의 코드S{1,,n}kk=00k>0nSC1S{n}k1{1,,n1}SC1nSC1Sk{1,,n1}S인 .C1+(n1k1)

코드 를 디코딩하기 위해 두 가지 경우가 있습니다. 경우 그런 다음 디코딩 서브 세트 의 크기의 , 그 코드 및 출력 . 그렇지 않은 경우, 디코딩 서브 세트 의 크기의 코드 , 출력 .CC<(n1k1)S{1,,n1}k1CS{n}S{1,,n1}kC(n1k1)S


훌륭한 답변; 감사합니다. 마이너 버그 : 상단의 재발 식의 증거 스케치, 나는 당신이 무슨 뜻 생각 "이 있습니다 대신들", "가 의 그"- 다음 나머지 요소로 분할 될 수 방법 . k k B knkkkBk
cberzan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.