蝴蝶翻转

news2025/1/24 2:15:05

蝴蝶翻转

实现一

在计算机科学和数字信号处理中,蝴蝶操作是一种常用于快速傅里叶变换(FFT)的操作。在蝴蝶算法中,输入数据的一部分通过特定的运算结构进行重新排列和组合,以便在计算FFT时实现高效处理。

蝴蝶操作的名称来自于它的结构图,其中输入和输出数据的排列方式看起来像蝴蝶的翅膀。

上图,对比每个数值的二进制,通过蝴蝶翻转,就得到了对应的数值。

2:
在这里插入图片描述

对0的第一位取反,得到1的蝴蝶数值,对0的前两位翻转得到3的蝴蝶值,对1的前两位翻转得到2的蝴蝶值。
对0的前三位翻转得到7的蝴蝶值,对1的前三位翻转得到6的蝴蝶值,对2的前三位翻转得到5的蝴蝶值,对3的前三位翻转得到4的蝴蝶值,…,以此类推。

代码实现:

//x 的大小必须是2的幂数,否则返回false  -- 改算法有个弊端需要维护x大小一样的数组
bool butterflyFlip(std::vector<std::complex<double>> & x)
{
	int N = x.size();

	//找到位数大小
	double bitNum = std::log2(N);
	//判断是否有小数,有小数说明N不是2的幂数
	if (bitNum != std::floor(bitNum))
	{
		return false;
	}
	std::vector<int> vec(N, 0);
	int backBit = N - 1;
	// 对每个数据进行蝴蝶翻转
	for (int i = 0; i < bitNum; ++i)
	{
		//当前最大索引
		int maxIndex = (2 << i) - 1;
		//当前最大索引一半
		int midIndex = 1 << i;

		//需要移动的位数
		int moveBit = bitNum - i - 1;
		for (int j = 0; j < midIndex; ++j)
		{
			//数据翻转
			vec[maxIndex - j] = ((~(vec.at(j) >> moveBit)) << moveBit) & backBit;

		}

	}

	//根据蝴蝶数组翻转数据
	for (int i = 0; i < N; ++i)
	{
		if (i < vec.at(i))
		{
			std::swap(x[i], x[vec.at(i)]);

		}
	}
	return true;
}

实现二

在这里插入图片描述

代码实现:

//x 的大小必须是2的幂数,否则返回false  -- 改算法有个弊端需要维护x大小一样的数组
bool butterflyFlip(std::vector<std::complex<double>> & x)
{
	int N = x.size();

	//找到位数大小
	double bitNum = std::log2(N);
	//判断是否有小数,有小数说明N不是2的幂数
	if (bitNum != std::floor(bitNum))
	{
		return false;
	}
	std::vector<int> vec(N, 0);
    // 对每个数据进行蝴蝶翻转
    for (int i = 0; i < bitNum; ++i)
    {
        //当前最大索引一半
        int midIndex = 1 << i;

        //需要移动的位数
        int moveBit = bitNum - i - 1;
        for (int j = 0; j < midIndex; ++j)
        {
            //数据翻转
            vec[j+midIndex] = (((vec.at(j) >> moveBit)+1) << moveBit);
        }

    }

	//根据蝴蝶数组翻转数据
	for (int i = 0; i < N; ++i)
	{
		if (i < vec.at(i))
		{
			std::swap(x[i], x[vec.at(i)]);

		}
	}
	return true;
}

实现三:

在这里插入图片描述

代码实现

