快速傅里叶变换应用(FFT Applications)
1. 3-SUM
1.1 问题描述
Given three sets \(X\), \(Y\), and $Z $ of \(n\) integers each, determine whether there is a triple \(i \in X, j \in Y, k \in Z\) such that \(i + j = k\).
给定三个包含\(n\)个整数的集合, 每个整数的值都在\(0\)到\(m\)之间, 判断是否有一个三元组\((i, j, k)\)满足\(i \in X, j \in Y, k \in Z\)并且\(i + j = k\).
1.2 解答
算法如下:
- 构造多项式:
\]
\]
其中\(a_i=1\) 当且仅当\(i \in X\)否则\(a_i=0\), \(b_j=1\) 当且仅当\(j \in Y\)否则\(b_j=0\).
- 计算\(C(x)=A(x)\times B(x)\). (利用FFT)
- 多项式\(C(x)\)系数\(c_k\)表示集合\(\set{(i, j)|i\in X,j \in Y, i+j=k}\)的大小, 即选择一个整数\(i \in X\)和一个整数\(j\in Y\), 使得他们的和为\(k\)的方法数.
- 对于每一个\(k\in Z\), 判断\(c_k\)是否大于\(0\), 如果存在一个\(k\)满足条件, 说明可以找到一个三元组\((i, j, k)\)满足\(i \in X, j \in Y, k \in Z\)并且\(i + j = k\).
时间复杂度: FFT需要\(O(m\log m)\), 遍历\(Z\)需要\(O(n)\), 总共\(O(m\log m+n)\).
2. 等距下标
2.1 问题描述
长度为\(n\)的二进制串\(A\)的一组等距下标\((i,j,k)\)满足如下条件:
- \(0\leq i <j<k\leq n-1\),
- \(A[i]=A[j]=A[k]=1\),
- \(k-j=j-i\).
(a) 设计⼀个\(O(n\log n)\)的算法,计算\(A\)中是否存在等距下标.
(b) 设计⼀个\(O(n\log n)\)的算法,计算\(A\)中有多少组等距下标.
2.2 解答
(a) 算法如下:
- 构造多项式:
\]
其中系数\(a[t]=A[t]\).
- 计算\(B(x)=A(x)\times A(x)\). (利用FFT)
- 多项式\(B(x)\)的系数\(b_l\)表示集合\(\set{(p, q)|p,q\in [0,n-1], A[p]=A[q]=1, p+q=l}\)的大小, 即有多少组下标\(p\)和下标\(q\), 满足\(A[p]=A[q]=1\)和\(p+q=l\).
- 判断是否存在\(b_l=2r+1\), 其中\(b_l\)为多项式\(B(x)\)的系数, \(r=1,2,3,\dots\), 如果存在说明存在等距下标.
等距下标\((i, j, k)\)满足\(i+k=2j\), 多项式\(B(x)\)中, \(b_lx{^l}\)表示和为\(l\)且对应位置为1的下标有\(b_l\)组. 所以当\(b_l\)为大于等于3的奇数时, 一定存在等距下标.
*为什么要求为奇数? 为了保证有\(i, j, k\)中的\(j\), 只有和为\(l\)的下标有奇数组,才能保证\(b_l\)组中一定有一组下标为\((j, j)\), 此时才能保证一定有\(i+k=2j\), 即存在等距下标.
(b)
在(a)的基础上, 只需遍历\(B(x)\)的系数, 如果\(b_l\)为大于等于3的奇数, 则最终结果需要加\(\lfloor \frac{b_l}{2} \rfloor\).
未完待续...
快速傅里叶变换应用(FFT Applications)的更多相关文章
- 【知识总结】快速傅里叶变换(FFT)
这可能是我第五次学FFT了--菜哭qwq 先给出一些个人认为非常优秀的参考资料: 一小时学会快速傅里叶变换(Fast Fourier Transform) - 知乎 小学生都能看懂的FFT!!! - ...
- 快速傅里叶变换(FFT)略解
前言 如果我们能用一种时间上比 \(O(n^2)\) 更优秀的方法来计算大整数(函数)的乘法,那就好了.快速傅里叶变换(FFT) 可以帮我们在 \(O(n\log n)\) 的时间内解决问题. 函数乘 ...
- OI中的快速傅里叶变换(FFT)
快速傅里叶变换(FFT) ---- LLpp ...
- 【数学】快速傅里叶变换(FFT)
快速傅里叶变换(FFT) FFT 是之前学的,现在过了比较久的时间,终于打算在回顾的时候系统地整理一篇笔记,有写错的部分请指出来啊 qwq. 卷积 卷积.旋积或褶积(英语:Convolution)是通 ...
- 算法学习笔记(17): 快速傅里叶变换(FFT)
快速傅里叶变换(FFT) 有趣啊,都已经到NOI的难度了,救命 首先,我们先讲述一下前置知识.已经明白的读者请移步后文 虚数 定义:\(z = a + bi\),其中 \(a, b \in R\ \ ...
- 快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...
- 快速傅里叶变换(FFT)学习笔记(未完待续)
目录 参考资料 FFT 吹水 例题 普通做法 更高大尚的做法 定义与一部分性质 系数表达式 点值表达式 点值相乘??? 卷积 复数 单位根 DFT IDFT 蝴蝶迭代优化 单位根求法 实现.细节与小优 ...
- 快速傅里叶变换(FFT)随笔
终于学会了FFT,水一篇随笔记录一下 前置知识网上一大堆,这里就不多赘述了,直接切入正题 01 介绍FFT 这里仅指出FFT在竞赛中的一般应用,即优化多项式乘法 一般情况下,计算两个规模为$n$的多项 ...
- 「算法笔记」快速傅里叶变换(FFT)
一.引入 首先,定义多项式的形式为 \(f(x)=\sum_{i=0}^n a_ix^i\),其中 \(a_i\) 为系数,\(n\) 为次数,这种表示方法称为"系数表示法",一个 ...
- 快速傅里叶变换(FFT)
一.FFT的意义 DFT虽然实现了FT的计算机计算,但是计算量大,不适合实时的数字信号处理.FFT算法的出现,使DFT的计算效率更高,速度更快. 二.FFT与DFT的关系 从FT到DFT经过了数字角频 ...
随机推荐
- 安装ELK(Elasticsearch、Kibana、Logstash)
1.首先准备两台centos7虚拟机(关闭防火墙)(到步骤3为止都是两台虚拟机都要准备的) 2.传入安装包 3.解压ELK.进入解压后ELK文件.解压jdk文件 4.在ip为41的虚拟机上安装Elas ...
- java中list对象不同属性去重合并
需求:将list中对象的不同属性对应的值去重后,赋值给另一个属性! 实现效果如下图:
- PHP Redis 基本命令
连接到 redis 服务 //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379);//查看服务是否运行 ...
- 执行Maven的test命令报错
参考网址:https://blog.csdn.net/weixin_46688566/article/details/126470742 解决方案 在pom.xml文件中加入以下依赖: <plu ...
- centos7.2 64位安装php7.2.12
1 安装php所需要的扩展 yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel curl curl ...
- L0范式、L1范式、L2范式解释通俗版
L0范数是指向量中非0的元素的个数.(L0范数很难优化求解) L1范数是指向量中各个元素绝对值之和 L2范数是指向量各元素的平方和然后求平方根 L1范数可以进行特征选择,即让特征的系数变为0. L2范 ...
- springmvc接口访问流程排查
首先找到webapp下面的web.xml文件: 检查前端控制器: 并注意contextConfigLocation配置的springmvc的配置文件路径: 接着找到springmvc配置文件路径,如果 ...
- UDP与TCP ---FundeBug
UDP 面向无连接 首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了.并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作. 具体来说就是: ...
- Javaheima20
Java 学习内容 单元测试 反射 注解 动态代理 开发好的系统中存在很多的方法,如和对这些方法的正确性进行测试 如何在程序运行时取得到Class对象,然后取获得Class中的每个成分 注解是什么,具 ...
- javaheima15 递归
Java File 作用 创建对象定位文件,可以删除.获取文件信息等.但不能读写文件内容. 构建对象的方式 File file = new File("文件/文件/绝对路径/相对路径&quo ...