算法设计与分析第6章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章 变治法
插入:除非是空树,否则总是把一个新的键K 插入:除非是空树,否则总是把一个新的键K插入 到一个叶子里。如果叶子是一个2节点,根据K 到一个叶子里。如果叶子是一个2节点,根据K是小 于还是大于叶子节点中原来的键, 于还是大于叶子节点中原来的键,把k作为第一个 键或第二键进行插入。如果叶子是一个3节点, 键或第二键进行插入。如果叶子是一个3节点,把 叶子分裂成两个节点: 叶子分裂成两个节点:三个键中最小的放到第一个 叶子上,最大的键放到第二个叶子中, 叶子上,最大的键放到第二个叶子中,同时中间的 键提升到原来叶子的父母中去。 键提升到原来叶子的父母中去。 举例:构造2 为列表9 3)举例:构造2-3树,为列表9,5,8,3,2,4, 构造一棵2 7构造一棵2-3树。
第六章 变治法
通过举3个例子说明预排序的思想: 通过举3个例子说明预排序的思想: 例1:检验数组中元素的唯一性 方法:先对数组排序, 1)方法:先对数组排序,然后只检查它的连续元 如果该数组有相等的元素, 素;如果该数组有相等的元素,则一定有一对元 素是相互紧挨的,反之亦然。 素是相互紧挨的,反之亦然。 算法: Elementuniqueness(A[0..n2)算法:Presort Elementuniqueness(A[0..n-1]) { 对数组排序 nfor i=0 to n-2 do if A[i]==A[i+1] return false return true }
第六章 变治法
四种旋转的简单形式: 四种旋转的简单形式: 1)向右单向旋转: 向右单向旋转: 向左单向旋转: 2)向左单向旋转:
3 2 2 1 1 3
第六章 变治法
1 2 3 1 2 3
第六章 变治法
3)双向左右旋转:对根r的左子树进行左旋,再 双向左右旋转:对根r的左子树进行左旋, 对这棵以r为根的新树进行右旋。 对这棵以r为根的新树进行右旋。
算法设计与分析
第六章 变治法
主要内容
1、预排序和堆排序 2、高斯消去法 3、平衡查找树 4、霍纳法则和二进制幂 5、问题化简
第六章 变治法
重点难点
1、重点:变治法的理解 重点: 难点: 2、难点:变治法的应用
第六章 变治法
变治法是著名的通用算法设计技术。 变治法是著名的通用算法设计技术。分为两个 阶段的工作:(1) :(1)在 的阶段, 阶段的工作:(1)在”变”的阶段,出于这样或 者那样的原因,把问题的实例变得更容易求解; 者那样的原因,把问题的实例变得更容易求解; (2)在 的阶段,对实例进行求解. (2)在”治”的阶段,对实例进行求解.
第六章 变治法
2-3树的最后一个要求:树中的所有叶子必须位于同 树的最后一个要求: 一层,一棵2 树总是高度平衡的; 一层,一棵2-3树总是高度平衡的;对于每个叶子来 说,从树的根到叶子的路径长度都是相同的。 从树的根到叶子的路径长度都是相同的。 2)操作: 操作: 查找:如果是一个2节点, 查找:如果是一个2节点,就把它当作是一个二叉查 找树来操作, 是等于根的键值,算法停止;k<或 找树来操作,k是等于根的键值,算法停止;k<或> 根的键值的话, 根的键值的话,分别在左子树或右子树中继续进行 查找。如果是一个3节点,在不超过两次比较之后, 查找。如果是一个3节点,在不超过两次比较之后, 使停止查找,还是应该在根的3 使停止查找,还是应该在根的3棵子树的哪一棵中继 续查找。 续查找。
第六章 变治法
6.3.2 2-3树 2定义: 树是一种可以包含两种类型节点的树: 1)定义:2-3树是一种可以包含两种类型节点的树:2 节点和3节点。 节点和3节点。 一个2节点只包含一个键和两个子女: 一个2节点只包含一个键和两个子女:左子女作为一 棵所有键都小于K的子树的根, 棵所有键都小于K的子树的根,而右子女作为一棵所 有键都大于K的子树的根。 有键都大于K的子树的根。 一个3节点包含两个有序的键K 并且有3 一个3节点包含两个有序的键K1和K2 (K1<K2)并且有3个 子女,最左边的子女作为键值小于K 的子树的根, 子女,最左边的子女作为键值小于K1的子树的根,中 间的子女作为键值位于K 之间的子树的根, 间的子女作为键值位于K1和K2 之间的子树的根,最右 边的子女作为键值大于K 的子树的根。 边的子女作为键值大于K2的子树的根。
第六章 变治法
6.3 平衡查找树 AVL树 6.3.1 AVL树 定义:一棵AVL树是一棵二叉查找树, AVL树是一棵二叉查找树 1)定义:一棵AVL树是一棵二叉查找树,其中每 个节点的平衡因子定义为该节点左子树和右子 树的高度差,这个平衡因子要么为0 要么为1 树的高度差,这个平衡因子要么为0,要么为1 或-1。
10 5 4 2 7 8 12 2 20 4 5 7 8 10 20
第六章 变治法
2)一棵不平衡的二叉树旋转为一棵平衡的 2)一棵不平衡的二叉树旋转为一棵平衡的 二叉树: 二叉树: AVL树的旋转 树的旋转, AVL树的旋转,是以某节点为根的子树的 一个本地变换,该节点的平衡要么变成+2 +2, 一个本地变换,该节点的平衡要么变成+2, 要么变成-2;如果有若干个这样的节点, 要么变成如果有若干个这样的节点, 先找出最靠近新插入的叶子的不平衡节点, 先找出最靠近新插入的叶子的不平衡节点, 然后旋转以该节点为根的子树。 然后旋转以该节点为根的子树。
第六章 变治法
例2:模式计算 方法:先对输入排序, 1)方法:先对输入排序,然后所有相等的数 值都会邻接在一起。为了求出模式, 值都会邻接在一起。为了求出模式,需要做 出的全部工作就是求出在该有序数组中邻接 次数最多的等值元素。 次数最多的等值元素。
第六章 变治法
算法:PresortMode(A[0..n2)算法:PresortMode(A[0..n-1]) { 对数组排序 i=0; modefreqency=0; i<=nwhile i<=n-1 do runlength=1;runvalue=A[i]; i+runlength<=nwhile i+runlength<=n-1 and A[i+runlength]=runvalue runlength=runlength+1; if runlength>modefrequency modefrency=runlength;modevalue=runvalue; i=i+runlength; return modevalue; }
第六章 变治法
3)算法分析:该算法的运行时间受制于排序时间, 3)算法分析:该算法的运行时间受制于排序时间, 算法分析 因为该算法的剩余部分只需要线性时间, 因为该算法的剩余部分只需要线性时间,如果 使用一个nlogn排序的话, nlogn排序的话 使用一个nlogn排序的话,最差效率就会好于 蛮力算法的最差效率。 蛮力算法的最差效率。
第六章 变治法
10 5 7 5
10 7 5
10 7
4
2
1
2
1
6
Leabharlann Baidu
2
1
第六章 变治法
堆的特性: 堆的特性: 1)只存在一种 个节点的完全二叉树. 只存在一种n 1)只存在一种n个节点的完全二叉树. 2)堆的根总是包含了堆的最大元素 堆的根总是包含了堆的最大元素. 2)堆的根总是包含了堆的最大元素. 3)堆的一个节点以及该节点的子孙也是一个堆 堆的一个节点以及该节点的子孙也是一个堆. 3)堆的一个节点以及该节点的子孙也是一个堆. 4)可以用数组来实现堆 方法是用从上到下、 可以用数组来实现堆, 4)可以用数组来实现堆,方法是用从上到下、从 左到右的方式来记录堆的元素。数组从1 左到右的方式来记录堆的元素。数组从1到n的 位置上存放堆元素。 位置上存放堆元素。 父母节点的键将会位于数组的前n/2个位置中, n/2个位置中 ①父母节点的键将会位于数组的前n/2个位置中, 而叶子节点的键将会占据后n/2个位置; n/2个位置 而叶子节点的键将会占据后n/2个位置; 在数组中,对于一个位于父母位置i的键来说, ②在数组中,对于一个位于父母位置i的键来说, 它的子女将会位于2i 2i+1,相应的, 2i和 它的子女将会位于2i和2i+1,相应的,对于一 个位于i的键来说,它的父母将会位于i/2. 个位于i的键来说,它的父母将会位于i/2.
第六章 变治法
6.1 预排序 预排序是一种很古老的思想。 预排序是一种很古老的思想。 讨论3种基本的排序算法---选择排序、 讨论3种基本的排序算法---选择排序、冒泡排 ---选择排序 插入排序, 序、插入排序,它们的效率在最坏情况下和平 均情况下的都是平方级的; 均情况下的都是平方级的;还讨论了两种高级 算法---合并排序和快速排序, ---合并排序和快速排序 算法---合并排序和快速排序,它们的效率在 最坏情况下和平均情况下的都是nlogn nlogn。 最坏情况下和平均情况下的都是nlogn。
第六章 变治法
例3 查找问题 问题: 1)问题:在n个可能排序项构成的一个给定 数组中查找某个给定值V的问题。 数组中查找某个给定值V的问题。 方法及分析:对数组先进行排序, 2)方法及分析:对数组先进行排序,排好 序后就可以应用折半查找, 序后就可以应用折半查找,它在最坏情 况下只需进行log n+1次 况下只需进行log2n+1次。比顺序查找 还差。 还差。
3 1 2 1 2 1 3 2 3
第六章 变治法
4)双向右左旋转: 双向右左旋转:
1 3 2
1 2 1 3 2 3
第六章 变治法
举例:给出一个数字列表: , , , , , , 举例:给出一个数字列表:5,6,8,3,2,4, 7,构造一棵 平衡树。 ,构造一棵AVL平衡树。 平衡树 3)算法效率的分析:最差情况下,查找和插入 )算法效率的分析:最差情况下, 操作的效率属于logn。但对于频繁的旋转,需 操作的效率属于 。但对于频繁的旋转, 要维护树的节点的平衡以及总体上的复杂性。 要维护树的节点的平衡以及总体上的复杂性。
第六章 变治法
变治策略: 变治策略
问 题 的 实 例
更简单的实例、 更简单的实例、另一 种表现或者另一个问 题的实例
解
变治思想有3种主要的类型 变治思想有 种主要的类型: 种主要的类型 (1)实例化简:变换为同样问题的一个更简单或更方便 )实例化简: 的实例; 的实例; (2)改变表现:变换为同样实例的不同表现; )改变表现:变换为同样实例的不同表现; (3)问题化简:变换为另一个问题的实例,这种问题的 )问题化简:变换为另一个问题的实例, 算法是已知的。 算法是已知的。
第六章 变治法
4)效率分析:主要依赖于树的高度。 效率分析:主要依赖于树的高度。 无论在最差情况下还是平均情况下,查找、 无论在最差情况下还是平均情况下,查找、插 入和删除的时间效率都属于logn logn。 入和删除的时间效率都属于logn。
第六章 变治法
6.4 堆排序 6.4.1 堆的概念 堆可以定义为一棵二叉树,树的节点中包含键 树的节点中包含键, 堆可以定义为一棵二叉树 树的节点中包含键 并且满足下面两个条件: 并且满足下面两个条件 (1)树的形状要求 这棵二叉树是基本完备的 或 树的形状要求---这棵二叉树是基本完备的 树的形状要求 这棵二叉树是基本完备的(或 者简称为完全二叉树),这意味着 这意味着,树的每一层都是 者简称为完全二叉树 这意味着 树的每一层都是 满的,除了最后一层最右边的元素有可能缺位 除了最后一层最右边的元素有可能缺位. 满的 除了最后一层最右边的元素有可能缺位 (2)父母优势要求 每个节点的键都要大于或等 父母优势要求----每个节点的键都要大于或等 父母优势要求 于它子女的键
第六章 变治法
3)算法分析:用于排序的时间加上用于检验连 算法分析: 续元素的时间就是该算法的总运行时间。 续元素的时间就是该算法的总运行时间。 排序部分决定了算法的总效率。 排序部分决定了算法的总效率。使用一个好的 排序算法,比如合并排序, 排序算法,比如合并排序,它的最差效率属于 对数函数, 对数函数,那么整个预排序算法的最差效率就 属于对数函数。 属于对数函数。