1、1,第6章 变治法,首先是”变“, 将问题的实例变形,变得更容易求解; 思考:和分治与减治的区别 然后是”治“,对问题的实例进行求解。 变治法有三个变形:(1)实例化简同样问题(2)改变表现同样实例(3)问题化简另一问题,2,(1)实例化简同样问题6.1 预排序 6.2 高斯消去法6.3 平衡查找树AVL树 (2)改变表现同样实例6.3 2-3树6.4 堆和堆排序6.5 霍纳法则和二进制幂 (3)问题化简另一问题6.6,3,6.1 预排序,列表是有序的话,许多关于列表的问题更容易求解。 因此很多问题需要先排序,则该问题的时间效率依赖于排序算法的效率。 回忆前面所学的排序算法: 插入排序最差(n
2、2)平均 (n2)最优 (n) 快速排序最差(n2)平均(1.38nlog2n)最优(nlog2n) 合并排序最差(nlog2n) 选择排序 (n2) 冒泡排序 (n2),4,例1、检验数组中元素的唯一性蛮力法如何做?时间效率是多少? 如果先排序,则如何检查元素的唯一性? 只需检查相互紧挨的元素。 PresortElementUniqueness(A0n-1)/先对数组排序再验证唯一性/输入:数组A/输出:若A没有相等的元素,返回“true”,否则返回“false”.对数组排序; for i=0 to n-2 doif Ai=Ai+1 return falsereturn true,整个过程时
3、间效率是多少?,5,预排序,例2、模式计算 模式:指数组列表中出现次数最多的值。如5,1,5,7,6,5,7中5是模式所能想到的求模式的方法: 用辅助列表列出所有元素及其出现频率。 时间效率如何分析? 采用排序的思想 先排序后计算相邻接次数最多的等值元素。 时间效率如何分析?,6,思考:预排序还可以用在什么方面? 查找 分析顺序查找和先排序再查找的时间效率 如果要在同一个列表中进行多次查找,在排序上花费时间是值得的。 课堂练习: 采用合并排序为预排序,折半查找,要做多少次查找才能使得对一个由n个元素构成的数组所做的预排序是有意义的。,7,预排序的其他应用: 对点排序,拓扑排序 课堂练习: P1
4、53 4,8,6.2 Gauss消去法,科学计算中通常需要解多个变量的方程组,这些方程组当中最简单的是线性方程组,也就是变量的次数均为1次的。求解线性方程的方法有利用高斯消元的直接法以及迭代法。 体现的变治的思想:将方程组变成一个具有特殊性质的方程组(上三角矩阵),9,1、高斯消元法,一般的线性方程组是指如下形式的方程组:,10,高斯消元法,分消元过程和回代过程。消元过程将原方程组变为上三角方程组,回代过程得到方程组的解。,11,高斯消元法举例:,12,高斯消元法的伪代码,GaussElimination(A1n, b1n)/ 输入:系数矩阵A及常数项 b/ 输出:方程组的增广矩阵等价的上三角
5、矩阵for i=1 to n doAin+1 =bifor i =1 to n-1 dofor j= i+1 to n dofor k = i to n+1 doAjk = Ajk Aik*Aji/Aii,13,高斯消元法的效率分析基本操作:乘法执行次数:易见,三重循环C(n)(n3),14,2、LU分解法,高斯消去法的现代商业实现是以LU分解为基础的。,15,系数矩阵为,下三角矩阵L,由主对角线上的1 以及在高斯消去过程中行的乘数构成,上三角矩阵U是消去的结果,可观察出两个矩阵的乘积LU等于A,16,记原方程组为 A X =bA=LU则原方程组为LUX=b 其求解转化为两个三角形方程组的求解
6、:LY=b 下三角方程组UX=Y 上三角方程组,17,LU分解法,与LY=b, UX=Y对应的方程组如下:,易得:(y1,y2,y3)=(1,3,-2), (x1,x2,x3)=(1,0,-1),18,评价,1 一旦的到矩阵A的LU分解,无论对于什么样的右边向量b,我们都可以对方程组Ax=b求解,每次求一个。 2 LU分解不需要额外的存储空间,19,3、计算矩阵的逆,逆矩阵的定义:,求矩阵 A 的逆矩阵,如何转换,20,计算矩阵的逆,求矩阵 A 的逆矩阵,转化为求解n个方程组A Xj =bj其中, bj是单位矩阵的第j列,而Xj 则是逆矩阵的第j列。,21,3、计算矩阵的行列式,n阶矩阵的行列
7、式的计算由递归公式定义:其中, n=1时,det A=a11,若j为奇数,sj=1, 若j为偶数,sj=-1 例如n=3的情形如下:,22,计算矩阵行列式,按照定义计算高阶行列式是不可能的。可利用高斯消元法:矩阵A的行列式=消元后上三角矩阵的行列式=对角线上元素之乘积。例如,上式中 det A=2 3 2=12,23,课堂练习: 考虑高斯消去法的反向替换的运行时间效率类型是多少?,24,6.3 平衡查找树,二叉查找树是一种重要的数据结构 看书p162-163,思考下列问题: 1 二叉查找树的特点是? 2 在平均情况下,查找,插入,删除的效率是? 3 最差情况是一种什么情况? 4 最差情况效率是
8、多少?,25,把一个集合变换成一棵二叉查找树是改变表现技术的一个实例 好处是: 在平均情况下,查找,插入,删除的效率是(logn) 最差情况下, (n),退化成线性的情况,26,考虑一种既能够保留经典二叉查找树的好特性 又能够避免它退化到最差情况的数据结构 两种方法: 实例化简:不平衡二叉查找树变为平衡的形式 改变表现:允许一棵查找树的单个节点中不止包含一个元素。,27,6.3.1 AVL树,看书p163,p166回忆及思考下面问题 1 AVL树的概念 2 AVL树查找效率与什么相关? 3 最差情况,28,AVL树的效率评价,n个节点的AVL树的高度h对于随机键的列表构造的AVL树,得到它的平
9、均高度的精确公式被证明是有难度的。 实验表明,这个高度大约是1.01log2n+0.1 在平均情况下,查找一棵AVL树需要的比较次数和用折半查找一个有序数组是几乎相同的。 在最差情况下查找和插入的效率属于(logn) 缺点: 频繁的旋转,维护平衡以及总体上的复杂性,29,6.3.2 2-3树,2-3树是一种特殊的高度平衡树,允许结点最多包含两个关键字。两类结点:2-node、3-node。 树中所有叶子必须位于同一层。,30,2-3树的搜索与插入,看书理解 1 搜索算法p167 2 插入算法p168,31,搜索算法 如果待搜索树的根是2-node型结点,搜索操作与二叉搜索树搜索操作相同; 如果
10、待搜索树的根是3-node型结点,最多只需要比较两次就可以知道是搜索成功还是需要向3棵子树继续递归搜索。,32,插入算法: 当一个结点x需要插入到2-3树中的时候,总是根据它的大小关系,把其插入到叶结点中。 插入前首先调用搜索算法找到待插入的叶结点,如果该叶结点是2-node型的,则直接插入即可; 如果该叶结点是3-node型的,在按序插入到叶结点后,需要把叶结点拆分(因为插入后使得叶结点的关键字个数为3,不满足2-3树的要求)。 拆分过程首先在三个关键字挑选值在中间的关键字,提到上一层,或者作为新结点,或者插入原来的内结点中;关键字最小的作为左子树,关键字最大的作为右子树。如果内结点的插入导
11、致结点过大,按照上述规则继续拆分。,33,2-3树的效率分析,操作效率与什么相关? 树高h 若有n个关键字,构成一棵全部由2节点构成的满树,n与h之间的关系为?若有n个关键字,构成一棵全部由3节点构成的满树,n与h之间的关系为?所以高度的范围是:无论在最差还是平均,查找,插入和删除时间效率都是对数类型,34,6.4 堆和堆排序,6.4.1 堆的概念 看书p170-p173回忆及理解 1 堆的定义 2 堆的构建方法 3 自底向上构造法的时间效率 4 自顶向下构造法的时间效率 5 堆中删除元素的算法,35,1 堆的定义 堆是一棵二叉树,树中节点包含键,满足下面两个条件: 树的形状:二叉树 父母:每
12、个节点的键都要大于或等于它子女的键。,36,2自底向上构造法,首先把数组按序填充到堆中各个结点 然后按照自下而上,从右至左的顺序,从最后的父母节点开始,到根为止,检查这些节点的值是否都满足子结点比父结点小的约束条件。 如果不满足则调换父子结点的位置,然后再检查在新的位置上,是不是满足父母优势要求。 用自底向上法为1,8,6,5,3,7,4构造一个堆,37,2自底向上构造法,最坏情况 每个位于树的第i层的键都会移动到叶子层h中 移动到下一层需要进行几次比较? 两次。位于第i层的键移到叶子层h需要几次比较? 需要2(h-i)次键值比较。 因此有下式:结论:一个规模为n的堆只需不到2n次比较就能构造
13、完成,38,3 自顶向下构造法,将包含新键K附加在当前堆的最后一个叶子后面 将新键和父母比较交换 这个键向上走,直到它不大于它的父母为止 用自顶向下法为1,8,6,5,3,7,4构造一个堆思考一个新键插入i个元素构成的堆的比较次数 N个规模问题的比较次数,39,4 堆结点的删除,只考虑删除根中的键 把待删除结点与堆中最后一个键K对调。 执行删除操作并把堆的大小减一。 对删除后的堆进行调整直到满足堆的约束条件。 删除的效率分析: 取决于交换和规模减一后,树的堆化所需的键值比较次数。 因为键值比较次数不可能超过堆的高度的两倍,删除的时间也是属于对数类型的。,40,6.4.2 堆排序,堆排序主要包括
14、两个步骤: (1)对于给定的数组构造相应的堆。 (2)对所构造的堆执行n-1次删除堆的根结点的操作,把删除得到的结点保存在给定数组中。,41,堆排序举例,用堆排序对数组2,9,7,6,5,8排序 步骤1:构造堆2,9,7,6,5,82,9,8,6,5,72,9,8,6,5,79,2,8,6,5,79,6,8,2,5,7,42,堆排序举例,步骤2:删除根结点9,6,8,2,5,77,6,8,2,58,6,7,2,55,6,7,27,6,5,22,6,56,5,25,22,43,堆排序效率分析,1 构造堆的效率是多少? O(n) 2 删除最大键及后续的效率 O(nlogn)评价: 堆排序不需任何额
15、外的存储空间 针对随机文件的实验指出,堆排序比快速排序运行的慢,但和合并排序还是有竞争力的。,44,6.3-6.4小结,实例化简-AVL树查找效率最坏平均 改变表现-2-3树查找效率最坏,平均堆两种构造方法的效率删除的效率堆排序 效率,45,6.5 Horner法则和二进制幂,6.5.1 Horner法则计算n次多项式的值的算法。例如,n=4,直接计算,需要多少次乘法?4+3+2+1=10=n(n-1)/2次乘法,用如下Horner/秦九韶算法只需要4=n次乘法:,46,当x=3时,计算p(x),霍纳法则的有趣特性 该算法在计算p(x)在某些点x0上的值所产生的中间数字恰好可以作为p(x)除以
16、x-x0的商的系数,而算法的最后结果,除了等于p(x0)以外,还等于这个除法的余数。即,当x0=3时 p(x)=2x4-x3-3x2+x-5 除以x-3 为2x3+5x2+18x+55 和 160,47,6.5.2 二进制幂计算an的算法,有两种方法:,从左到右逐位扫描算法:例求a13, 13=1101 从右到左逐位扫描算法:例求a13, 13=1101,48,6.6 问题化简,问题化简是一个重要的解题策略如解析几何的根本思想是把几何问题化为代数问题,49,6.6.1 求最小公倍数lcm(m,n),原问题:求能够被m和n整除的最小整数记为lcm(m,n) 常用算法:m和n所有公共质因数乘以m的
17、不在n中的质因数,再乘以n不在m中的质因数24=2223 60=2235 lcm(24,60)=(223)25=120 缺陷:需要连续素数的表,50,关联m和n的最大公约数gcd(m,n)是m和n所有公共质因子的积。 并且lcm(m,n)=mn/gcd(m,n)问题化简转换为求最大公约数gcd(m,n)的高效的欧几里德算法,51,6.6.2 计算图中的路径数,原问题:计算图中两个顶点之间的路径数量 问题化简:可利用邻接矩阵,可以证明:图G中顶点vi到顶点vj之间长度为k的路径数量等于AK的第(i,j)个元素,其中A是图G的邻接矩阵。,52,6.6.3 优化问题的化简,原问题:求函数的最大值或最
18、小值 问题化简:已知函数的最大值的算法求其最小值min f(x)=-max-f(x)函数最优化:把最优化问题转化为函数极值问题,再由 f(x)=0求临界点。,53,6.6.4 线性规划,许多决策优化问题可以转化为线性规划问题。例子:进行1亿美元的投资。该笔钱分成3种类型的投资:股票、债券和现金。预期收益各是10%,7%,3%。并且投资在股票上的资金不能超过债券的1/3,现金投资至少相当于股票和债券投资总额的25%。这笔投资如何才能最大化收益?,54,线性规划问题是一个多变量线性函数的最优化问题。 这些变量要满足的约束是以线性等式或线性不等式的形式出现。 可以为各种应用建模,如排班,交通和通信网
19、络规划,石油勘探和提纯。 解线性规划问题的算法:单纯形法 Karmarkar算法,55,整数线性规划问题:把变量的值限定在整数。 目前还没有一个已知的多项式级的求解算法。,56,6.6.5 简化为图论问题,许多问题用图表示后,求解很容易。通常用图的顶点表示问题的状态,边表示状态之间的可能转变。表示问题的图称为状态空间图。例如过河问题:一个农夫希望用一条小船把一只狼,一头羊,一篮白菜从河的北岸渡到河的南岸,由于船小只能够容纳人狼羊菜中的两个。需要考虑的约束条件是:在没有人的情况下,狼和羊不能在一起,羊和白菜不能单独在一起。求解一个渡船的方案,把狼、羊、白菜都运过去。,57,对过河问题,画出人、狼
20、、羊、菜的状态空间图后即可以发现有两条路径,这两条路径就是问题的两个解。,58,过河问题,解:用四维0-1向量表示(人,狼,羊,菜)在河西岸的状态(在河西岸则分量取1,否则取0),共有24 =16 种状态.在河东岸的状态类似记作.由题设,状态(0,1,1,0),(0,0,1,1),(0,1,1,1)是不允许的,从而对应状态(1,0,0,1), (1,1,0,0), (1,0,0,0)也是不允许的.以可允许的10个状态向量作为顶点,将可能互相转移的状态用线段连接起来构成一个图.根据此图便可找到渡河方法.,59,(1,1,1,1) (1,1,1,0) (1,1,0,1) (1,0,1,1) (1,
21、0,1,0) (0,0,0,0) (0,0,0,1) (0,0,1,0) (0,1,0,0) (0,1,0,1),(0,1,0,1) (0,1,0,0) (0,0,1,0) (0,0,0,1) (0,0,0,0) (1,0,1,0) (1,0,1,1) (1,1,0,1) (1,1,1,0) (1,1,1,1) 河西=(人,狼,羊,菜) 河东=(人,狼,羊,菜),将10个顶点分别记为A1, A2, , A10 ,则渡河问题化为在该图中求一条从A1到A10的路. 从图中易得到两条路:A1 A6 A3 A7 A2 A8 A5 A10;A1 A6 A3 A9 A4 A8 A5 A10.,60,小结,(1)实例化简同样问题6.1 预排序 6.2 高斯消去法6.3 平衡查找树AVL树 (2)改变表现同样实例6.3 2-3树6.4 堆和堆排序6.5 霍纳法则和二进制幂 (3)问题化简另一问题6.6,