算法研究(四) 一维模式识别
来源:互联网 发布:.net程序员项目经验 编辑:程序博客网 时间:2024/05/11 16:05
题目:这是一个一维模式识别问题,问题的输入是一个具有n个浮点数据字的向量x,其输出是在输入的任何相邻子向量中找出的最大和,例如,如果输入向量包含下面10个元素:
图中显示了找出的子向量。
按照时间复杂度由大到小,以下给出解此题的四种算法:
• 算法一:三重循环比较 O(n3)
伪码如下:
此算法最为直观,但也最为耗时,累加accumulate的复杂度为n,加上外面的两重循环,其复杂度为O(n3)。
• 算法二:两重循环(使用累加) O(n2)
通过对前一个子向量求出的和的利用,我们轻易的将时间复杂度降低到了O(n2)。
• 算法三:分治法 O(nlogn)
我们把向量分成两段,那么该向量的最大子向量要么出现在a段或是b段,要么出现在a,b的中间,如图所示,对a,b进行递归,得出ma, mb, 计算出mc,返回他们中的最大值。
容易看出此算法的复杂度为O(nlogn)。
• 算法四:线性扫描 O(n)
如果我们仔细分析该问题的特点,实际上会发现存在一个复杂度只有O(n)的扫描算法。
是不是很神奇,呵呵~~
按照时间复杂度由大到小,以下给出解此题的四种算法:
• 算法一:三重循环比较 O(n3)
伪码如下:
- max = 0;
- for (i = 0; i < n; ++i) {
- for (j = 1; j < n; ++j) {
- sum = accumulate(data, i, j);
- if max < sum
- max = sum;
- }
- }
此算法最为直观,但也最为耗时,累加accumulate的复杂度为n,加上外面的两重循环,其复杂度为O(n3)。
• 算法二:两重循环(使用累加) O(n2)
伪码如下:
- max = 0;
- for (i = 0; i < n; ++i) {
- sum = 0;
- for (j = 1; j < n; ++j) {
- sum += data[j - 1];
- if max < sum
- max = sum;
- }
- }
• 算法三:分治法 O(nlogn)
我们把向量分成两段,那么该向量的最大子向量要么出现在a段或是b段,要么出现在a,b的中间,如图所示,对a,b进行递归,得出ma, mb, 计算出mc,返回他们中的最大值。
- double func(double[] data, int i, int j) {
- if (i >= j)
- return 0;
- middle = (i + j) / 2;
- ma = func(data, i, middle);
- mb = func(data, middle, j);
- lmax = 0;
- sum = 0;
- for (k = m - 1; k >= i; --k) {
- sum += data[k];
- lmax = max(lmax, sum);
- }
- rmax = 0;
- sum = 0;
- for (k = m; k < j; ++k) {
- sum += data[k];
- rmax = max(rmax, sum);
- }
- mc = lmax + rmax;
- return max(ma, mb, mc);
- }
容易看出此算法的复杂度为O(nlogn)。
• 算法四:线性扫描 O(n)
如果我们仔细分析该问题的特点,实际上会发现存在一个复杂度只有O(n)的扫描算法。
- maxvalue = 0;
- maxendvalue = 0;
- for (i = 0; i < n; ++i) {
- maxendvalue = max(maxendvalue + data[i], 0);
- maxvalue = max(maxvalue, maxendvalue);
- }
- 算法研究(四) 一维模式识别
- 算法研究(四) 一维模式识别
- 模式识别几何分类算法实现(一)
- 模式识别中机器学习算法研究
- 搜索引擎算法研究(四)
- 【模式识别】模式识别的概述(一)
- 搜索引擎算法研究(一)
- KMP算法研究(一)
- FCM算法研究(一)
- 模式识别(聚类分析算法))
- 模式识别(一):概念介绍
- 模式识别学习笔记(一)
- 模式识别课程笔记(一)
- 模式识别:k-均值聚类算法的研究与实现
- 模式识别学习笔记(四)---聚类算法的技术方案
- 模式识别学习笔记(一)模式识别初认识
- 模式识别(四):Fisher 线性分析
- 算法面试题(一)-- 统计学习与模式识别面试题
- spring mvc 异常统一处理方式
- [置顶] 总有一天你将破蛹而出
- Ubuntu系统死机啦怎么办?(转载)
- 用NSArchiver和NSUnarchiver保存用户数据至文件
- Eclipse更改默认字符集 设置UTF-8
- 算法研究(四) 一维模式识别
- EHcache实例演示
- StarUML---推荐一款UML工具(很好很强大)
- RF射频PCB板布局布线经验总结
- 【openstack】Nova中的policy
- C/C++位域(Bit-fields)
- 力量本源-团队
- 数据结构——行编辑
- Linux内核 hlist_head/hlist_node结构解析