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

一、分治法

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

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

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

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

//分治法求解
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. 将字符串序列化Object格式

    using Newtonsoft.Json; 首先引用  Newtonsoft.Json; 定义一个字符串 string str = "[{'ID':8.0,'PAGEID':201.0,' ...

  2. 一个登录页面的spring 逻辑过程

    1.首先用户访问login.jsp 2.用户在登录页面输入用户名/密码,提交表单到服务器,Spring根据配置调用LoginController控制器响应登录请求(关键) 3.LoginControl ...

  3. HDU4920 矩阵乘法

    嗯嗯 就算是水题吧. (缩完行就15行) 题意:两个n*n的矩阵相乘(n<=800),结果对3取模 思路:先对3取模,所以两个矩阵里面会出现很多0,所以可以先枚举一个矩阵,只有当该位置不是0的时 ...

  4. 前端面试---常见的web安全及防护原理

    一.常见的web安全及防护原理 1.sql注入原理 就是通过把sql命令插入到web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 防护,总的来说有以下几点: 1. ...

  5. javascript中封装scoll()方法

    function scroll() { var scrollTop = window.pageYOffset || document.documentElement.scrollTop || docu ...

  6. Zxing实现在线二维码生成程序

    关于zxing的使用请参考笔者的另外一篇博文:Java二维码生成与解码工具Zxing使用 首先我们来看看效果: 在文本框中输入内容后点击生成二维码按钮,应用自动对文本框中的内容进行编码,生成二维码图片 ...

  7. StatusBarUtils工具类

    import android.app.Activity; import android.app.Dialog; import android.content.Context; import andro ...

  8. 再生龙恢复分区后修复引导或debian linux修复引导 三部曲

    先参考 sudo -imkdir /mntmount /dev/sda1 /mntgrub-install --force --no-floppy --root-directory=/mnt /dev ...

  9. @DateTimeFormat无效原因

    一般都是使用@DateTimeFormat把传给后台的时间字符串转成Date,使用@JsonFormat把后台传出的Date转成时间字符串,但是@DateTimeFormat只会在类似@Request ...

  10. vuex存储和本地存储的区别

    1.实质的区别 vuex存的是状态,存储在内存,localstorage是浏览器提供的接口,让你存的是文件,以文件的形式存储在本地 2.应用场景 vuex用于组件之间的传值,localstorage则 ...