我是靠谱客的博主 酷炫月饼,最近开发中收集的这篇文章主要介绍FWT快速沃尔什变换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Fast Walsh-Hadamard Transform 就是用于解决一类卷积问题的方法。

时间复杂度nlogn,求解的内容如下
这里写图片描述

可以用于求解数组A和数组B异或后能得到哪些数之类的问题(暴力枚举是n2的复杂度)

void FWT(int a[],int n)
{
for(int d=1;d<n;d<<=1)
for(int m=d<<1,i=0;i<n;i+=m)
for(int j=0;j<d;j++)
{
int x=a[i+j],y=a[i+j+d];
//a[i+j]=(x+y)%mod,a[i+j+d]=(x-y+mod)%mod;

//xor:
a[i+j]=x+y,a[i+j+d]=(x-y+mod)%mod;
//and:a[i+j]=x+y;

//or:a[i+j+d]=x+y;

}
}
void UFWT(int a[],int n)
{
for(int d=1;d<n;d<<=1){
for(int m=d<<1,i=0;i<n;i+=m) {
for(int j=0;j<d;j++)
{
int x=a[i+j],y=a[i+j+d];
//a[i+j]=1LL*(x+y)*rev%mod,a[i+j+d]=(1LL*(x-y)*rev%mod+mod)%mod;
//xor:
a[i+j]=(x+y)/2,a[i+j+d]=(x-y)/2;
//and:a[i+j]=x-y;

//or:a[i+j+d]=y-x;

}
}
}
}
void solve(int a[],int b[],int n)
{
//求解C[i]=segma(j^k==i?a[j]*b[k]:0),时间复杂度nlogn 
//可用于求解n个数两两异或能得到哪些数,c[i]!=0表示该数能求解得到。
FWT(a,n);
FWT(b,n);
for(int i=0;i<n;i++) a[i]=1LL*a[i]*b[i]%mod;
UFWT(a,n);
}

最后

以上就是酷炫月饼为你收集整理的FWT快速沃尔什变换的全部内容,希望文章能够帮你解决FWT快速沃尔什变换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部