天津科技大学算法设计与分析 第5章 减治法
天津科技大学09年《算法设计与分析》试卷

算法分析与设计样题一、填空题(每空2分,共26分)(1) 算法是由若干条指令组成的有穷序列,且满足几条性质,其中有限性是指。
(2) 根据符号Ω定义,用它评估算法的复杂性,得到的只是该复杂性的一个下界。
这个下界的阶越高,则。
(3) 由分治法产生的子问题往往是,这就为使用提供了方便。
(4) 动态规划算法的两个基本要素是。
(5) 贪心选择性质是指所求问题的整体最优解可以。
(6) 回溯法在包含问题的所有解的解空间树中,按照,从根结点出发搜索解空间树。
(7) 从活结点表中选择下一扩展结点的不同方式导致两种不同的分支限界法,它们是。
(8) 一般情况下,可将概率算法分为四类:数值概率算法、蒙特卡罗算法、。
(9) 在进行问题的计算复杂性分析时,使用的较重要的三个计算模型是随机存取机RAM、。
(10) 通常将可在看作是易解问题,而将需要指数时间解决的问题看作是难问题。
(11) 回溯法和分支限界法使用的两类典型的解空间树分别为。
(12) 在计算机上产生伪随机数最常用的方法是。
二、对于下列各组函数f(n)和g(n), 确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ (g(n)),并简述理由。
(每小题3分,共12分)(1) f(n)=logn6; g(n)=8logn+5 (2) f(n)= 100n; g(n)=log2n(3) f(n)=nlogn+n; g(n)=logn (4) f(n)= 2n; g(n)=10n3三、试述分治法的基本思想并用于两个大整数的乘法, 分析其算法复杂性。
(12分)四、试给出基于分治策略的二分搜索算法并分析其复杂性。
(10分)五、贪心算法的基本要素是什么?试给出基于贪心策略的活动安排问题的算法。
(12分)六、试给出用回溯法求解4皇后问题的部分解空间树,并简单分析其复杂性。
(8分)七、试给出用动态规划方法求解矩阵连乘问题的几个详细步骤。
10分八、试结合主元素问题论述蒙特卡罗算法的基本思想。
《算法设计与分析》教案

