算法设计与分析第三章 分治法
算法设计与分析之分治法

求幂
问题:计算 简单算法: 分而治之算法:
如果 n 是偶数; 如果 n 是奇数
11/13/2014
算法设计与分析-分治法
12Βιβλιοθήκη 斐波纳契数递归定义:
简单的递归算法: (指数时间), 是黄金分割
11/13/2014 算法设计与分析-分治法 13
计算斐波纳契数
11/13/2014
算法设计与分析-分治法
18
分而治之算法
思想:
n× n 矩阵 = 2× 2 个 (n/2)× (n/2) 子矩阵:
r = ae+bg s = af +bh t = ce+dg u = cf +dh
11/13/2014
8 个 (n/2)× (n/2) 子矩阵相乘 4 个 (n/2)× (n/2) 子矩阵相加
5
二分查找
• 1. 2. 3. • 在排序的数组中查找元素 分解:检查中间元素 解决:递归查找一个子数组 组合:显而易见
例子:查找 9
11/13/2014
算法设计与分析-分治法
6
二分查找
在排序的数组中查找元素 1. 分解:检查中间元素 2. 解决:递归查找一个子数组 3. 组合:显而易见
例子:查找 9
11/13/2014
算法设计与分析-分治法
27
例子:查找 9
11/13/2014
算法设计与分析-分治法
9
二分查找
在排序的数组中查找元素 1. 分解:检查中间元素 2. 解决:递归查找一个子数组 3. 组合:显而易见
例子:查找 9
11/13/2014
算法设计与分析-分治法
算法设计与分析-分治法

3.2.1 归并排序
算法3.1——归并排序
void MergeSort(int r[ ], int r1[ ], int s, int t) {
if (s= =t) r1[s]=r[s]; //只有一个元素,直接赋值 else {
m=(s+t)/2; Mergesort(r, r1, s, m); //归并排序前半个子序列 Mergesort(r, r1, m+1, t); //归并排序后半个子序列 Merge(r1, r, s, m, t); //合并两个已排序的子序列 } }
A、B、C、D 四个区域
Ø想法
Ø 用二维数组data[N][N]表示N×N的方阵,观察方阵中数
字的规律,可以从外层向里层填数。 Ø 设变量size表示方阵的大小,则初始时size = N,填完一
层则size = size - 2;
Ø想法
Ø 设变量begin表示每一层的起始位置,变量i和j分别表示
MergeSort(r,r1,1,1) r1[1]=r[1]
Merge(r1,r,0,0,1)
MergeSort(r,r1,2,3)
MergeSort(r,r1,2,2) r1[2]=r[2]
MergeSort(r,r1,3,3) r1[3]=r[3]
Merge(r1,r,2,2,3)
Merge(r1,r,0,1,3)
• 分治思想 • 归并排序 • 快速排序 • 折半查找 • 选择问题 • 最大子段和问题 • 棋盘覆盖问题 • 循环赛日程安排问题
3.1 基本思想 3.2 排序问题中的分治算法 3.3 查找问题中的分治算法 3.4 组合问题中的分治算法 3.5 典型问题的C++程序(略)
算法设计与分析第三章 分治法

X15:X16
X15 X16
North China Electric Power University
§2 二分搜索技术
问题描述:给定已排序好的 个元素 个元素a[1:n],现在要在这 个元素 现在要在这n个元素 问题描述:给定已排序好的n个元素 现在要在这 中找出一特定元素x。 中找出一特定元素 。 二分搜索法的基本思想: 个元素分成大致相同的两半, 二分搜索法的基本思想:将n个元素分成大致相同的两半,取 个元素分成大致相同的两半 a[n/2]与x做比较,如果 做比较, 与 做比较 如果x=a[n/2]则,则找到 ,算法终止;如果 则 则找到x,算法终止; x≤a[n/2],则只要在 的左半部继续搜索;如果 的左半部继续搜索; ,则只要在a的左半部继续搜索 如果x>a[n/2],则 , 只要在a的右半部继续搜索 的右半部继续搜索。 只要在 的右半部继续搜索。 template <class Type> int Binary_Search(Type a[],int left ,int right,const Type &x) { if (left>right) return(-1); else { m=(left+right)/2; if (x==a[m]) then return(m) ; else if ( x>a[m]) return(Binary_Search(a,m+1,right,x)); else return(Binary_Search(a,left,m-1,x)); } }
分治法所能解决的问题一般具有以下几个特征(适用条件) 分治法所能解决的问题一般具有以下几个特征(适用条件)
1. 该问题的规模缩小到一定的程度就可以容易地解决; 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 2. 该问题可以分解为若干个规模较小的相同问题;即该问题具 有最优子结构性质; 有最优子结构性质; 利用该问题分解出的子问题的解可以合并为该问题的解; 3. 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的, 4. 该问题所分解出的各个子问题是相互独立的,即子问题之间 不包含公共的子问题。 不包含公共的子问题。
《算法分治法》课件

分治算法的步骤
分治算法的步骤还包括对问题进行归纳和分类,确定 问题的规模和复杂度,选择合适的分治策略和算法实 现方式等。
单击此处添加正文,文字是您思想的提一一二三四五 六七八九一二三四五六七八九一二三四五六七八九文 ,单击此处添加正文,文字是您思想的提炼,为了最 终呈现发布的良好效果单击此4*25}
分治算法的核心思想是将一个复杂的问题分解为若干个规模较小、相互独立、与 原问题形式相同的子问题,递归地解这些子问题,然后再将子问题的解合并,以 求得原问题的解。
分治算法的原理
分治算法的原理是利用问题的相似性,将大问题分解为小问 题,将复杂问题转化为简单问题,从而降低问题的难度,提 高解决问题的效率。
探索分治算法与其他算法(如贪心算法、动态规划等)的结合
,实现更高效的算法设计。
分治算法的理论基础研究
02
深入探讨分治算法的理论基础,为算法设计和优化提供理论支
持。
分治算法在实际问题中的应用研究
03
针对实际问题,研究分治算法的应用场景和解决方案,推动算
法的实际应用。
THANKS
感谢观看
对于可以并行处理的子问题,可以使 用多线程或分布式计算等技术进行并 行处理,进一步提高算法效率。
动态规划
动态规划是一种常用的优化技术,通 过将子问题存储在表格中并逐步更新 ,可以避免重复计算,提高算法效率 。
分治算法在实际项目中的应用案例
归并排序
归并排序是一种典型的分治算法,通过递归地将数组分解为若干个子数组,然后合并子数 组得到有序数组。在实际应用中,归并排序广泛应用于各种排序场景。
《算法分析与设计》(李春葆版)课后选择题答案与解析

