집합 및 볼 륨 의 세 가지 구법 (분할 곱셈, 빠 른 모 비 우 스 변환 (FMT), 빠 른 월 시 변환 (FWT))

그렇게 지도 모른다, 아마, 아마...
글 목록
  • 정의
  • 집합 멱급수
  • 약정
  • 볼 륨 연산
  • 덧셈
  • 감법
  • 곱셈
  • 빠 른 구법
  • 분 치
  • 쾌속 모 비 우 스 변환 (FMT)
  • 퀵 월 시 변환 (FWT)
  • 본 논문 의 주요 내용 은 무한 시 제2 중학교 여 개 풍 학우 의 논문 인 에 대한 이해 이다.
    정의.
    집합 멱급수
    더욱 편리 한 연구 집합 의 볼 륨 을 위해 집합 멱급수 의 개념 집합 멱급수 도 형식 멱급수 의 하나 이 고 집합 의 표현 형식 일 뿐 수렴 이나 발산 의 의 미 를 고려 할 필요 가 없다.
    집합 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∑​fi​gj​=(i⊆S∑​fi​)⎝⎛​j⊆S∑​gj​⎠⎞​=f ​S​g ​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 가 있 는 지 없 는 지 를 고려 합 니 다.
  • 없 으 면 f ^ S (i) = f ^ S (i − 1) \ \ widehat f S ^ {\ left (i \ right)} = \ widehat f S ^ {\ \ left (i - 1 \ right)} f S (i) = f S (i - 1)
  • 있 습 니 다. 그렇다면 f ^ S (i) = f ^ S (i - 1) + f ^ S - i (i - 1) \ \ widehat f ^ {\ left (i \ right)} {S} = \ widehat f ^ {\ left (i - 1 \ \ right)} {S} + \ widehat f ^ {\ left (i - 1 \ right)} {S - i} f S (i) = f S (i - 1) + f S - i (i - 1)S − i S - i S − i 는 S S S 라 는 집합 에서 i i 라 는 요 소 를 제거 하 겠 다 고 밝 혔 다. 이 식 의 후 두 가지 전 자 는 i i i 라 는 요소 가 반드시 선택 되 었 고 후 자 는 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)
    만약 에 잘 모 르 거나 잘못 이 있 으 면 지적 을 환영 합 니 다. 마음 에 드 시 면 좋아요 를 눌 러 소장 하 세 요. 추천 을 받 을 수 있다 면 블 로 거들 은 더욱 기 쁩 니 다. 당신 의 격려 는 블 로 거들 의 원동력 입 니 다.

    좋은 웹페이지 즐겨찾기