OI 中的 FFT

不行啊最近备考简直变成文化狗了= =。。我还脑洞大开想学俄语什么心态。。

简单地说一下FFT(来,跟我一起念,法?法?塔,法斯特~福铝页~圈死佛而母)。。

FFT本来是做信号变换用的,当然OI和信号变换搭不上边.但是大家都知道,FFT可以快速求卷积.这可以说是由复数的性质决定的.

FFT是什么

FFT,是DFT的一种实现.它可以在$\theta \left( n\log_2{n}\right)$(其中n为输入规模)时间内完成DFT.

也就是说,FFT是DFT的一种具体实现.因此,与其问FFT是什么,更不如问DFT是什么.

DFT:Discrete Fourier Transform即离散傅里叶变换.由于计算机并不能真正处理连续数据,因此我们所说的傅里叶变换仅限于DFT.

具体的,计算机和人类都不可能完全识别连续数据,设这个连续数据是一个函数$\mathtt{F} ( t) \mathtt{ \ } ( t \in \mathbb{R}^+)$,我们只能选择一些点$t_n \mathtt{ \ } ( t_n \in \mathbb{R}^+, n \in \mathbb{Z}^+, t_{n - 1} < t_n)$,令$f_n = \mathtt{F} ( t_n)$,这个过程称为采样,这些$t_n$被称为采样点.一般我们规定只能取有限个采样点并且每个采样点间距相同,即$t_n = t_{n - 1} + b \mathtt{ \ } \left( \mathtt{const } b = \frac{1}{\max n}, n \in \mathbb{Z}^+ \right)$,此时既然采样点间距相同,采样点的数据也是成序列的.不妨设这个序列为$\mathtt{S}_f$.

傅里叶变换其实是由一个定义在F上的积分\[ \widehat{\mathtt{F}} (\xi) = \int_{- \infty}^{\infty} \mathtt{F} (x) e^{- 2 \pi i x \xi} \text{dx} \]定义的.这是连续傅立叶变换,自然的,我们可以很轻松地写出离散傅里叶变换\[ \widehat{\mathtt{S}_{\mathtt{F}}} [ k] = \sum_{n = 0}^{N - 1} \mathtt{S}_{\mathtt{F}} [ n] e^{\frac{- 2 \pi i n k}{N}} \left( \mathrm{for easier input,lets define N as} \max n \right) \]基本就是把积分换成求和而已.

附加题×1: 已知傅立叶变换的逆变换是\[ \mathtt{F} (x) = \int_{0}^{\infty} \hat{\mathtt{F}} (\xi) e^{2 \pi i \xi x} \hspace{0.25em} d \xi \]写出它的离散形式.

FFT怎么做

很自然地,我们想到一个问题:

时间: 2024-10-11 18:04:17

OI 中的 FFT的相关文章

OI中整数的读入优化

将整数一个字符一个字符地读入,再转成整数,比直接作为整数读入快. 在读入大规模的整数数据时比较有效. 代码如下: inline void read_int(int &num) { char c; while (c = getchar(), c < '0' || c > '9'); num = c - '0'; while (c = getchar(), c >= '0' && c <= '9') num = num * 10 + c - '0'; } OI中

A*算法在OI中的应用

