随笔分类 - 算法设计与分析
1
摘要:概率算法 随机性(randomness)是偶然性的一种形式,是某一事件集合中的各个事件所表现出来的不确定性。产生某一随机性事件集合的过程,是一个不定因子不断产生的重复过程,但它可能遵循某个概率分布。 随机序列(random sequence),更确切的,应该叫做随机变量序列,也就是随机变量形成的序列
阅读全文
摘要:图的搜索算法小结 1.深度优先搜索与广度优先搜索算法有何区别 通常深度优先搜索法不全部保留结点,扩展完的结点从数据存储结构栈中弹出删去,这样,一般在数据栈中存储的结点数就是解空间树的深度,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。
阅读全文
摘要:分支限界法 基本思想 分支搜索法也是一种在问题解空间上进行尝试搜索算法。所谓“分支”是采用广度优先的策略,依次生成E-结点所有分支,也就是所有的儿子结点。和回溯法一样,在生成的节点中,抛弃那些不满足约束条件(或者说不可能导出最优可行解)的结点,其余节点加入活节点表。然后从表中选择一个节点作为下一个E
阅读全文
摘要:回 溯 法 回溯算法实际是一个类似枚举的搜索尝试方法,它的主题思想是在搜索尝试中找问题的解,当不满足求解条件就”回溯”返回,尝试别的路径。回溯算法是尝试搜索算法中最为基本的一种算法,其采用了一种“走不通就掉头”的思想,作为其控制结构。 【例1】八皇后问题模型建立 要在8*8的国际象棋棋盘中放八个皇后
阅读全文
摘要:深度优先搜索 深度优先遍历首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。 若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中
阅读全文
摘要:广度优先搜索 1.算法的基本思路 算法设计的基本步骤为: 1)确定图的存储方式; 2)图的遍历过程中的操作,其中包括为输出问题解而进行的存储操作; 3)输出问题的结论。 2.算法框架 从广度优先搜索定义可以看出活结点的扩展是按先来先处理的原则进行的,所以在算法中要用“队”来存储每个E-结点扩展出的活
阅读全文
摘要:图是一种限止最少的数据结构,因此更接近现实,实际问题中很多数据关系都可以抽象成图,相关问题则可利用图的基本算法进行求解,很早就有专门研究图的是一门数学学科“图论”;其中的计算问题包括图的搜索、路径问题、连通性问题、可平面性检验、着色问题、网络优化等。图论中的著名算法有:求最小生成树的Kruskal算
阅读全文
摘要:算法策略间的比较 算法策略和算法是有区别的,它们是算法设计中的两个方面,算法策略是面向问题的,算法是面向实现的;但二者又是不可分的,首先是通过算法策略才找出解决问题的算法,其次对于用不同算法求解的问题算法策略是自然不同的。 “贪婪算法” 这些策略求解的是最简单的一类问题,或者说是对问题要求最严格的算
阅读全文
摘要:动态规划 动态规划是用来解决多阶段决策过程最优化的一种数量方法。其特点在于,可以把困难的多阶段决策问题变换成一系列互相联系较容易的单阶段问题,解决了这一系列较容易的单阶段问题,也就解决了这个困难的多阶段决策问题。 多阶段决策问题: 是动态决策问题的一种特殊形式; 在多阶段决策过程中,系统的动态过程可
阅读全文
摘要:动态规划 在动态规划算法策略中,体现在它的决策不是线性的而是全面考虑不同的情况分别进行决策, 并通过多阶段决策来最终解决问题。在各个阶段采取决策后, 会不断决策出新的数据,直到找到最优解.每次决策依赖于当前状态, 又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义。所
阅读全文
摘要:贪婪算法 贪婪法又叫登山法, 它的根本思想是逐步到达山顶,即逐步获得最优解。贪婪算法没有固定的算法框架,算法设计的关键是贪婪策略的选择。一定要注意,选择的贪婪策略要具有无后向性。某状态以后的过程和不会影响以前的状态,只与当前状态或以前的状态有关,称这种特性为无后效性。 可绝对贪婪问题 【例1】键盘输
阅读全文
摘要:分治算法 1.算法设计思想 分治法求解问题的过程是,将整个问题分解成若干个小问题后分而治之。如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。 分治法的基本步骤在每一层递归上都有三个
阅读全文
摘要:蛮力法 蛮力法是基于计算机运算速度快这一特性,在解决问题时采取的一种“懒惰”的策略。这种策略不经过(或者说是经过很少的)思考,把问题的所有情况或所有过程交给计算机去一一尝试,从中找出问题的解。蛮力策略的应用很广,具体表现形式各异,数据结构课程中学习的:选择排序、冒泡排序、插入排序、顺序查找、朴素的字
阅读全文
摘要:迭代算法 迭代法(Iteration)也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。迭代算法一般用于数值计算。迭代法应该是我们早已熟悉的算法策略,程序设计语言课程中所学的累加、累乘都是迭代算法策略的基础应用。 利用迭代算法策略求解问题,设计工作主要有三步: 1)确定迭代模型 2)
阅读全文
摘要:很简单的例子: 已知有五个数,求前四个数与第五个数分 别相乘后的最大当数。给出两个算法分别如下: 以上两个算法基于的数学模型是不同的,一个算法先积再求最大值,另一个算法先求最大值再求积,求从上表可以看出,后一个算法的效率明显要高于前一个算法。 数学建模就是把现实世界中的实际问题加以提炼,抽象为数学模
阅读全文
摘要:【例1】一次考试,共考了五门课。统计五十个学生中至 少有三门课成绩高于90分的人数。 问题分析:若一个学生五门课的成绩分别记为:a1,a2,a3,a4,a5,则要表示有三门课成绩高于90分,有C35=10组关系逻辑表达式,每组三个关系表达式。无论书写还是运行效率都极低。但通过算法运算就能很简便地解决
阅读全文
摘要:常用的几种数据结构 数据的逻辑结构常分为四大类: (1)集合结构 (2)线性结构 (3)树形结构 (4)图结构(网结构) 存储结构可以分为:连续存储和链式存储。连续存储又可以分为:静态存储和动态存储 连续存储和链式存储比较 顺序存储的优点: (1) 方法简单,各种高级语言中都提供数组结构,容易实现。
阅读全文
摘要:循环设计中要注意算法的效率: 循环体的特点是:“以不变应万变”。 所谓“不变”是指循环体内运算的表现形式是不变的,而每次具体的执行内容却是不尽相同的。在循环体内用不变的运算表现形式去描述各种相似的重复运算。 【例1】求1/1!-1/3!+1/5!-1/7!+…+(-1)n+1/(2n-1)! 分析:
阅读全文
摘要:时间复杂度估算 因为: 算法=控制结构+原操作(固有数据类型的操作) 所以: 算法的执行时间= 原操作的执行次数*原操作 语句的频度指的是该语句重复执行的次数。 一个算法转换为算法后所耗费的时间,除了与所用的计算软、硬件环境有关外,主要取决于算法中指令重复执行的次数,即语句的频度相关。 一个算法中所
阅读全文
摘要:用计算机解决一个现实中的问题步骤: 1. 问题分析 2. 数学模型建立 3. 算法设计与选择 4.算法表示 5.算法分析 6.算法实现 7.程序调试 8.结果整理文档编制 1. 问题分析 准确、完整地理解和描述问题是解决问题的第一步。要做到这一点,必须注意以下一些问题:在未经加工的原始表达中,所用的
阅读全文
1