浅谈设计算法的思想

标准的分治策略

注:标准的分治策略的定义里面就包含的递归;

解决问题的步骤

    将问题分解为若干小问题,且每个小问题与大问题同型;

    递归解决这些小问题;

    将子问题的解答合并,获得大问题的解答;    

计算效率的方法

  递归表达式 —将抽象的表达式用图形的方式展开,便于理解—>递归树

    替换解法:先猜一个答案,归纳法验证,解决表达式中的常数;

    大师解法:将抽象的递归表达式进行展开,分解合并;将其分为两部分:比较两者的大小(大于,等于,小于,无法比较);  

典型问题: 求乘方运算,矩阵乘法,斐波那契序列,VLSI布线;

 

动态规划思想:

主要目的:优化,即:以最优方式解决问题;

与分治策略的不同点

虽也将大问题分解为小问题,且小问题中有许多是重复的,这样有表格存储结果,省的重复计算,从而提高效率;动态规划是对分治思想的一种改善,在

发现分解出来的子问题有重叠时,使用自底向上的策略避免重复计算;

注:动态规划的英文叫Dynamic Programming,其中programing指的是表格查询法;

分治策略解决问题的步骤

      分析出最优解决方案的结构

  递归定义这个方案

  由底至上构建方案;

典型问题: 流水线问题,最长公共子序列,最优二叉搜索树

动态规划和线性规划、非线性规划(静态规划)的关系:

动态规划的核心是找出一个问题包含的子问题及其表现形式;

动态规划比静态规划更容易获得最优解;

动态规划可以得到一组最优解(原问题及子问题的最优解),而非线性规划只能得到全过程的一个最优解;

注:在特定的条件下,动态规划和静态规划是可以相互转换的;

 

贪婪选择思想: 只考虑眼前,每一步都最优,通过局部最优达到全局最优;

     最小生成树:

         Kruskal算法:选边

         Prime算法:选点

     霍夫曼树和编码:

     霍夫曼编码:按照符号出现的频率编码;频率越高,其编码越短;频率越低,其编码越长;

     霍夫曼树:为了方便生成霍夫曼编码,构建一棵带权重的总长为最小的树,即:将频率高的结点置于离树根较近的位置上;

将“树”转换为“码”:将树中所有左边分支赋为0,右边分支赋为1,符号的编码为根到达它所经过的路径标号;

 

标准分治、动态规划、贪婪选择比较:

 

标准分治

动态规划

贪婪选择

问题类型

通用问题

优化问题

优化问题

子问题结构

每个子问题不同

很多子问题重复

只有一个子问题

子问题数

全部都要解决

全部都要解决

只需解决一个

选择与求解次序

先选择后解决子问题

先解决子问题后选择

先选择后解决子问题

 

随机化思想:

目的

1.为了防止最差结果出现;

2.解答我们不能确定性解答的问题;

拉斯维加斯算法:为第一种目的而设计的算法;

蒙特卡罗算法:为第二种目的而设计的算法;

拉斯维加斯保障计算结果的正确性,但不保障算法的时间效率;

蒙特卡罗算法保障了时间效率,但不保障计算结果的正确性;

经典问题:素性测试,矩阵乘积验证器,随机化最小生成树,随机数的生成;

posted @ 2017-03-28 21:14  简笔话_Golden  阅读(449)  评论(0编辑  收藏  举报