1.A*算法 我们普通的搜索算法往往复杂度都是指数级,OI中这样的复杂度无法满足我们的要求.这时我们一般都会进行一些剪枝优化,但在有些题目中却可以有更加巧妙的方法--A*算法. A*算法作为一种基础的启发式搜索,它不同于DFS和BFS将所有情况进行遍历,它能从所有情况中选出较优的再进行遍历.因此,它让搜索从"瞎搜"转化到了"有目标的搜索".那么如何确定较优的情况便是关键所在. A*算法中核心是一个估值函数,我们可以通过它来得到每种情况的优劣.用公式表示便是: f(n

GCC&amp;&amp;GDB在OI中的介绍

序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万分以及觉得GDB很好吃的人 $\qquad$以及---- $\qquad$经常眼瞎看不见i++和j++的区别 $\qquad$经常访问a[-1]然而使编译器无可奈何(除非在使用O2的情况下的明显访问越界)的人 ... $\qquad$正式地说,本文介绍GCC&&GDB命令在OI中的应用. 提要

浅谈OI中的底层优化!

众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其实底层优化比较简单,比如我们经常使用的 register还有快读,这些都可以进行优化.还有fread,但是fread在一些情况(尤其是在重要的的比赛时)但是还是给出下面的优化 const int L=1<<20|1; char buffer[L],*S,*T; #define getchar()

论OI中各种玄学卡常

当你在写程序的时候一般出现过这种无比悲剧的情况: 你讨厌卡常?下面有二则小故事: 作为一个经常出题的人,其实很多时候出题时的画风是这样的:"我有一个绝妙的\(O(nlog^2n)\)的算法,我来出道题吧""咦怎么只能跑 \(5w\) 啊,好咸鱼啊,我要让它能跑 \(10w\),嗯现在 \(10w\) 只要 \(0.3s\) 了,要不努把力跑个 \(20w\) 吧"然后就没有然后了.. 开O2之后FFT会比不开快几倍? 不开\(O2\):\(NTT\)比\(FFT\)

OI中坑点总结(持续更新)

以下是我个人OI生涯中遇到的坑点的一个小总结,可能是我太菜了,总是掉坑里,请大佬勿喷 1,多重背包的转移顺序 //默认每个物品体积为一(不想打码--) //dp[i]表示占用背包容量i所能获得的最大价值 for(int i=1;i<=n;i++) for(int j=sum;j>0;j--) //sum表示背包最大容量 for(int k=0;k<=num;k++) //num表示这个物品的数量,k表示选取当前物品k件 if(j>=k) dp[j]=min(dp[j],dp[j-k

浅谈左偏树在OI中的应用

Preface 可并堆,一个听起来很NB的数据结构,实际上比一般的堆就多了一个合并的操作. 考虑一般的堆合并时,当我们合并时只能暴力把一个堆里的元素一个一个插入另一个堆里,这样复杂度将达到\(\log(|A|)+\log(|B|)\),极限数据下显然是要T爆的. 所以我们考虑使用一种性价比最高的可并堆--左偏树,它的思想以及代码都挺简单而且效率也不错. 学习和参考自这里 What is Leftist Tree 左偏树,顾名思义就是像左偏的树,但是这样抽象的表述肯定是不符合我们学OI的人的背板子

【Delphi】如何在三轴加速器的频谱分析中使用FFT(快速傅里叶变换)算法

关于傅里叶变换的作用,网上说的太过学术化,且都在说原理,已经如何编码实现,可能很多人有个模糊影响,在人工智能,图像识别,运动分析,机器学习等中,频谱分析成为了必备的手段,可将离散信号量转换为数字信息进行归类分析. 今天这里将的不是如何实现,而是如何使用傅里叶变换 但频谱分析中,涉及到的信号处理知识对大部分软件开发的人来说,太过于晦涩难懂,傅里叶变换,拉普拉斯,卷积,模相,实数,虚数,复数,三角函数等等,已经能让软件工程师望而却步,造成懂知识的人无法开发,懂开发的人无法分析,而同时具备两种技能的人

论OI中无穷大(INF)的取值

水 为什么我的Floyd会输出负数啊? 为什么我的代码写对了却全都爆零了啊? 那么很可能是你的INF取大/小了! 那么inf到底应该取什么值呢? 首先,inf应该要比一般的题目中出现的数据要大,但是又不能超过max_int. 1e9是一个好选择! 为什么不是0x7fffffff呢?这不是int的最大值吗 因为有的时候(例如Floyd等算法)会出现两个inf相加的情况,如果inf取max_int则加法会造成溢出,而取1e9则不会出现这样的情况. 但是初始化会不会很麻烦? 答案是肯定的,谁都不愿意为