算法-分治法PPT课件

合集下载

分治法大整数乘法课件.ppt

分治法大整数乘法课件.ppt

else
copy B[i ... p 1] to A[k ... p q 1]
}
合并排序递归算法演示: 01 2 3 4 5 6 [35 4309 7420 49 349 8702 4890]
[35 40 4792 7429] [39 8409 4890]
[35 40] [4792 4792] [39 80] [49]
i
j
k
{ i 0, j 0, k 0
while i p and j q do
if (B[i] C[ j]) // 等号的作用?
A[k] B[i], i i 1
else A[k] C[ j], j j 1
k k 1 // i, j, k 指向下一个元素
if (i p) copy C[ j ... q 1] to A[k ... p q 1]
问题S的解
分治算法的概要描述
DivideandConquer ( s ) { if ( | s | t ) then adhocery(s) // 子集求解 else
{ divide s into smaller subset s1, s2 , sk // k个子集 for i 1 to k do
copy A[n / 2 ... n 1] to C [0 ... n / 2 ] MergeSort(B) // 递归拆分 MergeSort(C ) // 递归拆分 Merge(B,C, A) } // 合并B,C A } // 分解过程无基本操作
合并
Merge(B [0 ... p 1], C [0 ... q 1], A [0 ... p q 1])
right
如果i此<j时接,则,下i交>来j换,扫会l[描分i]找和结别到l束[把j小;]主把,继于元l[续主l两e各元f侧t]自的和的的l两[扫j]个交描换

2023年高中信息技术教学课件 分治算法 PPT

2023年高中信息技术教学课件  分治算法  PPT
• 其中L_ans,R_ans是与计算ans相同类型的子问题, 递归计算即可。主要考虑(i,j)分立两侧的逆序对数 C_ans:
• 结论:对两半段的数分别排序, (i 在左半段,j 在右 半段,排在不同位置不影响先后关系) ,C_ans 不变
• 例如:对于A=[3 2 5 1 4],分成两段A1 = [3 2 5], A2 = [1 4],对A1 和A2 进行排序,A’ = [2 3 5 1 4], C_ans 仍 然为4(3>1,2>1, 5>1, 5>4)
• 此时把原问题分解成4个结构与原问题一样的子问题, 棋盘的大小(边长)每次减半,最终会出现边长为1的 情况,直接求解即可。
经典问题1—棋盘覆盖
• 定义cover(x,y,len,x0,y0)表示求解左上角格子在(x,y)边长为len,其中(x0,y0)不能 覆盖的棋盘覆盖方案。
• 根据黑色格子的位置分为以下四种情况: • 情况1:黑点位于左上部分
• 考虑第一段中两个数A[i],A[j],如果i<j,则A[i] 肯定 比A[j] 要早出现
• 策略:比较两个序列最小的数, 谁小谁在前; 重复比 较直到没有数为止。时间复杂度为O(n)。
1356
2478
12
3
456
7
8
经典问题2—归并排序—代码
• void merge(l,m,r)// 合并操作
=4*(2*F(n’/8)+n’/4)+2*n’=8*F(n’/8)+3*n’ =……=2^k*F(1)+k*n’=2^k+k*2^k=n’+n’*lgn’ • 设n’<=n<2*n’,则有F(n’)<=F(n)<F(2*n’) • n’+n’lgn’<=F(n)<=2*n’+2*n’*lg(2*n’) • n’+n’lgn’<=F(n)<=2*n’+2*n’*lg2+2*n’*lgn’ • 所以F(n)=O(nlgn)。

五大常用算法ppt课件

五大常用算法ppt课件

桥了。
A B→ 2 A←1
AC → 5 A←1
AD → 8
一共就是2+1+5+1+8=17分钟。
Your company slogan
贪心算法
但其实有更快的办法: AB→2 A←1 CD→8 B←2 AB→2
一共是2+1+8+2+2=15分钟。这个办法的聪明之处在于让两个走得最慢的人同时过桥, 这样花去的时间只是走得最慢的那个人花的时间,而走得次慢的那位就不用另花时间过 桥了。可以把所有可能的方案都列举一遍,就会发现这是最快的方案了。
Your company slogan
贪心算法
2015年周得水等人提出一种基于Dijkstra的贪心算法来实现模糊连接度的快速计算。 基于模糊连接度的图像分割过程如下: (1)由用户在图像中选取种子点; (2)计算图像中各点相对于种子点的模糊连接度,同时得到各点到种子点的最优路径; (3)对得到的最优路径进行各点相对于种子点的属性相似度计算,同时得到图像中各点新 的隶属度; (4)用户通过选取阈值来分割图像。
1. if |P|≤n0
2. then return(ADHOC(P)) 3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk
4. for i←1 to k 5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi 6. T ← MERGE(y1,y2,...,yk) △ 合并子问题
后将各子问题的解合并得到原问题的解。(分治与递归)
适用情况: 1) 该问题的规模缩小到一定的程度就可以容易地解决; 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

算法课件

算法课件
的子矩阵,结论仍然是成立的。把2n 行2n列的两个矩阵A、B分 割成2n-1 行2n-1列的四块,即下图中的项目被作相应的替换:
A11,A12, A21,A22, B11, B12, B21, B22
2013-8-12
27
可 以 对 Strassen 算 法 的 复 杂 性 进 行 分 析 得 到 , 设 n=2N

2013-8-12 11
两数相乘 我们研究两个n位二进制数相乘的问题。假 设两个一位数相乘,两个一位数相加和任何数 移位一步所需运算时间均为O(1),即均为常数。 用普通的方法运算,将乘数的每一位(由低位 至高位)逐个去乘被乘数,每乘一次将乘积与 原来的积相加,然后乘数和乘积移位一步,如 此下去直至乘数的最高位运算完即得出结果, 这样运算共需n2 次一位乘一位运算,n(n-1)次 一位加一位运算和n次移位,总运算复杂性为O (n2)。
2013-8-12 8 T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
分治策略的两种情形

原始问题的解只存在于分解出的某一个子问 题中。如:在图书馆查找某一本书。 原始问题的解需要由各个子问题的解再经过 综合处理得到。如:评优工作。
算法设计与分析
——分治技术
2013-8-12
1
分治法(divide-and-conquer)
分治策略是一种用得最多的一种有效方法, 它的基本思想将原问题分解成若干子问题,然后 逐个求解子问题,在此基础上得到原问题的解。 求解子问题较原问题无疑是要容易些,由此得出 原问题的解,就是所谓的“分而治之”的意思。 使用这种策略往往能降低原始问题的难度,或者 提高解决问题的效率。分治策略还可以递归进行, 即子问题仍然可以用分治策略来处理,最后的问 题可以是非常基本而简单的问题。

算法递归与分治策略25页PPT

算法递归与分治策略25页PPT
算法递归与分治策略
51、没有哪个社会可以制订一部永远 适用的 宪法, 甚至一 条永远 适用的 法律。 ——杰 斐逊 52、法律源于人的自卫本能。——英 格索尔
53、人们通常会发现,法律就是这样 一种的 网,触 犯法律 的人, 小的可 以穿网 而过, 大的可 以破网 而出, 只有中 等的才 会坠入 网中。 ——申 斯通 54、法律就是法律它是一座雄伟的大 夏,庇 护着我 们大家 ;它的 每一块 砖石都 垒在另 一块砖 石上。 ——高 尔斯华 绥 55、今天的法律未必明天仍是法律。 ——罗·伯顿
61、奢侈是舒适的,否则就不是奢侈 。——CocoCha nel 62、少而好学,如日出之阳;壮而好学 ,如日 中之光 ;志而 好学, 如炳烛 之光。 ——刘 向 63、三军可夺帅也,匹夫不可夺志也。 ——孔 丘 64、人生就是学校。在那里,与其说好 的教师 是幸福 ,不如 说好的 教师是 不幸。 ——海 贝尔 65、接受挑战,就可以享受胜利的喜悦 。——杰纳勒 尔·乔治·S·巴顿Fra bibliotek谢谢!

《算法分治法》课件

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

二分治专题座PPT课件

二分治专题座PPT课件

时间复杂度
令t(n)表示MaxMin需要的元素比较次数, 存在下列递推关系
0
n1
t(n)
1
n2
t(n/2)t(n/2)2 n2
当n是2的幂时, 即对于某个正整数k, n=2k, 有
t(n)=2t(n/2)+2 = 2(2t(n/4)+2)+2 = 4t(n/4)+4+2
=2k-1t(2)+
2i
=2k-1+2k-2 1ik 1
else b[k++]=a[h++]; } if(l>mid)
while (h<=high) b[k++]=a[h++]; /* 转储剩余部分 */ else
while(l<=mid) b[k++]=a[l++]; a[low : high]=b[low : high]; /* 将b数组转储到a */ }
已分类的部分
未分类的部分
a[1] … a[j-1] a[j] a[j+1] … a[n]
插入分类算法
InsertSort(int n) { for(j=1; j<n; j++)
{ for( unsorted=a[j], k=j-1; (k>=0)&&(unsorted <a[k]); k-- ) a[k+1]=a[k];
a[k+1]= unsorted; } }
时间复杂度
考虑内层for循环中元素比较的次数T(n)
最好情况: 最坏情况:
T(n)=O(n) T(n)==1+2+…n-1==O(n2)

