看了很久文档,觉得自己只学会了套模板的能力,理解的代码是怎么写,还有一点原理,看完现在来推一下原理估计又不会了!
学这个的原因是因为codechef的一道题目,可惜现在还是没有解决,谁会了求教 点击打开链接
看了 ACdream 的博客,觉得不够详细,而且看了之后根本看不懂代码里面写的什么鬼,之后找了 一份题解
然后在百度文库找到了一篇讲得很详细的 文档 ,看玩总算理解了那么一点点!
ps:这里我只能写一点代码要做什么,原理不敢亵渎!
1、首先是反转置换,将一个2的n次幂长度的分成两个,奇数是一组,偶数是一组,然后一次递归下去,直到长度为1,这样每个元素的位置会去到他二进制反转之后变成是十进制的位置,做置换可以采用rader算法线性实现!一下引用上面链接博客的一张图:
其实为什么这样想想也很明显,将位置pos编号换成二进制,初始化ans_pos=0,ans依次做位运算右移,低位为0的时候走向二叉树的左儿子,否则是右儿子,而ans_pos依次左移,向二叉树左儿子走的时候末尾补0,否则补1,这样ans_pos的二进制就和刚开始ans的二进制是相反的
rader算法代码如下:
///雷德算法,2^M=len,将第i位的数与“i的二进制反转之后的位”的数交换
void rader(complex *F,int len)
{
int j=len/2;///模拟二进制反转进位的的位置
for(int i=1;i<len-1;i++)
{
if(i<j)swap(F[i],F[j]);///该出手时就出手
int k=l