最近复习算法,感到有一丝丝忘记的困惑,赶紧记下来。。。

一、分治法

分治法的思想就是“分而治之”,很明显就是将规模比较庞大、复杂的问题进行分治,然后得到多个小模块,最好这些小模块之间是独立的,如果这些小模块之间耦合性比较大的话,需要多次计算重复的问题,从而出现了冗余,这种情况下,可以利用动态规划法,保存这些小模块问题的解,这样就避免了多次重复计算相同问题的解了。分治法的一般解题步骤包括:

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

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

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

//分治法求解
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++之易混淆知识点三---算法分析的更多相关文章

  1. Java-web易混淆知识点整理

    Java-web易混淆知识点 post和get区别 post: 数据不会显示在地址栏 安全 大小无限制 可以提交二进制文件 get: 数据显示在地址栏 不安全 get方式提交有大小限制(约4kb) 相 ...

  2. php易混淆知识点

    一.define(“constant”,  “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...

  3. C++易混淆知识点整理

    // 1 /////////////////////////////////////////////////////////////////////// // 常量指针:,指针可修改,变量不可修改(只 ...

  4. C语言之数组与指针的易混淆知识点

    一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...

  5. CSS易混淆知识点总结与分享-定位与布局

    CSS定位有四种模式:static.relative.absolute.fixed,其它static是默认值,下面分别讲解下各自的特点: static:静态定位,处于动态布局流中,按照页面中的各元素先 ...

  6. 【PMP】易混淆知识点

    一.混淆概念 德尔菲技术 德尔菲技术是组织专家达成一致意见的一种方法.项目专家匿名参与其中.组织者使用调查问卷就重要的项目议题征询意见,然后对专家的答卷进行归纳,并把结果反馈给专家做进一步评论.这个过 ...

  7. C++之易混淆知识点五

    一.解析类继承中父类与子类之间成员的访问可见度: 外部可见度:指的是被子类继承的父类成员在子类的外部访问控制度,有protected.public.private. 内部可见度:指的是被子类继承的父类 ...

  8. C++之易混淆知识点四---虚函数与虚继承

    C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数 ...

  9. C++之易混淆知识点二

    1.数据抽象与封装 数据抽象是一种接口和实现相分离的编程技术,设计者关心的是如何实现这些接口,而使用者仅仅知道这些接口,抽象地考虑这些接口做什么的就可以了,不必去考虑如何实现这一层次. 封装是将低层次 ...

随机推荐

  1. ElementUI 表格表头筛选框的高度设置,超出一定高度,显示滚动条

    最近项目发现一个问题table表头筛选的时候,由于筛选内容过多导致弹出框超出屏幕,并且无法滚动,应急的办法是缩小浏览器显示比例让更多内容显示

  2. 理解Cookie与Session

    HTTP本身是无状态的. 这符合HTTP协议设计的目的.客户端只是简单地向服务器请求某种资源.两者都没有必须记录彼此过去的行为,每一次请求之间都是独立的. 为了保存状态.在客户端使用Cookie,在S ...

  3. Android跳转到系统Wifi界面的方式

    第一种 Intent intent = new Intent(); intent.setAction("android.net.wifi.PICK_WIFI_NETWORK"); ...

  4. (转)硬盘结构,主引导记录MBR,硬盘分区表DPT,主分区、扩展分区和逻辑分区,电脑启动过程

    硬盘结构硬盘有很多盘片组成,每个盘片的每个面都有一个读写磁头.如果有N个盘片.就有2N个面,对应2N个磁头(Heads),从0.1.2开始编号.每个盘片的半径均为固定值R的同心圆再逻辑上形成了一个以电 ...

  5. Unity 指定区域随机实例化预制体Prefab 代码

    using UnityEngine; public class NewBehaviourScript : MonoBehaviour { public GameObject prefab; void ...

  6. [分享]前端javascript插件(均开源)

    记录并分享一些自己使用过的插件,便于以后有相应的功能需要使用可以及时想到. 1:数字插件countUp.js 功能:用于动态显示数字的增加和减少 项目github地址:http://inorganik ...

  7. failed to push some refs to 'git@github.com:RocsSun/mytest.git

    Git推送到GitHub仓库失败 使用Git将文件推送至GitHub的远程仓库时,报错failed to push some refs to 'git@github.com:RocsSun/mytes ...

  8. Job for mysqld.service failed because the control process exited with error code

    启动MySQL时抛出: Job for mysqld.service failed because the control process exited with error code. See &q ...

  9. C#RichTextBox复制并跳转指定行

    方法一: rTxt.Focus(); //设置文本框中选定的文本起始点 为 指定行数第一个字符的索引 rTxt.SelectionStart = rTxt.GetFirstCharIndexFromL ...

  10. [USACO18JAN] Cow at Large G (dfs)

    题目大意:有一只狐狸从给定的S点开始逃跑(出发),向叶节点移动以逃离这棵树,叶节点可能出现农民去抓捕狐狸,当农民和狐狸出现在同一个节点的时候,狐狸会被抓住,农民和狐狸移动速度相同,求抓捕狐狸所需要的最 ...