cout<<endl;
}
}
}
}
}
2、数字全排列(使用STL)
#include<iostream>
#include<algorithm>
using namespace std;
const int n=4;
int main()
{
int a[4]={2,4,3,1};
if(l==r-1)
{ if(a[l]>a[r]) { max=a[l]; min=a[r]; }
else { max=a[r]; min=a[l]; }
return;
}
int m = (l+r)/2;
T max1,max2,min1,min2;
MaxMin(a, l, m, max1, min1);
例:在n个元素中找最大值和最小值(非递归程序)
template<class T>
void MaxMin(T a[], int n, T& max, T&min)
{
if(n==1) { max=min=a[0]; return; }
if(a[0]>a[1]) { max=a[0]; min=a[1]; }
{
if(k==m)
{#43;+) cout<<a[i]<<" ";
cout<<endl;
}
else
for(int i=k;i<=m;i++)
5-第五章 减治法

2.比较v和 A[x]
确定查找范围
5.6.3 二叉查找树的查找和插入
• 二叉查找树:左子树的值小于根顶点,右 子树大于根顶点。
小结
5.4 生成组台对象的算法
• 组合问题 1、计数 2、结构
组合问题
5.4.1 生成排列
用减一思想生成{1,2,…,n}所有排列。
Johnson-trotter算法
• 字典序---增序排队
5.4.2 生成子集
1、挤压序: 所 2、是否存在—种生成比特串的最小变化算法,使得每
一个比特串和它的直接前趋之间仅仅相差一 个比特 位。
n / 2 ,它要求找出这样一个元素,该元素比列表中的—半元素大,又比另—半元素
小。这个中间的值被称为中值,它在数理统计中是—个非常重要的量。
• 类似快速排序的分区做法
• 例
15 15
效率分析: 1)平均效率 2)最差效率
5.6.2 插值查找
插值查找用于有序数组,“插值”代替了折 半查找中的中间值 1.计算
• 最坏输入是一个严格递减的数组,这种输 入的比较次数是
• 最好的情况下(升序),在外部循环的每 次送代中,比较操作只执行一次
• 平均
5.2深度优先查找和广度忧先查找
• 什么叫图的遍历 从图的任意点出发沿着一些边访问图中的 所有顶点,且使每个顶点仅被访问一次,这就 叫图的遍历. • 我们来看一下图的遍历的两种方法: 1.深度优先搜索 2.广度优先搜索
第一种算法是深度优先查找的一个简单应用:执行一次DFS遍 历,并记住顶点变成死端(即退出遍历栈)的顺序。将该次序反过来 就得到了拓扑排序的一个解。
第二种算法基于减(减一)治技术的一个直 接实现:不断地做这样—件事,在余下的有向 图中求出一个源,它是一个没有输入边的顶点, 然后把它和所有从它出发的边都删除。
如何使用剪枝技术优化算法

如何使用剪枝技术优化算法随着数据量和模型复杂度的增加,算法的效率成为一个越来越重要的问题。
剪枝技术是一种常用的优化算法效率的方法,本文将介绍如何使用剪枝技术优化算法。
一、剪枝技术的基本概念和原理剪枝技术是指在搜索算法、分类算法、关联规则挖掘等领域中,通过剪去不需要考虑的部分来降低算法复杂度和提高效率的一种技术。
剪枝技术的基本原理是通过一定的判断条件,减少算法的搜索空间,从而达到优化算法的效果。
剪枝技术分为静态剪枝和动态剪枝两种。
静态剪枝是指在算法执行前就进行筛选,剪去不必要的分支,从而减少计算量;动态剪枝是在算法执行过程中对搜索空间进行剪枝,根据算法实际情况和需求动态地调整搜索空间。
在具体的算法实现中,剪枝技术可以采用多种方式,如减枝、约束传播、启发式剪枝等。
减枝是指根据预设的规则,剪去不需要考虑的分支,减少搜索空间。
约束传播是指根据算法中的局部约束条件,预处理出所有合法的方案,从而在搜索过程中减少计算量。
启发式剪枝是指利用启发式算法的思想,通过剪枝引导搜索过程,从而更快地找到最优解。
二、如何使用剪枝技术优化算法1. 确定优化目标在使用剪枝技术优化算法前,需要明确优化目标。
优化目标可以是算法的时间复杂度、空间复杂度、正确率等,也可以是多个因素的综合考虑。
只有明确了优化目标,才能更有针对性地进行剪枝。
2. 选择适当的剪枝策略在使用剪枝技术时,需要选择适当的剪枝策略。
不同的算法适合不同的剪枝策略。
例如,在搜索算法中,可以采用启发式剪枝、减枝等方式;在分类算法中,可以采用预剪枝、后剪枝等方式;在关联规则挖掘中,则可以采用约束传播等方式。
3. 优化剪枝条件剪枝技术的效果取决于剪枝条件的选择。
对于一个给定的算法,需要深入了解算法中各个环节的特点和规律,选取合适的剪枝条件。
另外,对于动态剪枝,还需要根据具体情况动态地调整剪枝条件。
4. 结合其他优化方式剪枝技术是一种常用的优化算法的方式,但并不是万能的。
在实际应用中,还需要结合其他优化方式,如并行计算、缓存优化、矩阵压缩等,来达到更好的优化效果。
天津科技大学数据结构与算法课程设计

《数据结构与算法分析》课程设计教学任务书一、课程设计的目的数据结构与算法课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构与算法是为了将实际问题中涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二、课程设计的基本要求1. 独立思考,独立完成:课程设计中各任务的设计和调试要求独立完成,遇到问题可以讨论,但不可以拷贝。
2. 做好上机准备:每次上机前,要事先编制好准备调试的程序,认真想好调试步骤和有关环境的设置方法,准备好有关的文件。
3. 按照课程设计的具体要求建立功能模块,每个模块要求按照如下几个内容认真完成:a)需求分析:在该部分中叙述,每个模块的功能要求b)概要设计:在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)c)详细设计:各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组程序,每个功能模块采用不同的函数实现)源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释d)调试分析:测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些,问题如何解决?),算法的改进设想课程设计总结:(保存在word文档中)总结可以包括:课程设计过程的收获、遇到的问题、解决问题过程的思考、程序调试能力的思考、对数据结构这门课程的思考、在课程设计过程中对《数据结构》课程的认识等内容4. 实现的结果必须进行检查和演示,程序源代码和程序的说明文件必须上交,作为考核内容的一部分。
第 五 章 减治法