算法-分治法演示课件

算法-分治法演示课件
//对应情况①,递归求解 rightsum=MaxSum(a, center+1, right);
//对应情况②,递归求解
2020/6/28
30
s1=0; lefts=0;
//以下对应情况③,先求解s1
for (i=center; i>=left; i--)
{
lefts+=a[i];
if (lefts>s1) s1=lefts;
}
s2=0; rights=0;
//再求解s2
for (j=center+1; j<=right; j++)
{
rights+=a[j];
if (rights>s2) s2=rights;
}
sum=s1+s2;
//计算情况③的最大子段和
if (sum<leftsum) sum=leftsum;
//合并,在sum、leftsum和rightsum中取较大者
2020/6/28
15
[ r1 … … ri-1 ] ri [ ri+1 … … rn ] 均≤ri 轴值 均≥ri 位于最终位置
❖归并排序按照记录在序列中的位置对序列进行划分, ❖快速排序按照记录的值对序列进行划分。
2020/6/28
16
以第一个记录作为轴值,对待排序序列进行划分的过程为: (1)初始化:取第一个记录作为基准,设置两个参数i,j;
2020/6/28
13
算法4.4——合并有序子序列
void Merge(int r[ ], int r1[ ], int s, int m, int t) {
i=s; j=m+1; k=s; while (i<=m && j<=t) {

算法设计与分析-第四章1-常用算法策略迭代蛮力分治PPT课件

算法设计与分析-第四章1-常用算法策略迭代蛮力分治PPT课件

.
4
数学建模:y1=y2=1,yn=yn-1+yn-2,n=3,4,5,……。
算法1:
main( ) { int i,a=1,b=1;
print(a,b); for(i=1;i<=10;i++)
{ c=a+b; print (c); a=b; b=c;
} }
.
5
算法2:
表4-1 递推迭代表达式
12 3
.
21
【例2】牛顿迭代法 牛顿迭代法又称为切线法,它比一般的迭代法有更高的收敛速度,如图 4-5所示。首先, 选择一个接近函数f(x)零点的x0, 计算相应的f(x0)和 切线斜率f‘(x0)(这里f ’表示函数f的导数)。然后我们计算穿过点 (x0,f (x0))且斜率为f ‘(x0)的直线方程为:
{a[1]=a[i]=1; for (j=i-1,j>1,j=j-1) a[j]=a[j]+a[j-1];
for (j=1;j<=i;j=j+1) print(a[j]); print(“换行符”);
} }
.
13
【例3】穿越沙漠问题 用一辆吉普车穿越1000公里的沙漠。吉普车的总装油量为500加仑, 耗油率为1加仑/公里。由于沙漠中没有油库,必须先用这辆车在 沙漠中建立临时油库。该吉普车以最少的耗油量穿越沙漠,应在 什么地方建油库,以及各处的贮油量。
问题分析:题目中要求用一个一维数组即完成。 1 4 6 4 1
数组空间一定是由下标从小到大利用的,这 ……………
样其实杨辉三角形是按下图4-2形式存储的。 图4-1 杨辉三角形
若求n层,则数组最多存储n个数据。
算法设计:
A[1] = A[i]=1 A[j] = A[j] + A[j-1] i行 i-1行 i-1行

算法分析与设计PPT教学课件 Algorithms Chapter 4 分治法

算法分析与设计PPT教学课件 Algorithms Chapter 4 分治法

n>1
Memory 冒泡 合并 Time
15
Example of merge sort
Example of merge sort sorting a list of random numbers
16
练习 p98-11 Tromino谜题
如何将右图中L型瓦片覆盖到一个缺了一 个方块的2n × 2n的棋盘?
//输入:两个有序数组B[0..p-1]和C[0..q-1]
//输出:非降序列数组A-0..p+q-1] i0; j0; k0; while (i<p and j<q do){
if (n>1){
copy A[0.. [n/2]-1] to B[0..[n/2]-1] ; copy A[[n/2]..n-1] to C[0..[n/2]-1]; Mergesort(B[0..[n/2]-1]);
5
分治法的抽象化控制
1. 2. 3. 4. 5. 6. 7. Divide-and-Conquer(P) if |P|≤n0 判断输入规模是否足够的小 then return(ADHOC(P))//直接解小规模的问题P 将P分解为较小的子问题 P1 ,P2 ,...,Pk for i←1 to k do yi ← Divide-and-Conquer(Pi)//递归解决Pi T ← MERGE(y1,y2,...,yk) // 合并子问题 return(T)
...... ......
I2=(n-[n/2], A[[n/2]-1…n-1])
...... ......
Ih=(1,A[0])
Ii=(1,A[1])
Ij=(1,A[m])
Ik=(1,A[n])

算法分析与设计分治法ppt课件

算法分析与设计分治法ppt课件
定理2.3 :设A(1:n)含有n(n≥1)个不同的元素,排序为 A(1)<A(2)<…<A(n)。又设以比较为基础去判断是否x∈A(1:n) 的任何算法在最坏情况下所需的最小比较次数是FIND(n),那么 FIND(n)≥[log(n+1)]
证明 若一棵二元树的所有内部结点所在的级数小于或等于级数k,
195 142 111 2 1 NO
X=82 Low high mid
195 697
898 OK
二分检索算法正确性的证明
用五个特性判断是否是一个算法
根据算法的描述,满足五个特性的才是算法
证明算法是否正确
如果n=0,则不进入循环,j=0,算法终止 否则就会进入循环与数组A中的元素进行比较 如果x=A[mid],则j=mid,检索成功,算法终止 否则,若x<A(mid),则缩小到A(low)和A(mid-1)之间
I=(n,A(1),…,A(n))
I1=([n/2],A(1),…,A([n/2])) I2=(n-[n/2],A([n/2]+1),…,A(n))
… …
递归求取最大和最小元素
Procedure MAXMIN(i,j,fmax,fmin) integer i,j;global n,A(1:n) case
=2k+3*2k-1-3
=5n/2-3 当n较大时,比较次数会远远大于直接比较算法
2.4 归并分类(排序)
问题描述 给定一个含有n个元素(或叫关键字)的集合,把它们按一 定的次序分类(如非降次序排序)
一般方法(插入法) For j2 to n do
将A(j)放到已分类集合A(1:j-1)的正确位置上 Repeat
二分检索的时间复杂度

算法分析与设计第四章2分治法归并分类PPT课件

算法分析与设计第四章2分治法归并分类PPT课件

{
item=a[j];i=j-1;
while(i>=1&&item<a[i])
{
a[i+1]=a[i];i=i-1;
}
a[i+1]=item;
}
}
2008-09-01
i指示的是j之前的一位, 即当前已排序子表的 最末一个元素的下标
4
性能分析
输入数据按非增次序排列,每次内层while循 环执行j次(j=1,2,…, n-1)。
i 1 2 3 4 5 6 7 8 9 10 a[i] 6 7 8 9 2 3 4 5 0 1
i 1 2 3 4 5 6 7 8 9 10 a[i] 2 3 4 5 6 7 8 9 0 1
步骤4:length=8
i 1 2 3 4 5 6 7 8 9 10 a[i] 0 1 2 3 4 5 6 7 8 9
16
public static void MergeSort(int n,int DataLength) { //n为待合并数据个数
int i,t; //循环计数变量 i=1; //还有两段长度为DataLength的list可合并 while(i<=(n-2*DataLength+1)) {
Merge(i, i+DataLength-1, i+2*DataLength-1); i=i+2*DataLength; } if(i+DataLength<n) {//合并两段list,一段长度为DataLength,另一段长度不足DataLength Merge(i, i+DataLength-1, n); } else {//将剩下一段长度不足DataLength的list中的值不变 } }

算法设计与分析-分治法详解64页PPT

算法设计与分析-分治法详解64页PPT

37、我们唯一不会改正的缺点是软弱。——拉罗什福科
xiexie! 38、我这个人走得很慢,但是我从不后退。——亚伯拉罕·林肯
39、勿问成功的秘诀为何,且尽全力做你应该做的事吧。——美华纳
40、学而不思则罔,思而不学则殆。——孔子
算法设计与分析-分治法详解

26、我们像鹰一样,生来就是自由的 ,但是 为了生 存,我 们不得 不为自 己编织 一个笼 子,然 后把自 己关在 里面。 ——博 莱索

27、法律如果不讲道理,即使延续时 间再长 ,也还 是没有 制约力 的。— —爱·科 克

28、好法律是由坏风俗创造出来的。 ——马 克罗维 乌斯

29、在一切能够接受法律支配的人类 的状态 中,哪 里没有 法律, 那里就 没有自 由。— —洛克

30、风俗可以造就法律,也可以废 法律。 ——塞·约翰逊
谢谢!
36、自己的鞋子,自己知道紧在哪里。——西班牙

分治算法PPT

分治算法PPT

第一步
[38 49] [65 97] [13 76] [27]
第二步 第三步
[38 49 65 97]
[13 27 76]
18
[13 27 38 49 65 76 97]
归并排序主函数
void mergesort(int A[], int l, int r, int T[]) {
if(l < r) { int mid = (l + r) / 2; //二分 mergesort(A, l, mid, T);//继续对左子序列递归排序 mergesort(A, mid+1, r, T);//继续对右子序列递归排序 merge(A, l, mid, r, T); //合并
8
方法1
假设袋中有n个金块。可以通过n-1次比较找到最重 的金块。然后可以从余下的n-1个金块中用类似的方 法通过n-2次比较找出最轻的金块。这样,比较的总 次数为2n-3。具体的实现方法如下:
max = a[1]; min = a[1]; for(i=2; i<=n; i++) //2n-2次比较 {
问题,最后合并其结果就得到原问题的解。当分解(Divide):将原问题分成一系列子问题。 解决(Conquer):递归地解各子问题。若子问题
足够小,则可直接求解。 合并(combine);将子问题的结果合并成原问题
的解。
14
分治思想
问题的分解
方法1:每枚硬币都至少进行了一次比较,而有一枚硬 币进行了15次比较
方法2:每一枚硬币只进行了一次比较 方法3:将硬币分为两组后一次比较可以将硬币的范
围缩小到了原来的一半,这样充分地利用了只有1枚 伪币的基本性质。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分析时 间性能
an
a
=
a
n
2
´ a n 2
34
如果 n = 1 如果 n > 1
32
32
分解问题
31
31
31
31
求解每个子问题
3
3
3
3
9
9
合并子问题的解
81
❖ 不是所有的分治法都比简单的蛮力法更有效。
2020/11/20
7
4.1.2 数字旋转方阵
问题:输出NN(1N10)数字旋转方阵。
1 20 19 18 17 16 2 21 32 31 30 15 3 22 33 36 29 14 4 23 34 35 28 13 5 24 25 26 27 12 6 7 8 9 10 11
2020/11/20
13
算法4.4——合并有序子序列
void Merge(int r[ ], int r1[ ], int s, int m, int t) {
i=s; j=m+1; k=s; while (i<=m && j<=t) {
if (r[i]<=r[j]) r1[k++]=r[i++]; //取r[i]和r[j]中较小者放入r1[k] else r1[k++]=r[j++]; } if (i<=m) while (i<=m) //若第一个子序列没处理完,则进行收尾处理 r1[k++]=r[i++]; else while (j<=t) //若第二个子序列没处理完,则进行收尾处理
18
算法4.5——一次划分
int Partition(int r[ ], int first, int end)
{ i=first; j=end; //初始化 while (i<j)
{
while (i<j && r[i]<= r[j]) j--; //右侧扫描
2020/11/20
10
r1 … … rn/2 rn/2+1 … … rn r‘1<… …<r’n/2 r’n/2+1<… …<r’n
划分 递归处理
r''1<……<r''n/2<r''n/2+1 <……<r ''n
合并解
举例:8 3 2 6 7 1 5 4
2020/11/20
11
算法4.3——归并排序
r1[k++]=r[j++]; }
2020/11/20
14
4.3.2 快速排序
快速排序的分治策略是: (1)划分:选定一个记录作为轴值,以轴值为基准 将整个序列划分为两个子序列;
(2)求解子问题:分别对划分后的每一个子序列 递归处理; (3)合并:由于对子序列r1 … ri-1和ri+1 … rn的排序 是就地进行的,所以合并不需要执行任何操作。
第4章 分治法
分治法是最著名的算法设计技术。
4.1 概 述 4.2 排序问题中的分治法 4.3 组合问题中的分治法 4.4 几何问题中的分治法
2020/11/20
1
4.1 概 述
4.1.1 分治法的设计思想 4.1.2 数字旋转方阵
2020/11/20
2
4.1.1 分治法的设计思想
将一个难以直接解决的大问题,划分成一些规模 较小的子问题,分别求解各个子问题,再合并子问 题的解得到原问题的解。
2020/11/20
15
[ r1 … … ri-1 ] ri [ ri+1 … … rn ] 均≤ri 轴值 均≥ri 位于最终位置
❖归并排序按照记录在序列中的位置对序列进行划分, ❖快速排序按照记录的值对序列进行划分。
2020/11/20
16
以第一个记录作为轴值,对待排序序列进行划分的过程为: (1)初始化:取第一个记录作为基准,设置两个参数i,j;
r[i]=r1[i];
}
}
2020/11/20
12
二路归并排序的合并步的时间复杂性为O(n), 所以,二路归并排序算法存在如下递推式:
T (n)
=
1
2T
(n
2)
+n
n =1 n >1
可得二路归并排序的时间代价是O(nlog2n)。
二路归并排序在合并过程中需要与原始记录序列同 样数量的存储空间,因此其空间复杂性为O(n)。
2020/11/20
4
启发式规则:
1. 平衡子问题:最好使子问题的规模大 致相同。 2. 独立子问题:各子问题之间相互独立。
2020/11/20
5
分治法的典型情况
原问题 的规模是n
子问题1 的规模是n/2
子问题1的解
子问题2 的规模是n/2
子问题2的解
原问题的解
2020/11/20
6
例:计算an,应用分治技术得到如下计算方法:
void MergeSort(int r[ ], int s, int t)
{ int m, r1[1000]; if (s= =t) return;
else { m=(s+t)/2; Mergesort(r, s, m); //归并排序前半个子序列 Mergesort(r, m+1, t); //归并排序后半个子序列 Merge(r, r1, s, m, t); //合并两个已排序的子序列 for (int i=s; i<=t; i++) //将有序序列传回数组r中
如果子问题的规模仍然不够小,可继续分解下去。
2020/11/20
3
分治法的求解过程:分-治-合
(1)划分:把规模为n的原问题划分为k个规模较 小的子问题,并尽量使这k个子问题的规模大致相同。
(2)求解子问题:各子问题的解法与原问题的解 法通常是相同的,可以用递归的方法求解各个子问题。
(3)合并:把各个子问题的解合并起来,分治算 法的有效性很大程度上依赖于合并的实现。
(2)右侧扫描过程:
(3)左侧扫描过程:
(4)重复(2)(3)步,直到i与j指向同一位置,即基准记 录最终的位置。
2020/11/20
150 13 49
65
i
jj
j
13 27 55 50 38 49 65
i
ii
j
13 27 38 50 55 49 65
ij j j
2020/11/20
66的旋转方阵
2020/11/20
8
4.2 排序问题中的分治法
4.2.1 归并排序 4.2.2 快速排序
2020/11/20
9
4.3.1 归并排序
二路归并排序的分治策略是: (1)划分:将待排序序列r1, r2, …, rn划分为两个 长度相等的子序列r1, …, rn/2和rn/2+1, …, rn; (2)求解子问题:分别对这两个子序列进行排 序,得到两个有序子序列; (3)合并:将这两个有序子序列合并成一个有 序序列。
相关文档
最新文档