《算法及其分析》课后选择题答案及详解第1 章——概论1.下列关于算法的说法中正确的有()。
Ⅰ.求解某一类问题的算法是唯一的Ⅱ.算法必须在有限步操作之后停止Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊Ⅳ.算法执行后一定产生确定的结果A.1个B.2个C.3个D.4个2.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是()。
A.T(n)=T(n-1)+1,T(1)=1B.T(n)=2nC.T(n)= T(n/2)+1,T(1)=1D.T(n)=3nlog2n答案解析:1.答:由于算法具有有穷性、确定性和输出性,因而Ⅱ、Ⅲ、Ⅳ正确,而解决某一类问题的算法不一定是唯一的。
答案为C。
2.答:选项A的时间复杂度为O(n)。
选项B的时间复杂度为O(n)。
选项C 的时间复杂度为O(log2n)。
选项D的时间复杂度为O(nlog2n)。
答案为C。
第3 章─分治法1.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。
这要求原问题和子问题()。
A.问题规模相同,问题性质相同B.问题规模相同,问题性质不同C.问题规模不同,问题性质相同D.问题规模不同,问题性质不同2.在寻找n个元素中第k小元素问题中,如快速排序算法思想,运用分治算法对n个元素进行划分,如何选择划分基准?下面()答案解释最合理。
A.随机选择一个元素作为划分基准B.取子序列的第一个元素作为划分基准C.用中位数的中位数方法寻找划分基准D.以上皆可行。
但不同方法,算法复杂度上界可能不同3.对于下列二分查找算法,以下正确的是()。
A.intbinarySearch(inta[],intn,int x){intlow=0,high=n-1;while(low<=high){intmid=(low+high)/2;if(x==a[mid])returnmid;if(x>a[mid])low=mid;elsehigh=mid;}return –1;}B.intbinarySearch(inta[],intn,int x) { intlow=0,high=n-1;while(low+1!=high){intmid=(low+high)/2;if(x>=a[mid])low=mid;elsehigh=mid;}if(x==a[low])returnlow;elsereturn –1;}C.intbinarySearch(inta[],intn,intx) { intlow=0,high=n-1;while(low<high-1){intmid=(low+high)/2;if(x<a[mid])high=mid;elselow=mid;}if(x==a[low])returnlow;elsereturn –1;}D.intbinarySearch(inta[],intn,int x) {if(n>0&&x>=a[0]){intlow= 0,high=n-1;while(low<high){intmid=(low+high+1)/2;if(x<a[mid])high=mid-1;elselow=mid;}if(x==a[low])returnlow;}return –1;}答案解析:1.答:C。
算法设计与分析第3讲 分治法

