Berlekamp-Massey算法学习笔记
Berlekamp-Massey算法
很久之前就听说过这个算法,当时六校联考的时候Day1T1是一道很有意思的递推,神仙zzx不会做于是就拿BM算法艹出了递推式Orzzzzzzzzzzx
我就不详细说了,只记一下自己感觉比较难理解的地方
设\(r(m)\)表示序列的递推式且长度为\(m\)
\(f(r, i)\)表示\(\sum_{j = 1}^m r_j * a[i - j]\)
\(\delta(r, i)\)表示\(a[i] - f(r, i)\)
\(fail_i\)表示第\(i\)个递推式出错的位置
对于某一个位置\(i\),如果我们求出的\(\delta(r, i) \not = 0\),这时候我们需要构造一个递推式\(r'(m')\),满足\(\forall j \in [m' + 1, i - 1] f(r', j) = 0\)且\(f(r, i) = \delta(r, i)\)
这样我们令\(r = r + r'\)就得到新位置的递推式了
\(r'\)可以这么构造
设\(mul = \frac{\delta(r, i)}{\delta(r, fail_{cnt - 1})}\)
那么\(r' = \{0, 0, 0 \dots, 0, mul, -mul * R_{cnt - 1} \}\)
\(0\)的个数为\(i - fail_{cnt - 1} - 1\)
至于为什么这么构造是对的,我思考了挺长时间,简单的证明一下
首先对于\(\forall j \in [m' + 1, i - 1]\), \(\delta(r', j) = 0\)
仔细想了想,,发现自己并不会证。。如果哪位大佬会的话可以教教本蒟蒻
感性理解就是因为\(r\)在\([1, M]\)处满足任意位置为\(0\),然后右移一下还满足?。。
至于为什么\(f(r', i) = \delta(r, i)\)
可以这么考虑,前\(i - fail_{cnt - 1} - 1\)个位置产生的贡献为\(0\)
\(mul\)产生的贡献为\(mul * a_{fail_{cnt - 1}}\)
\(-mul * R_{cnt - 1}\)产生的贡献为\(-mul * (a[fail_{cnt - 1}] - \delta(r, fail_{cnt - 1]})\)
合并同类项后可以得到\(mul * \delta(r, fail_{cnt - 1}) = \delta(r, i)\)
代码如下
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
const double eps = 1e-8;
int cnt, fail[MAXN];
double val[MAXN], delta[MAXN];
vector <double> ans[MAXN];
int main() {
int N; scanf("%d", &N);
for (int i = 1; i <= N; i++) scanf("%lf", &val[i]);
for (int i = 1; i <= N; i++) {
double tmp = val[i];
for (int j = 0; j < ans[cnt].size(); j++)
tmp -= ans[cnt][j] * val[i - j - 1];
delta[i] = tmp;
if (fabs(tmp) <= eps) continue;
fail[cnt] = i;
if (cnt == 0) {
ans[++cnt].resize(i);
continue;
}
double mul = delta[i] / delta[fail[cnt - 1]];
cnt++; ans[cnt].resize(i - fail[cnt - 2] - 1);
ans[cnt].push_back(mul);
for (int j = 0; j < ans[cnt - 2].size(); j++)
ans[cnt].push_back(ans[cnt - 2][j] * -mul);
if (ans[cnt].size() < ans[cnt - 1].size()) ans[cnt].resize(ans[cnt - 1].size());
for (int j = 0; j < ans[cnt - 1].size(); j++)
ans[cnt][j] += ans[cnt - 1][j];
}
for (int i = 0; i < ans[cnt].size(); i++)
cout << ans[cnt][i] << ' ';
return 0;
}
Berlekamp-Massey算法学习笔记的更多相关文章
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
- Johnson算法学习笔记
\(Johnson\)算法学习笔记. 在最短路的学习中,我们曾学习了三种最短路的算法,\(Bellman-Ford\)算法及其队列优化\(SPFA\)算法,\(Dijkstra\)算法.这些算法可以快 ...
- 某科学的PID算法学习笔记
最近,在某社团的要求下,自学了PID算法.学完后,深切地感受到PID算法之强大.PID算法应用广泛,比如加热器.平衡车.无人机等等,是自动控制理论中比较容易理解但十分重要的算法. 下面是博主学习过程中 ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- 算法学习笔记——sort 和 qsort 提供的快速排序
这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...
- R语言实现关联规则与推荐算法(学习笔记)
R语言实现关联规则 笔者前言:以前在网上遇到很多很好的关联规则的案例,最近看到一个更好的,于是便学习一下,写个学习笔记. 1 1 0 0 2 1 1 0 0 3 1 1 0 1 4 0 0 0 0 5 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- SPFA算法学习笔记
一.理论准备 为了学习网络流,先水一道spfa. SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在 ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
随机推荐
- 6. ASP.NET MVC 5.0 中的HTML Helper【HTML 帮助类】
这篇文章,我将带领大家学习HTML Helper.[PS:上一篇-->5.ASP.NET MVC 中的Area[区域]是什么] HTML Helpers是用来创建HTML标签进而创建HTML控件 ...
- 【spring源码分析】IOC容器初始化——查漏补缺(一)
前言:在[spring源码分析]IOC容器初始化(十一)中提到了初始化bean的三个步骤: 激活Aware方法. 后置处理器应用(before/after). 激活自定义的init方法. 这里我们就来 ...
- 使用Lucene-Spatial实现集成地理位置的全文检索
Lucene通过Spatial包提供了对基于地理位置的全文检索的支持,最典型的应用场景就是:“搜索中关村附近1公里内的火锅店,并按远近排序”.使用Lucene-Spatial添加对地理位置的支持,和之 ...
- 微信小程序:scroll滑到指定位置
概述 这是我开发微信小程序遇到的坑中的一个,专门记录下来,供以后开发时参考,相信对其他人也有用. scroll滑到指定位置,有两种解决方案,一种是用scroll-view标签,另一种是用wx.page ...
- Scala + IntelliJ IDEA
学习路上的新起点:大数据Scala + Spark +(HDFS + HBase),本文主要介绍下Scala的基本语法和用法吧.最后再简单介绍一种Java开发工具IntelliJ IDEA的使用. S ...
- Linux - 创建定时任务
crontab命令 用来创建周期性定时任务 crontab {-l|-r|-e} -l 显示当前的 crontab -r 删除当前的 crontab -e 使用编辑器编辑当前 crontab 文件 输 ...
- 详谈再论JAVA获取本机IP地址
首先,你如果搜索“JAVA获取本机IP地址”,基本上搜到的资料全是无用的.比如这篇:http://www.cnblogs.com/zrui-xyu/p/5039551.html实际上的代码在复杂环境下 ...
- 2-4 完整Todolist案例
在2-3 的基础上继续,综合前面的Todolist编写一个完整的案例,实现基本的输入内容,添加内容,点击删除内容 稍微讲解54行代码 splice()的用法
- python 特定份数的数据概率统计(原创)
使用numpy模块中的histogram函数模块 Histogram(a,bins=10,range=None,normed=False,weights=None)其中, a是保存待统计数据的数组, ...
- msysGit在GitHub代码托管
(转:http://www.cnblogs.com/xing901022/p/4388190.html) 代码的管理,在日常开发中是很重要的环节,程序员的修炼三部曲——版本控制,单元测试,项目自动化. ...