집합 및 볼 륨 의 세 가지 구법 (분할 곱셈, 빠 른 모 비 우 스 변환 (FMT), 빠 른 월 시 변환 (FWT))
글 목록
정의.
집합 멱급수
더욱 편리 한 연구 집합 의 볼 륨 을 위해 집합 멱급수 의 개념 집합 멱급수 도 형식 멱급수 의 하나 이 고 집합 의 표현 형식 일 뿐 수렴 이나 발산 의 의 미 를 고려 할 필요 가 없다.
집합 S S S 의 집합 멱급수 를 f f f 로 정의 하면 우 리 는 집합 S S S 를 다음 과 같은 형식 으로 표시 할 수 있다
f = ∑ T ⊆ S f T ⋅ x T \begin{aligned}f=\sum _{T\subseteq S}f_{T}\cdot x^{T}\end{aligned} f=T⊆S∑fT⋅xT f T f_T fT 는 T T T 라 는 집합 멱급수 의 계 수 는 쉽게 말 하면 집합 요소 의 존재 여 부 를 이 진 으로 표시 하고 이 를 여러 가지 형식 으로 쓰 는 것 이다.
약속 하 다.
c = (a, b) c = \ left (a, b \ right) c = (a, b) 는 a, b a, b a, b 를 연결 하여 c c c c 를 구성 하 는 것 을 의미 하 며, 편리 함 을 위해 f * 8727 g f * g f * g f * 8727 g 을 f g fg fg 로 작성 합 니 다.
볼 륨 연산
덧셈
h = f + g \ \ begin {aligned} h = f + g \ \ end {aligned} h = f + g 그러면 h S = f S + g S hS=f_S+g_S hS=fS+gS
감법
h = f − g \ \ begin {aligned} h = f - g \ \ end {aligned} h = f − g 그러면 h S = f S − g S hS=f_S-g_S hS=fS−gS
곱셈
h = f ∗ g \ \ begin {aligned} h = f * g \ \ end {aligned} h = f ∗ g 그러면 h S = ∑ i ∘ j ⊆ S f i× g j \begin{aligned}h_S=\sum_{i∘j\subseteq S}f_i\times g_j\end{aligned} hS=i∘j⊆S∑fi×gj 그 중에서 8728 ° 8728 ° 8728 ° 8728 ° 는 '또는' 이 또는 연산 '일 수 있 습 니 다.
집합 및 볼 륨 은 8728 입 니 다. 8728 입 니 다. 8728 입 니 다. 진행 또는 연산 부분 집합 볼 륨 은 8728 입 니 다. 8728 입 니 다. 8728 입 니 다. 연산 집합 과 대칭 적 인 차 볼 륨 은 8728 입 니 다. 8728 입 니 다. 8728 입 니 다.
쾌속 구법
덧셈 과 뺄셈 은 모두 O (n) O (n) O (n) 시간 복잡 도 에서 결과 대 곱셈 을 구 할 수 있 고 최적화 된 알고리즘 이 있 으 며 집합 과 볼 륨 을 예 로 들 수 있다.
분할 통치하 다
f f 에 f 가 2 n 2 ^ n 2n 항 을 설정 하여 그 집합 멱급수 에 있 는 n n 개의 원 소 를 고려 하여 f = f − + x {n} f + f + f + f = f ^ - - - + x ^ {\ \ \ {n \ \}}} f ^ + f = f - + + x {n} f +, f + - f ^ - f - - - - f - 가 앞의 2 n - 1, 2 n - 2 ^ {n - 1} 2n - 2 n - 1} 2n - 1 항, f + f + f + + f + f + + f + 후 2 n - 1 2 n - 1 {n - 1} 2 n - 2 n - 1 항 즉 f - f - f - f - f - f - n n - n - n - n n n - 1 항, f - n - 1 항, f + n 원 소 는 2 진법 에서 0 0 0,f + f + f + + f + 의 n 번 째 원 소 는 2 진 에서 1 1 1 f g = (f − + x {n} f + + n} f + (g − + x {n} g + n} g + +) = f − g + + x {{n} (f − g + + g + + f + g + f + f + g + + g +) = f − g + x {n} (f − + f + f + f + f + f + + g +) (g − + g + g + g + g + g + g + g) (g − g − g + g + g + g - g - g + g - g + g - g + g + g + (f − g + g + g + g + g + g + g + g + g) (f − g - \} f ^ {+} \ \ right) \ \ left (g ^ {-} + x ^ {\ {n \} g ^ {+} \ \ \ right) \ \ \ & = f ^ - g ^ - + x ^{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (f ^ ^ - - - ^ ^ ^ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ {\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ − + x {n} (f − g + f + g − + f + g +) = f − g − + x {n} (f − + f +) (g − + g +) − f − g fg 를 이렇게 계산 하면 f - g - f ^ - g − 와 (f - + f +)(g - + g +) \ \ left (f ^ - + f ^ + \ right) \ \ left (g ^ - + g ^ + \ right) (f - + f +)
C o d e \mathcal{Code} Code
void fold (int *f,int *g,int *h,int hlen)//hlen -> half len
{
if (hlen==1) return void(h[0]=f[0]*g[0]);
for (int i=0;i<hlen;++i) f[i+hlen]+=f[i],g[i+hlen]+=g[i];
fold(f,g,h,hlen>>1),fold(g+hlen,g+hlen,h+hlen,hlen>>1);
for (int i=0;i<hlen;++i) f[i+hlen]-=f[i],g[i+hlen]-=g[i];
}
빠 른 모 비 우 스 변환 (FMT)
집합 멱급수 f f f 에 대해 우 리 는 빠 른 모 비 우 스 를 집합 멱급수 f ^ \ widehat f f 로 정의 하여 그 계 수 를 f ^ S = ∑ T ⊆ S f T \ \ begin {aligned} \ \ widehat f S = \ sum {T \ subseteq S} f {T} \ \ end {aligned} f S = T ⊆ S ∑ fT
용 척 원리 에서 우 리 는 f S = ∑ T ⊆ S (− 1) 를 얻 을 수 있다.
곱셈 을 고려 하 다 h ^ = f ^ g ^ \ \ \ \ widhat h h = \ \ \ \ \ widhat f \ \ \ \ \ widhat f \ \ \ \ \ widhat f \ \ \ \ \ \ widhat g g h = f g h = f g h ^ s = △ △ 『 『 『 『 』 S 』 』 S 『 『 『 『 』 』 S 『 『 『 』 』 S \ \ \ \ \ \ \ \ \ widhath h h {s {s} \ \ \ \ \ sum {i \ \ \ \ \ subseq S \ \ \ sum {\ \ \ subseq {j \ \ \ \ subsubseq {{{\ \ \ \ \ \ subseq q S \ \ \ \ \ subseq q q {{{{{{{{} f} f \ \ \ \} \ \ \ & = \ left (\ sum {i \ subseteq S} f i \ \ 오른쪽) \ left (\ sum {j \ subseteq S} g {j} \ \ 오른쪽)\\ &=\widehat f_S \widehat g_S \end{aligned} h s=i⊆S∑j⊆S∑figj=(i⊆S∑fi)⎝⎛j⊆S∑gj⎠⎞=f Sg S
그럼 이제 우 리 는 f 를 어떻게 구 하 는 지 알 고 있다.
우리 에 게 f ^ S (i) \ \ widhat f S \ \ \ \ \ \ \ left (i \ \ \ 오른쪽)} f S (i) 를 만들어 f ^ S (i) \ \ \ \ widhat f S S \ \ \ \ \ \ \ \ \ widhat f S \ \ \ \ \ \ \ \ \ widhat f S (i) \ \ \ \ \ \ \ \ \ \ \ widhat f S (i) \ \ \ \ \ \ (i \ \ \ \ 오른쪽) \ \ \ \ \ \ \ \ \ \ \ \ \ {T \ \ \ \ subseq S \ \ \ \ 왼쪽 (S \ \ 왼쪽 (S \ \ \ \ 오른쪽) \ \ \ \ \ \ \ \ \ 왼쪽 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 1, 2, \ \ ldots, i \ \ right \} \ right] f {T} \ \ end {aligned} f S (i) = T ⊆ S ∑ [(S − T)⊆ {1, 2,..., i}] fT 즉 i + 1 ∼ n i + 1 \ \ sim n i + 1 ∼ n 에 S S S S 에 속 하 는 원소 가 있 으 면 반드시 선택해 야 하 며, 1 ∼ i 1 \ sim i 1 ∼ i 에 있 는 원소 가 있 으 나 없 으 면 우리 의 최종 f ^ S = f ^ S (n) \ widehat f S = \ \ widehat f S ^ {\ left (n \ right)} f S = f S (n)모든 요 소 는 있어 도 되 고 없어 도 됩 니 다. 즉, 부분 집합 은 S S S 에 i i 가 있 는 지 없 는 지 를 고려 합 니 다.
그 반 연 을 하려 면, 우 리 는 그 역 과정 을 고려 하여, 더 한 모든 것 을 빼 면 된다.
시간 복잡 도 O (n 2 n) O \ left (n2 ^ n \ \ right) O (n2 n)
C o d e \mathcal{Code} Code
위의 방법 은 모두 2 차원 배열 이 먼저 i i 를 매 거 한 다음 에 모든 S S S 의 답 을 계산 하 는 것 을 고려 하고 1 차원 배열 만 있 으 면 된다.
void FMT (int *a,int n)//n
{
int all=1<<n;
for (int i=0;i<n;++i)
for (int j=0;j<all;++j)
if (j>>i&1) a[j]+=a[j^(1<<i)];
}
void IFMT (int *a,int n)//n
{
int all=1<<n;
for (int i=0;i<n;++i)
for (int j=0;j<all;++j)
if (j>>i&1) a[j]-=a[j^(1<<i)];
}
빠 른 월 시 변환 (FWT)
우 리 는 분 치 알고리즘 을 진행 할 때 f - −, g - f ^ -, g ^ - f -, g -, g -, (f - + f +), (g - + g +) \ left (f ^ - + f ^ + \ right), \ \ left (g ^ - + g ^ + + \ right) (f - + f +), (g - + g + g +) 만 남 겨 두 면 답 을 계산 할 수 있다 는 것 을 발견 했다.
분 치 를 고려 하지 않 고 순환 으로 쓰 면 우 리 는 다른 방법 으로 F W T FWT FWT 를 이해 합 니 다. 물론 이것 은 다른 사고 입 니 다. 위 에서 순환 으로 바 꾸 는 사 고 는 정확 한 위의 f = f - + f + f = f ^ - + f = f - + f + 입 니 다. 우 리 는 이 조건 을 만족 시 키 고 그 다음 에 f - g - f ^ - g ^ - f - g - g - 우리 로 하여 금 사고의 한 계 를 벗 어 나 게 합 니 다.좋 을 것 같 아......................................................................................................................................... 왜 이러 면 되 지?좋 을 것 같 아.좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, 좋 을 것 같 기도 하고, (f - + f +) (g - + g +) f '^ + g' ^ ^ + g '^ ^ ^ + = \ \ (f ^ - + f ^ + + + + \ \ \ \ 우) \ \ \ (g ^ - + g ^ + + + (g + g + g + g + g + g + g' ^ ^ ^ ^ ^ + + = \ \ (f ^ - - - + f ^ - + + + + + + \ \ 우) \ \ \ 좋 을 것 같 아.(f ^ -, f ^ - + f ^ + \ right) f ′ = (f −, f − + f +) 그런 다음 에 이런 f ′ f 'f ′ 를 월 시 변환 F W T (f) = F W T (f −, f − + f +) FWT \ \ left (f \ right) = FWT \ \ left (f ^ -, f ^ - + f ^ + \ right) FWT (f) = FWT (f −, f − + f + f +)
리 액 션 도 간단 합 니 다. 곧 다 산 될 f - f ^ - f - 를 빼 면 됩 니 다.
C o d e \mathcal{Code} Code
void FWT (int *a,int n)
{
for (int len=2;len<=n;len<<=1)
for (int i=0,hlen=len>>1;i<n;i+=len)
for (int j=i,k=j+hlen;j<k;++j)
a[j+hlen]+=a[j];
}
void IFWT (int *a,int n)
{
for (int len=2;len<=n;len<<=1)
for (int i=0,hlen=len>>1;i<n;i+=len)
for (int j=i,k=j+hlen;j<k;++j)
a[j+hlen]-=a[j];
}
시간 복잡 도 O (n 2 n) O \ left (n2 ^ n \ \ right) O (n2 n)
만약 에 잘 모 르 거나 잘못 이 있 으 면 지적 을 환영 합 니 다. 마음 에 드 시 면 좋아요 를 눌 러 소장 하 세 요. 추천 을 받 을 수 있다 면 블 로 거들 은 더욱 기 쁩 니 다. 당신 의 격려 는 블 로 거들 의 원동력 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
집합 및 볼 륨 의 세 가지 구법 (분할 곱셈, 빠 른 모 비 우 스 변환 (FMT), 빠 른 월 시 변환 (FWT))우리 에 게 f ^ S (i) \ \ widhat f S \ \ \ \ \ \ \ left (i \ \ \ 오른쪽)} f S (i) 를 만들어 f ^ S (i) \ \ \ \ widhat f S S \ \ \ \ \...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.