//x 的大小必须是2的幂数,否则返回false 
bool butterflyFlip(std::vector<std::complex<double>> & x)
{
	int N = x.size();

	//找到位数大小
	double bitNum = std::log2(N);
	//判断是否有小数,有小数说明N不是2的幂数
	if (bitNum != std::floor(bitNum))
	{
		return false;
	}
	
	// 按位反转
	for (int i = 1, j = 0; i < N; i++)
	{
		//bit = N/2
		int bit = N >> 1;
		/*
		 * 我们正在查看j的二进制表示中的每一位。
			从左到右,我们检查每一位是否为1。
			对于每一个为1的位,我们将其反转为0。
			当我们遇到第一个为0的位时,循环终止。
		*/
		for (; j & bit; bit >>= 1)
		{
			j ^= bit;
		}
		//进行异或运算(XOR运算的工作原理是:当两个比较的位相同时,结果是0;当两个比较的位不同时,结果是1。)
		j ^= bit;

		//当 i >j 表示前面已经替换了位置, i==j,表示位置不用变
		if (i < j)
		{
			std::swap(x[i], x[j]);
		}
	}
	
	return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/924594.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【seaweedfs】3、f4: Facebook’s Warm BLOB Storage System 分布式对象存储的冷热数据

论文地址 Facebook的照片、视频和其他需要可靠存储和快速访问的二进制大型对象(BLOB)的语料库非常庞大&#xff0c;而且还在继续增长。随着BLOB占用空间的增加&#xff0c;将它们存储在我们传统的存储系统-- Haystack 中变得越来越低效。为了提高我们的存储效率(以Blob的有效复…

线程池的概念及实现原理

本篇是对前面线程池具体实现过程的补充&#xff0c;实现过程可参考 线程池的实现全过程v1.0版本&#xff08;手把手创建&#xff0c;看完必掌握&#xff01;&#xff01;&#xff01;&#xff09;_竹烟淮雨的博客-CSDN博客 线程池的实现v2.0&#xff08;可伸缩线程池&#xf…

04-Numpy基础-利用数组进行数据处理

NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式&#xff08;否则需要编 写循环&#xff09;。用数组表达式代替循环的做法&#xff0c;通常被称为矢量化。一般来说&#xff0c;矢量化 数组运算要比等价的纯Python方式快上一两个数量级&#xff08;甚至更多&…

Python代理池健壮性测试 - 压力测试和异常处理

大家好&#xff01;在构建一个可靠的Python代理池时&#xff0c;除了实现基本功能外&#xff0c;我们还需要进行一系列健壮性测试来确保其能够稳定运行&#xff0c;并具备应对各种异常情况的能力。本文将介绍如何使用压力测试工具以及合适的异常处理机制来提升Python代理池的可…

vue+file-saver+xlsx+htmlToPdf+jspdf实现本地导出PDF和Excel

页面效果如下&#xff08;echarts图表按需添加&#xff0c;以下代码中没有&#xff09; 1、安装插件 npm install xlsx --save npm install file-saver --save npm install html2canvas --save npm install jspdf --save2、main.js引入html2canvas import htmlToPdf from …

Tomcat的安装与介绍

首先我们先了解一下什么是服务器&#xff1f;什么是服务器软件&#xff1f; 什么是服务器&#xff1f;安装了服务器软件的计算机。 什么是服务器软件&#xff1f; 服务器软件是一种运行在服务器操作系统上&#xff0c;用于接收和处理客户端请求&#xff0c;并提供相应服务和资…

【Go 基础篇】Go语言闭包详解:共享状态与函数式编程

介绍 在Go语言中&#xff0c;闭包是一种强大的编程特性&#xff0c;它允许函数内部包含对外部作用域变量的引用。闭包使得函数可以捕获和共享外部作用域的状态&#xff0c;实现更加灵活和复杂的编程模式。本篇博客将深入探讨Go语言中闭包的概念、用法、实现原理以及在函数式编…

【Linux】冯诺依曼体系结构思想

冯诺依曼体系结构 冯诺依曼体系结构冯诺依曼体系结构的五大部分冯诺依曼体系结构的运行过程存储器中的木桶效应扩展&#xff1a;计算机存储设备金字塔实例&#xff1a;qq聊天数据传输过程 &#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &…

【VMware】CentOS 设置静态IP(Windows 宿主机)

文章目录 1. 更改网络适配器设置2. 配置虚拟网络编辑器3. 修改 CentOS 网络配置文件4. ping 测试结果 宿主机&#xff1a;Win11 22H2 虚拟机&#xff1a;CentOS-Stream-9-20230612.0 (Minimal) 1. 更改网络适配器设置 Win R&#xff1a;control 打开控制面板 依次点击&#x…

婉约而深刻:二叉树的中序遍历之旅

力扣题目传送门https://leetcode.cn/problems/binary-tree-inorder-traversal/ 二叉树 在这篇文章中&#xff0c;我们将深入探讨题目 "94. 二叉树的中序遍历" 的内涵与解题方法。这个问题引导我们遍历一棵二叉树&#xff0c;以中序的方式呈现节点顺序&#xff0c;从…

windows安装新openssl后依然显示旧版本

1、Windows环境下升级openssl后&#xff0c;通过指令openssl version -a查看版本号&#xff1a; 这个版本号是以前的老版本&#xff0c;不知道在哪里 2、网上找了老半天也没找到答案&#xff0c;最后通过指令 where openssl 才找到原来的openssl在哪里&#xff0c;把老的卸载掉…

【安全】原型链污染 - Hackit2018

目录 准备工作 解题 代码审计 Payload 准备工作 将这道题所需依赖模块都安装好后 运行一下&#xff0c;然后可以试着访问一下&#xff0c;报错是因为里面没内容而已&#xff0c;不影响,准备工作就做好了 解题 代码审计 const express require(express) var hbs require…

aqs的今生

《AQS的前世&#xff0c;从1990年的论文说起》中我们已经对AQS做了简单的介绍&#xff0c;并学习了先于AQS出现的3种基于排队思想的自旋锁。今天我们深入到AQS的设计中&#xff0c;探究Doug Lea是如何构建JUC框架基础组件的。不过在正式开始前&#xff0c;我们先来回顾上一篇中…

Microsoft Excel整合Python:数据分析的新纪元

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

单片机UART一对多:同时读取多个传感器基于modbus协议

文章目录 背景MODBUS协议介绍UART接口改一对多参考链接 背景 很多传感器现在都做成了串口模块&#xff0c;如激光测距传感器TOF050&#xff0c;在开发时使用串口功能模块不仅大大加快了我们的开发进度&#xff0c;还能降低功能模块直接的耦合度&#xff0c;专业是功能交给专业…

postman访问ruoyi后台接口

打开若依页面&#xff0c;登录进去&#xff0c;F12打开控制台&#xff0c;选一个后台服务&#xff0c;把下图两个节点&#xff0c;补到postman请求header里面即可

gradio使用transformer模块demo介绍2:Images Computer Vision

文章目录 图像分类 Image Classification图像分割 Image Segmentation图像风格变换 Image Transformation with AnimeGAN3D模型 3D models 图像分类 Image Classification import gradio as gr import torch import requests from torchvision import transformsmodel torch.…

openCV实战-系列教程7:轮廓检测2与模板匹配(轮廓检测/轮廓特征/轮廓近似/轮廓边界矩阵/轮廓边界圆/模版匹配)、原理解析、源码解读

打印一个图片可以做出一个函数&#xff1a; def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 1、轮廓特征与近似 1.1 轮廓特征 前面我们计算了这个图片的轮廓&#xff1a; 它的轮廓信息保存在了contours中&#xff0c;取出第一个轮廓&…

java八股文面试[Spring]——如何实现一个IOC容器

什么是IOC容器 IOC不是一种技术&#xff0c;只是一种思想&#xff0c;一个重要的面向对象编程的法则&#xff0c;它能指导我们如何设计出松耦合&#xff0c;更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象&#xff0c;从而导致类与类之间高耦合&#xff0c;难于…

时序分解 | MATLAB实现基于SGMD辛几何模态分解的信号分解分量可视化

时序分解 | MATLAB实现基于SGMD辛几何模态分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SGMD辛几何模态分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SGMD分解算法&#xff08;辛几何模态分解&#xff09;&#xff0c;分解结果可视…