case 2: θ(logn)。
6
3.4 大整数的乘法
设计一个有效的算法,可以进行两个n位大整数的 乘法运算 小学的方法: θ(n2) 效率太低 分治法:
X=a2n/2+b Y=c2n/2+d XY=ac2n+(ad+bc)2n/2+bd
n/2位 n/2位 n/2位 n/2位
int特殊方格在此棋盘中chessboardtrtcdrdc号l型骨牌覆盖右下角boardtr覆盖其余方格cbtrtctrs1tcs1特殊方格在此棋盘中cbtrtcsdrdc号l型骨牌覆盖左下角boardtr覆盖其余方格cbtrtcstrs1tcs特殊方格在此棋盘中cbtrstcdrdc号l型骨牌覆盖右上角boardtr覆盖其余方格cbtrstctrstcs1特殊方格在此棋盘中cbtrstcsdrdc号l型骨牌覆盖左上角boardtr覆盖其余方格cbtrstcstrstcs1818复杂度分析说明
}
17
复杂度分析
说明:
整形二维数组Board表示棋盘,Borad[0][0]使棋盘的左上 角方格。 tile是一个全局整形变量,用来表示L形骨牌的编号,初 始值为0。 tr:棋盘左上角方格的行号;tc:棋盘左上角方格的列号; dr:特殊方各所在的行号;dc:特殊方各所在的列号; size:size=2k,棋盘规格为2k×2k。
15
分治策略求解
当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所 示。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘 中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特 殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处, 如 (b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问 题。递归地使用这种分割,直至棋盘简化为棋盘1×1。
《计算机算法设计与分析》课程设计

《计算机算法设计与分析》课程设计用分治法解决快速排序问题及用动态规划法解决最优二叉搜索树问题及用回溯法解决图的着色问题一、课程设计目的:《计算机算法设计与分析》这门课程是一门实践性非常强的课程,要求我们能够将所学的算法应用到实际中,灵活解决实际问题。
通过这次课程设计,能够培养我们独立思考、综合分析与动手的能力,并能加深对课堂所学理论和概念的理解,可以训练我们算法设计的思维和培养算法的分析能力。
二、课程设计内容:1、分治法:(2)快速排序;2、动态规划:(4)最优二叉搜索树;3、回溯法:(2)图的着色。
三、概要设计:分治法—快速排序:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
分治法的条件:(1) 该问题的规模缩小到一定的程度就可以容易地解决;(2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;(3) 利用该问题分解出的子问题的解可以合并为该问题的解;(4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
抽象的讲,分治法有两个重要步骤:(1)将问题拆开;(2)将答案合并;动态规划—最优二叉搜索树:动态规划的基本思想是将问题分解为若干个小问题,解子问题,然后从子问题得到原问题的解。
设计动态规划法的步骤:(1)找出最优解的性质,并刻画其结构特征;(2)递归地定义最优值(写出动态规划方程);(3)以自底向上的方式计算出最优值;(4)根据计算最优值时得到的信息,构造一个最优解。
●回溯法—图的着色回溯法的基本思想是确定了解空间的组织结构后,回溯法就是从开始节点(根结点)出发,以深度优先的方式搜索整个解空间。
这个开始节点就成为一个活结点,同时也成为当前的扩展结点。
在当前的扩展结点处,搜索向纵深方向移至一个新结点。
这个新结点就成为一个新的或节点,并成为当前扩展结点。
算法设计与分析讲义分治法

分别对左右两个子数组递归进行快速排序。
合并已排序的子数组
将两个已排序的子数组合并成一个有序数组。
快速排序的时间复杂度
1 2
最好情况
O(nlogn),即当数据已经有序时的时间复杂度 。
平均情况
O(nlogn),根据概率计算得到的平均时间复杂 度。
3
最坏情况
O(n^2),即当数据已经逆序时的时间复杂度。
合并的结果应该是原问题的 解
完善细节
01
对合并的结果进行检验和调整
02
对算法进行优化,提高运行效 率
03
处理特殊情况或异常情况
03
分治法的优化策略
动态规划优化
总结词
通过将问题拆分为子问题,并存储子问题 的解,以避免重复计算,提高算法效率。
VS
详细描述
动态规划是一种常见的优化技术,其基本 思想是将问题拆分为一系列子问题,并将 子问题的解存储起来,以便在需要时可以 重复使用。通过这种方式,可以避免重复 计算相同的子问题,从而提高算法效率。 此外,动态规划通常用于优化递归问题, 如背包问题、最长公共子序列等。
但是,如果每个子问题的规模很大, 则空间复杂度也可能很大。
THANKS
谢谢您的观看
02
分治法的基本步骤
分解问题
将原问题划分成若干个子问题 每个子问题都包含原问题的一部分 子问题的规模尽可能小,以便更容易解决
解决子问题
对每个子问题进行递归求解 子问题的解可以构成原问题的解的一部分 对每个子问题进行归纳,得出原问题的解
合并子问题的解
将子问题的解合并成一个整 体
合并的过程中需要处理数据 结构或数据类型的一致性
算法设计与分析讲义分治 法
算法设计与分析典型算法概述——分治法与贪心法

算法设计与分析典型算法概述▌分治法与贪心法▌拾光工作室分治法分治算法也叫分治策略,把输入分为若干个部分,递归的解每一个问题,最后将这些子问题合并成为一个全局解。
如果子问题较大,可以再次使用分治策略。
由此可以得到分治策略解决的问题特点:1.该问题的规模缩小到一定的程度就可以容易地解决;2.该问题可以分解为若干个规模较小的相同问题;3.分解出的子问题的解可以合并为原问题的解;4.分解出的各个子问题是相互独立的。
分治法的应用——二叉查找设a[i](1<=i<=n)是一个数组,其中的元素以非降序排列.考虑判断一个元素x是否在数组中的问题。
确定一个j,使得a[j]=x。
如果x在数组中返回j,否则,返回0。
分析该问题符合分治法策略解决问题的特点,可以用分治法解决:如果n=1,直接判断a[n]是否与x相等。
如果n>1,可以把问题分解如下新的问题:选择一个下标q(范围[i,l]中),比较x与a[q],则有三种情况:1.x=a[q].得到解。
2.x>a[q].问题范围转换为(l-q,a[q+1], (x)3.x<a[q].问题范围转换为(q-i,a[i], (x)转换的子问题可以继续分解。
二叉查找的递归算法int BinSrch(Type a[],int i,int n,Type x)//a[i..n]是非递减排列且 1<=i<=n;{if(n==i) { if(x==a[i]) return i;else return 0; }else{int mid=(i+n)/2;if(x==a[mid]) return mid;else if(x<a[mid]) return BinSrh(a,i,mid-1,x);else if(x>a[mid]) return BinSrh(a,mid+1,n,x);}}分治法的应用——查找最大值与最小值在n个元素中找出最大值和最小值首先看下简单的查找算法:void MaxMin(Type a[],int n,Type &max,Type &min){max=min =a[0];for(int i=1;i<n;i++){ if(a[i]>max) max=a[i];if(a[i]<min) min=a[i];}}算法的时间复杂度体现在比较的次数上,当a[n]中的元素是多项式,矢量及非常大的数时或字符串,元素的比较代价就比其他操作代价高的很。
03-算法设计与分析-分治法

Chapter 3 ANALYSIS OF ALGORITHMS
我们以前已做过很多递归算法的分析,给出了相应的 递归式; 例如: Hanoi塔: T(0)=0 T(n)=2T(n-1)+1 折半查找: T(0)=0; T(1)=1; T(n)=T(n/2)+1; 最复杂的是快速排序。
Chapter 3 ANALYSIS OF ALGORITHMS
Chapter 3 ANALYSIS OF ALGORITHMS
2. 展开递归式
T (n) 2T (n / 2) cn 2[2T (n / 2 2 ) cn / 2] cn 2 2 T (n / 2 2 ) 2cn 2 T (n / 2 ) 3cn
3 k k 3
设n b k T (n / b k ) T (1) 1 取i k T (n) a a d (b
k j j 0 k 1 k j
)
Chapter 3 ANALYSIS OF ALGORITHMS
k 1 j 0
T (n) a a d (b
k j
k j
3.4.1 递归式求解 有三种方法: (1). 猜一个解f(n),代入递归式,对n归纳证明 T(n)<=f(n),同时确定F(n)中的不定系数,使对所 有的n有T(n)<=f(n)。 (2). 展开递归式,直到式子的右边的T(m)均为初试 递归式(如T(0), T(1)). (3). 一般求法。 1 猜解: T(n)=1 if n=1; T(n)<=2T(n/2)+cn if n>1
Chapter 3 ANALYSIS OF ALGORITHMS
(3) T(n)=4T(n/4)+n3 d(n)= n3, 所以d(b)=8, 因a=4<d(b) 特解是: O(d(n))= n3
算法设计与分析_10算法设计-分治法

2020/7/20
算法设计与分析演示稿 纪玉波制
6
作(C)
2.在互不相同的n个数{x1, x2,…, xn}中,找出 最大和最小的数。
若用普通的算法为:
begin xmax←x1;xmin←x1 for i=2 to n do
算法设计与分析演示稿 纪玉波制
16
作(C)
上式的4次乘法可以由3次完成。
2020/7/20
算法设计与分析演示稿 纪玉波制
17Biblioteka 作(C)增加的加减运算只影响K1值,却使乘法减为三次, 为分析简单可近似认为K2和K1相等,令K= K1= K2, 则
2020/7/20
算法设计与分析演示稿 纪玉波制
18
作(C)
2020/7/20
算法设计与分析演示稿 纪玉波制
19
作(C)
显然较普通方法更有效。这种思想同样可 以用于十进制数的乘法中。
类似于上述两个例子,可以看出,一般情
者为xmin (3)如n>2,则 调用MAXMIN(x1, …, x[n/2]) 调用MAXMIN(x[n/2]+1,…, xn) 比较两个最大值,令大者为xmax 比较两个最小值,令小者为xmin。
2020/7/20
算法设计与分析演示稿 纪玉波制
8
作(C)
下面分析用此算法的比较次数。设T(n)表示元素个数 为n时的总比较次数,则
2020/7/20
算法设计与分析演示稿 纪玉波制
11
作(C)
2020/7/20
算法设计与分析演示稿 纪玉波制
12
2009-2010-2《算法分析》ppt-3分治法

合并排序
复杂度分析 O(1) n 1 T (n) 2T (n / 2) O(n) n 1 T(n)=O(nlogn) 渐进意义下的最优算法
合并排序(P97)
初始序列
[49] [38] [65] [97] [76] [13] [27]
第一步
[38 49]
[65 97]
[13 76]
例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。
整数划分问题
前面的几个例子中,问题本身都具有比较明显的 递归关系,因而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难 以找到递归关系,因此考虑增加一个自变量:将 最大加数n1不大于m的划分个数记作q(n,m)。可以 建立q(n,m)的如下递归关系。
大整数乘法
例 A=2348,B=3825 a1=23,a2=48,b1=38,b2=25 p=(a1+a2)(b1+b2)=71 *63=4473 q=a1b1=874, r=a2b2=1200 AB=8740000+(4473-874-1200)*100+1200 =8740000+239900+1200 =8981100
分治法的复杂性分析
O(1) n 1 T (n) kT (n / m) f (n) n 1
算法设计与分析讲义分治法

算法设计与分析讲义分治法xx年xx月xx日•分治法概述•分治法的基本思想•分治法的应用实例•分治法的优化目•分治法的局限性和注意事项•分治法的扩展阅读和练习建议录01分治法概述分治法是一种典型的递归问题求解方法,其基本思想是将一个规模较大的问题分解为两个或多个规模较小的子问题,递归地解决这些子问题,最终合并得到原问题的解。
分治法具有以下特点将问题分解为多个子问题,并对子问题进行递归求解;以空间换时间,需要额外的存储空间;可以将问题化简为多个相同或相似的子问题,从而减少计算量。
定义与特点010*******1分治法的重要性23分治法是一种非常重要的算法设计和分析方法,在很多算法中都有应用,如排序算法、搜索算法、图算法等。
分治法可以将一个复杂的问题分解为多个简单的子问题,从而降低问题的复杂度,提高算法的效率。
分治法的核心思想是将问题分解为多个相同的或相似的子问题,可以借助递归实现算法的优化,使算法的时间复杂度更低。
03随着计算机科学的发展,分治法在大数据处理、机器学习等领域也得到了广泛的应用。
分治法的历史与发展01分治法是一种非常古老的算法设计方法,可以追溯到中国古代的“鸡兔同笼”问题。
02分治法在算法领域得到了广泛的应用,其中最著名的就是快速排序算法。
02分治法的基本思想将问题划分为若干个子问题递归地解决子问题合并子问题的解以得到原问题的解分治策略治递归地解决子问题合将子问题的解合并以得到原问题的解分将原问题划分为若干个子问题归并排序算法将数组分为两半,递归地对每半进行排序,最后合并两个有序数组的解快速排序算法将数组划分为两个子数组,递归地寻找子数组的枢轴元素,并重新排列数组最短路径问题(Dijkstra算法)将图划分为若干个节点,从起点开始,逐步更新每个节点的距离值,最终得到到终点的最短路径03分治法的应用实例总结词高效、稳定详细描述归并排序是一种典型的分治法应用,它将待排序数组分割成若干子序列,对子序列进行排序,最后将排序结果合并。
算法设计与分析-分治法详解64页PPT

37、我们唯一不会改正的缺点是软弱。——拉罗什福科
xiexie! 38、我这个人走得很慢,但是我从不后退。——亚伯拉罕·林肯
39、勿问成功的秘诀为何,且尽全力做你应该做的事吧。——美华纳
40、学而不思则罔,思而不学则殆。——孔子
算法设计与分析-分治法详解
•
26、我们像鹰一样,生来就是自由的 ,但是 为了生 存,我 们不得 不为自 己编织 一个笼 子,然 后把自 己关在 里面。 ——博 莱索
•
27、法律如果不讲道理,即使延续时 间再长 ,也还 是没有 制约力 的。— —爱·科 克
•
28、好法律是由坏风俗创造出来的。 ——马 克罗维 乌斯
•
29、在一切能够接受法律支配的人类 的状态 中,哪 里没有 法律, 那里就 没有自 由。— —洛克
•
30、风俗可以造就法律,也可以废 法律。 ——塞·约翰逊
谢谢!
36、自己的鞋子,自己知道紧在哪里。——西班牙
《算法设计与分析》课程实验报告 (分治法(三))

《算法设计与分析》课程实验报告实验序号:04实验项目名称:实验4 分治法(三)一、实验题目1.邮局选址问题问题描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。
用x 坐标表示东西向,用y坐标表示南北向。
各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:给定n 个居民点的位置,编程计算邮局的最佳位置。
2.最大子数组问题问题描述:对给定数组A,寻找A的和最大的非空连续子数组。
3.寻找近似中值问题描述:设A是n个数的序列,如果A中的元素x满足以下条件:小于x的数的个数≥n/4,且大于x的数的个数≥n/4 ,则称x为A的近似中值。
设计算法求出A的一个近似中值。
如果A中不存在近似中值,输出false,否则输出找到的一个近似中值4.循环赛日程表问题描述:设有n=2^k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次,每个选手一天只能赛一次,循环赛一共进行n-1天。
二、实验目的(1)进一步理解分治法解决问题的思想及步骤(2)体会分治法解决问题时递归及迭代两种不同程序实现的应用情况之差异(3)熟练掌握分治法的自底向上填表实现(4)将分治法灵活于具体实际问题的解决过程中,重点体会大问题如何分解为子问题及每一个大问题涉及哪些子问题及子问题的表示。
三、实验要求(1)写清算法的设计思想。
(2)用递归或者迭代方法实现你的算法,并分析两种实现的优缺点。
(3)根据你的数据结构设计测试数据,并记录实验结果。
(4)请给出你所设计算法的时间复杂度的分析,如果是递归算法,请写清楚算法执行时间的递推式。
四、实验过程(算法设计思想、源码)1.邮局选址问题(1)算法设计思想根据题目要求,街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
算法设计与分析(三)-分治法共125页

算法设计与分析(三)-分治法
51、没有哪个社会可以制订一部永远 适用的 宪法, 甚至一 条永远 适用的 法律。 ——杰 斐逊 52、法律源于人的自卫本能。——英 格索尔
53、人们通常会发现,法律就是这样 一种的 网,触 犯法律 的人, 小的可 以穿网 而过, 大的可 以破网 而出, 只有中 等的才 会坠入 网中。 ——申 斯通 54、法律就是法律它是一座雄伟的大 夏,庇 护着我 们大家 ;它的 每一块 砖石都 垒在另 一块砖 石上。 ——高 尔斯华 绥 55、今天的法律未必明天仍是法律。 ——罗·伯顿
1、最灵繁的人也看不见自己的背脊。——非洲 2、最困难的事情就是认识自己。——希腊 3、有勇气承担命运这才是英雄好汉。——黑塞 4、与肝胆人共事,无字句处读书。——周恩来 5、阅读使人充实,会谈使人敏捷,写作使人精确。——培根
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机算法设计与分析
Computer Algorithms Design & Analysis
华北电力大学计算机科学与工程系
Dept. of Computer Science&Engineering of North China Electric Power University
North China Electric Power University
分治§3 分治-归并排序
问题: 个元素的排序问题 即将n个元素按一定规则排列成一 个元素的排序问题, 问题:n个元素的排序问题,即将 个元素按一定规则排列成一 个有序序列。 个有序序列。 简单选择排序的思想:将这 个元素存储在一个数组中 个元素存储在一个数组中, 简单选择排序的思想:将这n个元素存储在一个数组中,首先 通过n-1次比较找出这个数组中的最小元素 次比较找出这个数组中的最小元素, 通过 次比较找出这个数组中的最小元素,并将这个元素与 数组中的第一个交换。 数组中的第一个交换。如果挑选出的元素恰好占交换后应占 的元素位置,则交换不必进行。 次在剩余的 次在剩余的n-i+1个元素中 的元素位置,则交换不必进行。第i次在剩余的 个元素中 找出最小元素与第i个元素交换。重复这一步骤,直到i=n-1。 找出最小元素与第 个元素交换。重复这一步骤,直到 。 个元素交换 其时间复杂性为: 其时间复杂性为: T(n)=T(n-1)+n-1 T(n) n-1 T(n)=n-1+n-2+…+2+1+0 =n(n-1)/2
North China Electric Power University
Байду номын сангаас
分治的具体过程: 分治的具体过程:
if 问题规模小到可以直接解决 直接解决该问题 else 将问题分解成k 将问题分解成k个规模较小的子问题 for(i=1;i<=k;i++) 递归调用该分治算法, 递归调用该分治算法,分别解决每一个子问题 将各子问题的解合并为原问题的解
North China Electric Power University
分治策略算法的复杂度分析 T(n)=af(n/b)+d(n) 他的复杂度分析采用递归算法提到的Master Master定理 他的复杂度分析采用递归算法提到的Master定理
伪币问题]: 例 [伪币问题 : 伪币问题 给你一个装有1 个硬币的袋子 个硬币的袋子。 个硬币中有一个是伪 给你一个装有 6个硬币的袋子。1 6个硬币中有一个是伪 造的,并且那个伪造的硬币比真的硬币要轻一些。 造的,并且那个伪造的硬币比真的硬币要轻一些。给你一台 没有砝码的天平,试用较少的测量次数找出这个伪币。 没有砝码的天平,试用较少的测量次数找出这个伪币。
North China Electric Power University
设在n个元素的数组中查找 需要的比较次数为 设在 个元素的数组中查找x需要的比较次数为 个元素的数组中查找 需要的比较次数为T(n),如果每 , 次比较x和 根本不在L中 次比较 和a[m]时,总有 时 总有x<>a[m],即x根本不在 中,则: , 根本不在 T(n)=2+T(n/2),T(1)=1 该方程的解为T(n)=O(logn)。 该方程的解为 。 所以在最坏情况下二分查找法的复杂度为O(logn)。 所以在最坏情况下二分查找法的复杂度为 。 T(n) T(n/2) …… T(1) 2 2 2 2 2 …… 2 2log n= Θ(log n)
金块问题] 例:[金块问题 金块问题 老板有一袋金块(共 块 的幂( 老板有一袋金块 共n块,n是2的幂(n>=2)),将有两名 是 的幂 ), 最优秀的雇员每人得到其中的一块, 最优秀的雇员每人得到其中的一块,排名第一的得到最重的 那块,排名第二的雇员得到袋子中最轻的金块。 那块,排名第二的雇员得到袋子中最轻的金块。假设有一台 比较重量的仪器, 比较重量的仪器,我们希望用最少的比较次数找出最重的金 块。 也就是这样一个问题,同时求 个数中的最大值和最小值 也就是这样一个问题 同时求n个数中的最大值和最小值, 同时求 个数中的最大值和最小值, n为2的整数次幂。 的整数次幂。 为 的整数次幂
North China Electric Power University
第三章 分治法
★ ★ ★ ★ ★
分治法的基本思想 二分搜索技术 合并排序 大整数乘法 Strassen矩阵乘法 矩阵乘法 矩阵
★ 第K小元素问题
North China Electric Power University
§1 分治法的基本思想
T(n-1) n-2 …… T(1) 0
North China Electric Power University
分治-归并排序算法是用分治策略实现对 个元素进行排序的算法 分治 归并排序算法是用分治策略实现对n个元素进行排序的算法。 归并排序算法是用分治策略实现对 个元素进行排序的算法。 基本思想: 时终止排序, 基本思想:当n=1时终止排序,否则将待排序元素分成大小大致 时终止排序 相同的两个子集,分别对两个子集进行排序, 相同的两个子集,分别对两个子集进行排序,最终将排序好的 子集合并成为所要求的排序好的集合。 子集合并成为所要求的排序好的集合。 template <class Type> void Msort(Type r[],Type r1[],int s,int t); { if (s=t) r1[s] = r[s] else { m = (s+t)/2; //将r[s..t]平分为 平分为r[s..m]和r[m+1..t] 将 平分为 和 Msort (r, r1, s, m); Msort (r, r1, m+1, t); Merge (r, r1, s, m, t); Copy(r1,r,s,t); } } template <class Type> void Merge_sort (Type r[],Type r1[],int n) { MSort(r, r1, 1, n); // 对记录序列 对记录序列r[1..t]作2-路归并排序 } 作
North China Electric Power University
T(n)
n
n
T(n/2)
n/2
T(n/2)
n/2
n
T(n/2) n/2
T(n/2) n/2
T(n/2) n/2
T(n/2) n/2
n n ……
Θ(nlog n)
North China Electric Power University
分治法所能解决的问题一般具有以下几个特征(适用条件) 分治法所能解决的问题一般具有以下几个特征(适用条件)
1. 该问题的规模缩小到一定的程度就可以容易地解决; 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 2. 该问题可以分解为若干个规模较小的相同问题;即该问题具 有最优子结构性质; 有最优子结构性质; 利用该问题分解出的子问题的解可以合并为该问题的解; 3. 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的, 4. 该问题所分解出的各个子问题是相互独立的,即子问题之间 不包含公共的子问题。 不包含公共的子问题。
North China Electric Power University
template <class Type> void Merge(Type r[],Type r1[],int s,int m,int t) { i=s; k=s; j=m+1; while ((i<=m) && (j<=t)) { if (r[i] <=r[j]) {[r1[k]=r[i]; i=i+1;} else { r1[k]=r[j]; j=j+1;} k=k+1; } if (i>m) Copy(r,j,t,r1); else Copy(r,i,m,r1); } Merge和Copy可以在 可以在O(n)时间内完成,因此分治归并排序算法 时间内完成, 和 可以在 时间内完成 所需的时间T(n)满足: 满足: 所需的时间 满足 O(1) n =2 T(n)= 2T(n/2)+O(n) n >2 2 解此递归方程可得T(n)=O(nlogn) 解此递归方程可得
North China Electric Power University
一般的算法设计模式如下: 一般的算法设计模式如下: Divide_and_Conquer(P) Divide_and_Conquer( if |P|≤n0 return(ADHOC( then return(ADHOC(P)) 分解为较小的子问题P1 P2、...、 P1、 将P分解为较小的子问题P1、P2、...、Pk for i←1 to k do Divide_and_Conquer(Pi) 递归解决Pi yi ← Divide_and_Conquer(Pi) △ 递归解决Pi MERGE(y1,y2,...,yk) T ← MERGE(y1,y2,...,yk) △ 合并子问题 Return( Return(T) 根据分治法的分割原则,原问题应该分为多少个子问 根据分治法的分割原则, 题才较适宜?各个子问题的规模应该怎样才为适当? 题才较适宜?各个子问题的规模应该怎样才为适当?这 些问题很难予以肯定的回答。但人们从大量实践中发现, 些问题很难予以肯定的回答。但人们从大量实践中发现, 在用分治法设计算法时,最好使子问题的规模大致相同。 在用分治法设计算法时,最好使子问题的规模大致相同。 换句话说,将一个问题分成大小相等的k 换句话说,将一个问题分成大小相等的k个子问题的处理 方法是行之有效的。 方法是行之有效的。