一、概述
算法基本概念
算法是一系列解决问题的清晰指令,也就是说,对于符合一定规范的输入,算法能够在有限时间内获得所要求的输出。
算法是解决问题的一种方法或过程,它是由若干条指令组成的有穷序列。
当设计与实现算法是一种工程行为时,我们需要在资源有限的情况下,在互斥的目标之间做权衡,设计者的时间也是这样一种资源。
算法的特征
输入:有零或多个外部量作为算法的输入。
输出:算法产生至少一个量作为输出。
确定性:组成算法的每条指令清晰、无歧义。
有效性:算法中执行的任何计算步骤都是可以被分解 为基本的可执行的操作步。
有限性:算法中每条指令的执行次数有限,执行每条 指令的时间也有限。
二、算法算法效率的度量
算法效率的度量
算法效率的高低体现在运行该算法所需要耗费资源的多少,对于计算机来讲,最重要的资源是时间和空间,因此,算法效率又可分为时间效率和空间效率。
函数的渐进的界
算法复杂性分析
算法复杂性分析基本步骤:
(1)确定表示输入规模的参数。
(2)找出算法的基本操作。
(3)检查基本操作的执行次数是否只依赖于输入规模。这决定是否需要考虑最差、平均以及最优情况下的复杂性。
(4)对于非递归算法,建立算法基本操作执行次数的求和表达式;对于递归算法,建立算法基本操作执行次数的递推关系及其初始条件。
(5)利用求和公式和法则建立一个操作次数的闭合公式, 或者求解递推关系式,确定增长的阶。
递归算法的复杂性分析
三、蛮力法
四、分治法
基本步骤
划分:既然是分治,当然需要把规模为n的原问题划分为k个规模较小的子问题,并尽量使这k个子问题的规模大致相同。
求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。
合并:把各个子问题的解合并起来,合并的代价因情况不同有很大差异,分治算法的有效性很大程度上依赖于合并的实现。
复杂度分析
递推方程:
迭代法求得:
五、动态规划
基本思想
动态规划是一种使多阶段决策过程最优的通用方法。
动态规划算法与分治法类似,其思想把求解的问题分成许多阶段或多个子问题,然后按顺序求解各子问题。最后一个阶段或子问题的解就是初始问题的解。
动态规划基本思想是保留已解决的子问题的解,在需要时再查找已求得的解,就可以避免大量重复计算,进而提升算法效率。
基本步骤
(1)找出最优解的性质,并刻画其结构特征。
(2)递推地定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。
要素 :最优子结构、重叠子问题 、 备忘录(表格)
矩阵连乘问题
实例:
凸多边形最优三角剖分(类似矩阵连乘)
递归方程:
最长公共子序列(LCS)
实例:
电路布线问题
图像压缩问题
最大子段和问题
投资问题
0-1背包
递推方程:
0-N背包
递推方程: