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.数据抽象与封装 数据抽象是一种接口和实现相分离的编程技术,设计者关心的是如何实现这些接口,而使用者仅仅知道这些接口,抽象地考虑这些接口做什么的就可以了,不必去考虑如何实现这一层次. 封装是将低层次 ...
随机推荐
- 第七章 用户输入和while 循环
7.1 创建多行字符串的方式: 01 prompt="if you tell me who you are, we can personalize the message you see.& ...
- UIPickerView的自定义视图
UIPickerView允许开发者对列表项进行任意定制 开发者只要实现UIPickerViewDelegate协议中的-pickerView:viewForRow:forComponent: reus ...
- Linux top命令简解
简介: top 命令是最流行的性能监视工具之一,它是一个优秀的交互式工具,用于监视性能.它提供系统整体性能,但报告进程信息才是 top 命令的长处. top 界面分为两个部份,光标上面部份显示关于系统 ...
- 杂文 | 金沙江创投朱啸虎谈微信小程序
我一直在想怎么去描述和朱啸虎的聊天. 最简单的开头一定是说“独角兽捕手朱啸虎”看好小程序了,这个赛道蕴含了许多无比巨大.充沛的机会,所以约到朱啸虎同学深聊这个赛道的创业.但是这样的开头太平,不好玩.事 ...
- sybase profile
# # Sybase Product Environment variables # SAP_JRE7_32="/opt/sybase/shared/SAPJRE-7_1_011_32BIT ...
- Paper阅读总结Day1
Paper阅读总结Day1 1.Convolutional Neural Networks For Facial Expression Recognition 文章思想 简单的一篇关于表情识别的文章, ...
- 怎样学CSS?
什么是CSS? CSS(Cascading Style Sheet,层叠样式表)是由W3C(万维网联盟)的CSS工作组创建和维护的.它是一种不需要编译,可直接由浏览器执行的标记性语言,用于控制Web页 ...
- 02操控奴隶——掌握它的语言“Python”
一 编程常识 1编程语言的发展史 程序员是计算机的主人,主人与奴隶沟通的介质是编程语言,编程语言从诞生到现在它经历了那几个阶段呢? 2 语言的特性: 3 初期的编程语言更多的是站在计算机的角度去设计编 ...
- 【转】python 关键字
转自:http://www.cnblogs.com/hongten/p/hongten_python_keywords.html python3.3.2中的关键字如下: The following i ...
- 【BZOJ 1486】 [HNOI2009]最小圈
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们可以只想那个均值最小的环. 我们不知道那个环由哪些边构成 但我们可以把每条边都减掉mid 那个环受到的影响是什么呢? 如果这个均 ...