算 分 析 与 设 计
西南科技大学
金块问题
有一个老板有一袋金块。每个月将有两 名雇员会因其优异的表现分别被奖励一 个金块。按规矩,排名第一的雇员将得 到袋中最重的金块,排名最后的雇员将 得到袋中最轻的金块。如果每个月都有 新的金块周期性的加入袋中,则每个月 都必须找出最轻和最重的金块。假设有 一台比较重量的仪器,我们希望用最少 的比较次数找出最轻和最重的金块。
算 分 析 与 设 计
西南科技大学
直接插入排序实现方法
减一技术下,该方法遵循的思路是:假设对较 小数组 A[0..n-2]排序问题已经解决了,得到一 个大小为n-1的有序数组。然后将要排序的第n 个元素,插入到数组的适合位置上,得到大小 为n的有序数组 A[0..n-1]。伪代码如下: void InsertionSort(a[]) {for(i=1;i<n-1;i++) //从第二个记录起进行插入 for (j=i-1; j>=0;j--) if a[j+1]-(a[j]) < 0 Swap(a[j+1], a[j]); }
算 分 析 与 设 计
西南科技大学
俄式乘法☺ 俄式乘法☺
算法思想:两个A和B数相乘,把数A每 次除以2,直到为0为止,另一个数B则不 断加倍,若第数A未除尽时,则数B应加 上自己。 7×8的计算步骤: 7 8 3 16+ 8 1 32+ 16 + 8
算 分 析 与 设 计
西南科技大学
约瑟夫斯问题( 约瑟夫斯问题(一)
算 分 析 与 设 计
西南科技大学
减常数因子减治法
减常数因子减治法的一个 典型算法就是折半查找 (Bin_Search)。它搜索 一个排序好的数组,将查 找目标与数组的中间位置 的元素相比,比它大则递 归查找数组的左边,反之 亦然。这个每次迭代都将 问题减小为原来的1/2。 折半查找每次都消去一个 常数因子2,因此其时间 效率为O(logn)。
天津科技大学算法设计与分析 第5章 减治法
04.04.2021
精品课件
15
5.3 排序问题中的减治法
5.3.1 堆排序 5.3.2 选择问题
由二叉排序树的定义,在二叉排序树root中查找给定值k 的过程是: ⑴ 若root是空树,则查找失败; ⑵ 若k=根结点的值,则查找成功; ⑶ 否则,若k<根结点的值,则在root的左子树上查找; ⑷ 否则,在root的右子树上查找;
上述过程一直持续到k被找到或者待查找的子树为空, 如果待查找的子树为空,则查找失败。 ❖二叉排序树的查找效率就在于只需要查找两个子树之一。
04.04.2021
精品课件
9
判定树——描述折半查找的判定过程。 长度为n的判定树的构造方法为: (1)当n=0时,判定树为空; (2)当n>0时,判定树的根结点是有序表中序号 为mid=(n+1)/2的记录,根结点的左子树是与有序 表r[1] ~ r[mid-1]相对应的判定树,根结点的右子 树是与r[mid+1] ~ r[n]相对应的判定树。
第5章 减治法
5.1 减治法的设计思想 5.2 查找问题中的减治法 5.3 排序问题中的减治法 5.4 组合问题中的减治法
04.04.2021
精品课件
1
5.1 减治法的设计思想
规模为n的原问题的解与较小规模(通常是 n/2)的子问题的解之间具有关系: (1)原问题的解只存在于其中一个较小规模的子 问题中; (2)原问题的解与其中一个较小规模的解之间存 在某种对应关系。
}
04.04.2021
精品课件
14
在二叉排序树上查找关键码等于给定值的结点的过程, 恰好走了一条从根结点到该结点的路径,和给定值的比较 次数等于给定值的结点在二叉排序树中的层数,比较次数 最少为1次(即整个二叉排序树的根结点就是待查结点), 最多不超过树的深度。
算法设计与分析-第5章-减治法
0 T (n) T (n / 2) 1
n 1 n 1
所以,通常来说,应用减治法处理问题的效率是很高的, 一般是O(log2n)数量级。
5.2 查找问题中的减治法
5.2.1 折半查找 5.2.2 二叉查找树 5.2.3 选择问题
5.2.1
一、问题描述:
折半查找
应用折半查找方法在一个有序序列中查找值为k的记 录。若查找成功,返回记录k在序列中的位置,若查找失 败,返回失败信息。
low=1
பைடு நூலகம்
18>14
mid=3
mid=7 31>14 high=6
high=13
high=2
mid=1
7<14
low=2
mid=2
14=14
5.2.1 折半查找
三、算法设计
算法5.1——折半查找
1. low=1;high=n; //设置初始查找区间 2. 测试查找区间[low,high]是否存在,若不存在,则查找失败; 否则 3. 取中间点mid=(low+high)/2; 比较k与r[mid],有以下三种情况: 3.1 若k<r[mid],则high=mid-1;查找在左半区进行,转2; 3.2 若k>r[mid],则low=mid+1;查找在右半区进行,转2; 3.3 若k=r[mid],则查找成功,返回记录在表中位置mid;
{ int data; //结点的值,假设查找集合的元素为整型
BiNode *lchild, *rchild; //指向左、右子树的指针 };
算法5.2——二叉排序树的查找
BiNode * SearchBST(BiNode *root, int k) { if (root= =NULL) return NULL; else if (root->data==k) return root; else if (k<root->data) return SearchBST(root->lchild, k); else return SearchBST(root->rchild, k); }
算法设计与分析-减治法详解共65页
•
29、在一切能够接受法律支配的人类 的状态 中,哪 里没有 法律, 那里就 没有自 由。— —洛克
•
30、风俗可以造就法律,也可以废除 法律。 ——塞·约翰逊
6、最大的骄傲于最大的自卑都表示心灵的最软弱无力。——斯宾诺莎 7、自知之明是最难得的知识。——西班牙 8、勇气通往天堂,怯懦通往地狱。——塞内加 9、有时候读书是一种巧妙地避开思考的方法。——赫尔普斯 10、阅读一切好书如同和过去最杰出的人谈话。——计与分析-减治法详解
•
26、我们像鹰一样,生来就是自由的 ,但是 为了生 存,我 们不得 不为自 己编织 一个笼 子,然 后把自 己关在 里面。 ——博 莱索
•
27、法律如果不讲道理,即使延续时 间再长 ,也还 是没有 制约力 的。— —爱·科 克
•
28、好法律是由坏风俗创造出来的。 ——马 克罗维 乌斯
算法设计与分析课程设计
算法设计与分析 课程设计一、课程目标知识目标:1. 让学生掌握基本的算法设计原理,包括贪心算法、分治算法、动态规划等,并能够运用这些原理解决实际问题。
2. 使学生了解不同算法的时间复杂度和空间复杂度分析方法,能够评估算法的效率。
3. 引导学生理解算法的优缺点,并能针对具体问题选择合适的算法进行解决。
技能目标:1. 培养学生运用所学算法原理设计解决实际问题的算法,提高编程实现能力。
2. 培养学生通过分析算法的时间复杂度和空间复杂度,对算法进行优化和改进的能力。
3. 提高学生运用算法思维解决问题的能力,培养逻辑思维和创新能力。
情感态度价值观目标:1. 激发学生对算法学习的兴趣,培养主动探索、积极思考的学习态度。
2. 培养学生团队协作精神,学会与他人分享算法设计心得,共同解决问题。
3. 使学生认识到算法在现实生活中的重要性,提高对计算机科学的认识和兴趣。
课程性质:本课程为计算机科学领域的一门核心课程,旨在培养学生的算法设计与分析能力。
学生特点:学生已经具备一定的编程基础和逻辑思维能力,但对复杂算法的设计与分析仍需加强。
教学要求:结合实际案例,注重理论与实践相结合,引导学生通过自主探究、团队合作等方式,达到课程目标。
在教学过程中,注重分解目标,将目标具体化为可衡量的学习成果,以便于教学设计和评估。
二、教学内容1. 算法基本原理:- 贪心算法:介绍贪心算法原理及其应用场景,结合实际案例进行分析。
- 分治算法:阐述分治算法的设计思想及其应用,举例说明。
- 动态规划:讲解动态规划的基本概念、原理和应用,分析典型问题。
2. 算法分析:- 时间复杂度分析:介绍大O表示法,分析常见算法的时间复杂度。
- 空间复杂度分析:阐述空间复杂度的概念,分析常见算法的空间复杂度。
3. 算法优化与改进:- 针对典型问题,分析现有算法的优缺点,探讨优化方向。
- 引导学生通过算法分析,提出改进方案,并进行实现。
4. 教学大纲安排:- 第一章:算法基本原理(贪心算法、分治算法、动态规划)- 第二章:算法分析(时间复杂度、空间复杂度)- 第三章:算法优化与改进5. 教材章节和内容列举:- 教材第3章:贪心算法及其应用- 教材第4章:分治算法及其应用- 教材第5章:动态规划及其应用- 教材第6章:算法分析(时间复杂度、空间复杂度)- 教材第7章:算法优化与改进教学内容确保科学性和系统性,结合实际案例进行讲解,使学生能够逐步掌握算法设计与分析的方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
减治法的设计思想
原问题 的规模是n
子问题 的规模是n/2
子问题的解
原问题的解
2019/1/19 算法设计与分析--减治法 3
例:计算an的值,应用减治技术得到如下计算方法:
a n2 2 n a (a ) ( n - 1) 2 2 ´ ) a ( a
2019/1/19
算法设计与分析--减治法
13
二叉排序树的结点结构为:
struct BiNode {
int data; //结点的值,假设查找集合的元素为整型
BiNode *lchild, *rchild; //指向左、右子树的指针 };
算法5.2——二叉排序树的查找 BiNode * SearchBST(BiNode *root, int k) { if (root= =NULL) return NULL; else if (root->data==k) return root; else if (k<root->data) return SearchBST(root->lchild, k); else return SearchBST(root->rchild, k); }
2019/1/19
算法设计与分析--减治法
15
5.3 排序问题中的减治法
5.3.1 堆排序
5.3.2 选择问题
2019/1/19
算法设计与分析--减治法
16
5.3.1 堆排序
以结点的编号作为下标,将堆用顺序存储结构(即数组) 来存储,则堆对应于一组序列。
47 35 20 10 47 35 26 20 18 7 13 10 7 18 7 26 13 20 10 13 18 35 26 47
2019/1/19 算法设计与分析--减治法 11
5.2.2 二叉查找树
由二叉排序树的定义,在二叉排序树root中查找给定值k 的过程是: ⑴ 若root是空树,则查找失败; ⑵ 若k=根结点的值,则查找成功; ⑶ 否则,若k<根结点的值,则在root的左子树上查找; ⑷ 否则,在root的右子树上查找; 上述过程一直持续到k被找到或者待查找的子树为空, 如果待查找的子树为空,则查找失败。 二叉排序树的查找效率就在于只需要查找两个子树之一。
2019/1/19 算法设计与分析--减治法 12
63 55 42 10 45 58 70 90 10 83
55
42
45 58 63
70 83 90
67
67
(a) 按63,90,55,58,70,42,10,45,83,67 的顺序构造的二叉排序树
(b) 按55,42,10,70,63,58,83,67,90,45 的顺序构造的二叉排序树
high=13
high=2
mid=1
7<14
low=2
2019/1/19
mid=2
算法设计与分析--减治法 14=14
8
算法5.1——折半查找
1. low=1;high=n; //设置初始查找区间 2. 测试查找区间[low,high]是否存在,若不存在,则查找失败; 否则 3. 取中间点mid=(low+high)/2; 比较k与r[mid],有以下三种情况: 3.1 若k<r[mid],则high=mid-1;查找在左半区进行,转2; 3.2 若k>r[mid],则low=mid+1;查找在右半区进行,转2; 3.3 若k=r[mid],则查找成功,返回记录在表中位置mid;
[ ri … rk … rs-1 ] rs [ rs+1 … … rj ] 均 ≤ rs 轴值 均 ≥ rs [ ri … … rs-1 ] rs [ rs+1 …rk … rj ] 均 ≤ rs 轴值 均 ≥ rs
如果k<rmid查找这里
2019/1/19
如果k>rmid查找Байду номын сангаас里
算法设计与分析--减治法 7
例:查找值为14的记录的过程: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
7 14 18 21 23 29 31 35 38 42 46 49 52
low=1
18>14
mid=3
mid=7 31>14 high=6
0 T (n) T (n / 2) 1
n 1 n 1
应用减治法处理问题的效率一般是O(log2n)数 量级。
2019/1/19
算法设计与分析--减治法
5
5.2 查找问题中的减治法
5.2.1 折半查找 5.2.2 二叉查找树
2019/1/19
算法设计与分析--减治法
6
5.2.1 折半查找
2019/1/19 算法设计与分析--减治法 14
在二叉排序树上查找关键码等于给定值的结点的过程, 恰好走了一条从根结点到该结点的路径,和给定值的比较 次数等于给定值的结点在二叉排序树中的层数,比较次数 最少为1次(即整个二叉排序树的根结点就是待查结点), 最多不超过树的深度。
具有n个结点的二叉树的深度至少是 log2 n 1 ,至 多是n,所以,二叉排序树的查找性能在O(log2n)和O(n) 之间。
第5章 减治法
5.1 5.2 5.3 5.4 减治法的设计思想 查找问题中的减治法 排序问题中的减治法 组合问题中的减治法
2019/1/19
算法设计与分析--减治法
1
5.1 减治法的设计思想
规模为 n 的原问题的解与较小规模(通常是 n/2)的子问题的解之间具有关系: ( 1 )原问题的解只存在于其中一个较小规模的 子问题中; ( 2 )原问题的解与其中一个较小规模的解之间 存在某种对应关系。 由于原问题的解与较小规模的子问题的解之 间存在这种关系,所以,只需求解其中一个较小 规模的子问题就可以得到原问题的解。
基本思想:在有序表中,取中间记录作为比较对象,若给 定值与中间记录的关键码相等,则查找成功;若给定值小 于中间记录的关键码,则在中间记录的左半区继续查找; 若给定值大于中间记录的关键码,则在中间记录的右半区 继续查找。不断重复上述过程,直到查找成功,或所查找 的区域无记录,查找失败。
k [ r1 … … … rmid-1 ] rmid [ rmid+1 … … … rn ] (mid=(1+n)/2)
}
2019/1/19 算法设计与分析--减治法 24
5.3.2 选择问题
设无序序列 T =(r1, r2, …, rn),T 的第k(1≤k≤n) 小元素定义为T按升序排列后在第k个位置上的元 素。给定一个序列T和一个整数k,寻找 T 的第k小 元素的问题称为选择问题。 特别地,将寻找第n/2小元素的问题称为中值 问题。
n 1 n 1 且是偶数 n 1 且是奇数
O (log2n)
应用分治法得到an的计算方法是:
a n 2 n 2 a a
n
a
n 1 n 1
O (nlog2n)
2019/1/19
算法设计与分析--减治法
4
减治法只对一个子问题求解,并且不需要进行 解的合并。应用减治法(例如减半法)得到的算法 通常具有如下递推式:
2019/1/19 算法设计与分析--减治法 25
考虑快速排序中的划分过程,一般情况下,设待划分 的序列为ri ~ rj,选定一个轴值将序列ri ~ rj进行划分, 使得比轴值小的元素都位于轴值的左侧,比轴值大的元素 都位于轴值的右侧,假定轴值的最终位置是s,则:
(1)若k=s,则rs就是第k小元素; (2)若k<s,则第k小元素一定在序列ri ~ rs-1中; (3)若k>s,则第k小元素一定在序列rs+1 ~ rj中;
3.1 如果结点i的关键码小,则完全二叉树已经是堆,调整完毕;
3.2 否则将r[i]与r[j]交换;令i=j,转步骤2继续进行调整;
时间复杂性为O(log2n)。
2019/1/19 算法设计与分析--减治法 23
算法5.6——插入法调整堆 void InsertHeap(int r[ ], int k) //堆中有k个结点,现插入一个新结点k+1 { i=k+1; //置i为要插入的结点 while (i!=1) { j=i/2; //j为i的双亲结点 if (r[i]<r[j]) //待插入结点已小于根结点,调整结束 break; else { r[i]←→r[j]; //将根结点与结点j交换 i=j; //待插入点位于原来结点j的位置 } }
28
35 32 18 12 20 32 28 35
35
20 18
12
32
20 18 12
28
(a) 28与35交换
2019/1/19
(b) 28与32交换
算法设计与分析--减治法
(c) 将28筛到叶子
19
假设当前要筛选结点的编号为k,堆中最后一个结点的 编号为n,并且结点k的左右子树均是堆(即r[k+1] ~ r[n]满足 堆的条件),则筛选算法用伪代码可描述为:
堆顶和堆中最后 一个记录交换
r1 r2 … … ri
无序区 为一个堆
2019/1/19
ri+1 ≤… … ≤rn-1 ≤ rn
有序区 已经位于最终位置
算法设计与分析--减治法 18
堆调整问题:将一个无序序列调整为堆
(1)筛选法调整堆 关键问题:完全二叉树中,根结点的左右子树均是 堆,如何调整根结点,使整个完全二叉树成为一个堆?
算法5.3——筛选法调整堆 1. 设置i和j,分别指向当前要筛选的结点和要筛选结点的左孩子; 2. 若结点i已是叶子,则筛选完毕;否则,比较要筛选结点的左右 孩子结点,并将j指向关键码较大的结点; 3. 将要筛选结点i的关键码与结点j的关键码进行比较,有以下两种 情况: 3.1 如果结点i的关键码大,则完全二叉树已经是堆; 3.2 否则将r[i]与r[j]交换;令i=j,转步骤2继续进行筛选;