C++之易混淆知识点三---算法分析
最近复习算法,感到有一丝丝忘记的困惑,赶紧记下来。。。
一、分治法
分治法的思想就是“分而治之”,很明显就是将规模比较庞大、复杂的问题进行分治,然后得到多个小模块,最好这些小模块之间是独立的,如果这些小模块之间耦合性比较大的话,需要多次计算重复的问题,从而出现了冗余,这种情况下,可以利用动态规划法,保存这些小模块问题的解,这样就避免了多次重复计算相同问题的解了。分治法的一般解题步骤包括:

根据分治法的解题思想,我们可以看到这其中需要用到递归。以斐波那契函数为例:

现在要求计算,则使用分治法解题时,得到下面的过程。

例如:使用分治法求解最大子段和问题。如下图所示:

//分治法求解
int DivideCom(int a[],int left,int right)
{
int maxsum=;
if (left==right) //直接求解
{
if (a[left]>)
{
maxsum=a[left];
}
else maxsum=;
}
else
{
int mid=(left+right)/;
int leftsum=DivideCom(a,left,mid);
int rightsum=DivideCom(a,mid+,right); int lefts=,rights=,temp=;
for (int i=mid;i>=left;--i)
{
temp+=a[i];
if (temp>lefts)
{
lefts=temp;
}
}
for (i=mid+;i<=right;++i)
{
temp+=a[i];
if (temp>rights)
{
rights=temp;
}
}
maxsum=lefts+rights;
if (leftsum>maxsum)
{
maxsum=leftsum;
}
if (rightsum>maxsum)
{
maxsum=rightsum;
}
} return maxsum;
}
二、动态规划法
动态规划法最初就解决数学最优化问题的工具,现在计算机领域中多用来解决多阶段决策问题。动态规划法解题的时候也是对原来大问题进行划分,得到多个可以相互重叠的子问题,对应于问题求解过程中的多个决策阶段,然后计算每个阶段的解,并保存下来,在后面遇到需要重复计算的问题时可以查表直接使用前面已经计算过的值,这一点有别于分治法。以上述的斐波那契函数为例,在使用动态规划求解的时候,不是重复求解系那个天表达式值,而是将每一次求解的值存入一个表格中,如下表:
|
n |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
F(n) |
0 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
动态规划的一般解题步骤包括:

例如:使用动态规划法求解最大子段和问题。假设对序列A={a1,a2,a3,......,an}求解最大子段和,则求解的动态规划函数为:

//动态规划法
int DynamicP(int a[],int n)
{
int maxsum=;
int *b=(int*)malloc(n*sizeof(int)); maxsum=b[]=a[];
for (int i=;i<n;i++)
{
if (b[i-]>)
{
b[i]=b[i-]+a[i];
}
else
b[i]=a[i]; if (maxsum<b[i])
{
maxsum=b[i];
}
} delete[] b;
return maxsum;
}
三、贪心法
贪心算法也是对所求的问题进行分解,得到多个较为简单的局部最优选择,通过求解每一步局部最优选择的解,最后得到问题的最终解。贪心法在求解局部最优解时,只根据当前的判断进行选择,不管将来的结果,即属于局部最优选择,所以贪心法得到的结果不一定是整体最优解,但却是获得近似最优解的好方法,而动态规划中,每一步所做出的选择或者决策往往依赖于相关子问题的解,只有在求得相关子问题的解以后,才能做出选择。还有一点:动态规划是自底向上求解问题的解,而贪心法是自顶向下求解。
贪心法的一般求解过程如下:
Greedy(C) //C是问题的输入集合,即候选集合
{
S={}; //S是解集合,初始解集合为空
while(not solution(S)) //集合S没有构成问题的解
{
X=select(S); //在候选集合C中进行贪心选择,即选择局部最优
if feasible(S,X) //判断解集合中加入X是否可行
{
S=S+{X};
}
C=C-{X};
}
}
C++之易混淆知识点三---算法分析的更多相关文章
- Java-web易混淆知识点整理
Java-web易混淆知识点 post和get区别 post: 数据不会显示在地址栏 安全 大小无限制 可以提交二进制文件 get: 数据显示在地址栏 不安全 get方式提交有大小限制(约4kb) 相 ...
- php易混淆知识点
一.define(“constant”, “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...
- C++易混淆知识点整理
// 1 /////////////////////////////////////////////////////////////////////// // 常量指针:,指针可修改,变量不可修改(只 ...
- C语言之数组与指针的易混淆知识点
一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...
- CSS易混淆知识点总结与分享-定位与布局
CSS定位有四种模式:static.relative.absolute.fixed,其它static是默认值,下面分别讲解下各自的特点: static:静态定位,处于动态布局流中,按照页面中的各元素先 ...
- 【PMP】易混淆知识点
一.混淆概念 德尔菲技术 德尔菲技术是组织专家达成一致意见的一种方法.项目专家匿名参与其中.组织者使用调查问卷就重要的项目议题征询意见,然后对专家的答卷进行归纳,并把结果反馈给专家做进一步评论.这个过 ...
- C++之易混淆知识点五
一.解析类继承中父类与子类之间成员的访问可见度: 外部可见度:指的是被子类继承的父类成员在子类的外部访问控制度,有protected.public.private. 内部可见度:指的是被子类继承的父类 ...
- C++之易混淆知识点四---虚函数与虚继承
C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数 ...
- C++之易混淆知识点二
1.数据抽象与封装 数据抽象是一种接口和实现相分离的编程技术,设计者关心的是如何实现这些接口,而使用者仅仅知道这些接口,抽象地考虑这些接口做什么的就可以了,不必去考虑如何实现这一层次. 封装是将低层次 ...
随机推荐
- extjs 与html相结合 自定义
http://skirtlesden.com/articles/html-and-extjs-components
- 爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二)
先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 不多说,直接上代码. 编写代码 运行 <!DOCTYPE html><html><head& ...
- c# CacheHelper缓存帮助类
一.开篇 主要功能:改善程序性能.服务器的响应速度,尤其是当数据的处理过程变得复杂以及访问量变大时,变得比较明显.有些数据并非时刻在发生变化,如果我们可以将一些变化不频繁的数据的最终计算结果(包括页面 ...
- LinrFont UWP 字体预览工具下载
Windows 10 用户 购买 https://www.microsoft.com/zh-cn/p/linrfont/9nkh5mlvt819
- 页面定制CSS代码初探(一):页面变宽 文本自动换行 图片按比缩放
初识博客 初写博客,先在设置里选了个喜欢的模板 第一眼就爱上了呢!那极简的风格,我喜欢!!但是,应用后,却发现... 纳尼!模板上右侧那张漂亮的图片呢?!我的怎么什么都没有.没有图片好难看啊,瞬间无爱 ...
- 发个ZKW线段树板子测试一下代码高亮
是我,Long time no see --Jim 先安利 Wolves 歌手:Madilyn Bailey http://music.163.com/song/524149464 ...
- BZOJ 2329/2209 [HNOI2011]括号修复 (splay)
题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足 ...
- Cannot find a free socket for the debugger
win + R 输入cmd netsh winsock reset 重启电脑,重启MyEclipse,可以正常Debug了. 部分电脑可以=============================== ...
- 【转】python 关键字
转自:http://www.cnblogs.com/hongten/p/hongten_python_keywords.html python3.3.2中的关键字如下: The following i ...
- 解决locate无法使用的问题
使用yum安装,locate的安装包名为mlocate 安装: yum -y install mlocate 更新: updatedb 无法使用:先下载