fft从多项式乘法到快速傅里叶变换原理可以看下面链接的博文,讲的很好。
http://blog.miskcoo.com/2015/04/polynomial-multiplication-and-fast-fourier-transform#comment-57922
其中有关为什么要二进制反转有另一种理解方法:
对于上述博文的到的公式:
时:
及
递归时就是不断对原数列进行划分:
图一
例如n为16时,原数列划分:
图二
现在来分析一下第四层的12,二进制表示:1100。 若0代表二叉树向左,1表示向右。则1100倒过来看就表示左左右右,不就是告诉了根节点0如何找到叶节点12在二叉树的方向吗。再根据“图一”,可以发现这个方法是可以证明的(此处不证了,意会),且对所有的叶节点都成立。
有了这个概念我们就可以找到起始数列中某个数在最底层的位置。比如原数列下标为13,二进制表示:1101 反转后:1011。右左右右(()+0+(
)+(
))=11 即在最底层下标为11的位置(从0开始)。用此方法即可找到起始数列中所有数在最底层的位置。
对于反转二进制求法的方法除了上述链接的博文有讲。
也可以用动态规划来思考:若 则 dp[i]=(dp[i>>1]>>1)|((i&1)<<(m-1)) (
有点抽象,需要画图感受一下)
见 https://www.cnblogs.com/cjyyb/p/7622151.html