Fine-Grained学习笔记(1):卷积,FFT与花式字符串匹配
Fine-Grained,在算法复杂度理论中特指,对各类算法的复杂度,进行(相较于P与NP的粗粒度分类的)细粒度分类,例如,证明某问题存在
本系列主要参考University of Illinois at Urbana-Champaign的Timothy M. Chan在2022年秋季的课程,该课程的课堂笔记是公开的:CS 598 TMC, Fall 2022 (illinois.edu)
问题:卷积
给定长度为
等价问题:
给定两个多项式
计算
朴素的算法:暴力,复杂度为
有无更好的办法?
Karatsuba算法(1960)
热身:
当
这种方法需要4做4次乘法,但如果考虑
便只需要做三次乘法.
那么对于任意
记
Toom&Cook算法(1963)
热身:考虑
给定
共计需要9次乘法
更优的方法:令
实际上,若令
以高斯消元即可求得
对于任意的
推广的分治法
总结上述两个算法,可以得到规律:规模为
Cooley&Tukey 算法(快速傅立叶变换,FFT)
略
博主注:FFT虽然能够将卷积的复杂度降低到
应用: 位大整数乘法
应用:3SUM问题(元素限制为有限整数)
记
记
给定
朴素算法:
暴力,O(n^3)
尺取法:
稍微好一点,将
卷积法:
定义函数
计算
应用:带通配符的字符串匹配
记
朴素算法:
暴力,
KMP算法:
预处理模式串,寻找每个前缀字符串的后缀字符串,用于在失配发生时,跳过文本串中没必要匹配的部分.复杂度
将字母表
卷积法:
考虑如下的匹配函数序列:
其意义是,若模式串第
接下来将该表达式展开
将字符串
可以看出是三次卷积.
时间复杂度
时间复杂度还可以优化到
应用:字符串模糊匹配
定义:字符串的汉明距离
字符串
给定模式串
朴素算法:
暴力,
算法1:
定义函数序列
如何计算这个函数呢?对于所有的
用
计算完全部
总时间复杂度
但当
Abrahamson算法(1987):
思路:将字母表中元素按出现次数高低进行分类
记
这样便保证了
1.高频情况
对于每个
2.低频情况
对于所有
总运行时间
注:
Amir-Lewenstein-Porat(2004)
Gawrychowski-Vzanski(2018)
接近于
应用:子集和问题
对于集合
给定由
暴力枚举+尺取:
将
DP(动态规划):
时间复杂度
一个用于求解可多次选取的子集和问题的思路:
观察:如果
那么
这又是一个卷积的形式,以此方法对原问题进行分治,总时间复杂度为
但此方法对于一般的(不允许重复选取元素的)子集和问题无效
Bringmann算法(2017):
随机化地用于求解一般子集和问题的算法
引理1:
假定待求集合
证明:
记
考虑如下事实:将
那么,考虑将
对于给定的
那么该序列可以通过如下方式求得:
这是一个对长度为
代入
注意,该方法能否得出正确结果依赖于对于
引理2:
引理1中的算法可优化至
证明:
考虑如下事实:把
随机地将
定义
该序列可以通过如下方式求得:
这是一个对长度为
记求解子集个数为
取
由引理1,2推导出的算法:
对于所有的
对于这
Jin&Wu算法(2019):
想法:多项式
求解子集和问题等同于求解
记
上式可写成
考虑数学分析知识中的泰勒展开:
对于每个
总运行时间
但直接计算这个式子的话是会出现分数项的,考虑随机选取质数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?