>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19619 个阅读者 刷新本主题
 * 贴子主题:  一种码位倒置算法 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-03-15 16:08:21     消息  查看  搜索  好友  邮件  复制  引用

       最近在复习FT(Fourier Transform)相关的知识,当然是要好好复习一下FFT(Fast Fourier Transform)算法啦。FFT这个伟大的算法是JW Cooley & JW Tukey在1965年提出的。 他们的论文“机器计算Fourier series的一种算法”发表在<<Mathematics of computation>> ,成为DSP发展史上的里程碑。关于FT和FFT算法相关的理论资料是很容易找到的,这里就不在复述啦。这里我想提一提“码位倒置”算法。码为倒置算法作为FFT算法的一部分,它的出现为FFT这个本来就很巧妙的算法更添一份神奇,是的冥冥之中码为倒置算法就应该出现在FFT中,这或许就是所谓的真理!

     先简单的描述一下码位倒置算法:

    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     尽管有很多高效简单的码位倒置算法,但它们理解起来都比较困难,针对这种情况,提出一种“循环移位”的码为倒置算法,该算法直观容易理解,而且也同样高效。算法代码如下:
         /*void bitreverse(int a[], int N)

           a[]为要改变位置的数字,N为数组a的长度,N = 2^L

         */


         void bitreverse(int a[], int N){

             //计算数组长度N的二进制站位数,即L,保存到bitsn中

         int n = N-1;

             int bitsn = 0;

             while(n != 0){

                 n = n>>1;

                 bitsn++;

             }

         //码位倒置,最多交换N/2次

         for(int i = 0; i < N/2; i++{

                 int num = bitsn;  /*循环位移次数,bitsn次

                 int pos = i;   /*当前待交换位置*/


                 int des = 0;   /*目的交换位置*/

                 //循环移位

                 while(num > 0){

                     int temp = pos;

                     pos = pos>>1; /*当前待交换位置向右移出一位*/

                     des = des<<1; /*目的位置左移一位,虚以待位*/

                     des += temp - (pos<<1); /*将pos移出的位加到pos上*/

                     num--;

                 }

                 //如果des和i相等则交换

                 if(des != i){

                     int t = a[i];

                     a[i] = a[des];

                     a[des] = t;

                 }

             }      

     }

     下面是另一种方法的流程图:

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

            

----------------------------
原文链接:https://blog.51cto.com/remyspot/1369502

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-19 10:43:13 重新编辑]
  Java面向对象编程-->Lambda表达式
  JavaWeb开发-->使用Session(Ⅱ)
  JSP与Hibernate开发-->JPA API的高级用法
  Java网络编程-->通过JDBC API访问数据库
  精通Spring-->Vue Router路由管理器
  Vue3开发-->计算属性和数据监听
  无向图的最短路径求解算法之——Dijkstra算法
  LVS的调度算法-个人理解
  HAProxy 之 算法介绍
  银行家算法范例
  java 通配符的应用范例, java 排序算法
  haproxy调度算法
  如何面对“算法”的困惑?
  PageRank算法
  基于JavaScript的Base64编码、解码算法
  天干地支算法
  Binary Search二分查找算法
  LinkedList,LinkedHashMap,LruCache源码解析
  小米面试算法题:搜索旋转排序数组
  Java数据结构与算法 - 栈和队列
  RSA算法的数学原理
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。