算法设计学习笔记(五)分治策略


前言

本文是对于算法设计的学习笔记,如有错误,请不吝赐教。


一、分治策略

分治策略涉及一类算法设计技术,其中人们把输入分成若干部分,递归的求解每个部分的问题,然后把这些子问题组合成为一个全局的解。

二、归并排序算法

2.1 归并排序算法

将输入分成大小相等的两半,通过递归在这两部分分别求解两个子问题;然后把这个两个结果组合成一个全局的解,对于初始划分以及最后的组合只用线性时间。

运行时间分析:T(n)表示规模为n的实例上最坏运行时间
而递归调用满足以下关系:
T(n)<=2T(n/2)+cn
T(2)<=c

2.2 递推式的求解

1.展开递推式
在这里插入图片描述

在这里插入图片描述

2.将解带入归并排序的递推式(将Tn=onlogn带入)

3.使用部分替换的方法
即我们相信Tn=Onlogn,但我们不确定O记号内部的常数。通过设置Tn<=knlogbn来带入。

2.3 更多递推关系

更一般的递推式:
在这里插入图片描述
对于q>2个子问题的情况:

在这里插入图片描述
在这里插入图片描述

对于q=1的情况:
在这里插入图片描述
在这里插入图片描述
我们可以简要分析q在其中的影响意义。可以发现当q=1时,执行时间是线性的,而q>2是,他是被递归底部常数规模的子问题上的工作来支配的,而q=2就是一个边界,表示每层的工作量都是相同的。

2.4 拓展递推关系

讨论最后一个递推式 Tn<=2T(n/2)+O(n^2)
相关问题:把输入分成相等的两部分,用递归求解这两个部分的子问题,然后将结果组合成一个整体的解,其中初始的划分与最后的组合用平方时间

在这里插入图片描述
通过展开递归可得Tn=O(n^2)

三、计数逆序

3.1 问题

此处考虑一个在排名分析中产生的问题。(匹配与你类似口味的人)
该问题是对于两个排名进行比较的问题。如何判断两个排名的相似度是一个问题。其中一个比较自然的指标是次序出错。
如:

在这里插入图片描述

3.2 算法设计

针对这个问题最简单的方式就是检查每对数,但需要O(n^2)
为了降低所需时间,采用分治法的策略。
即将表分成两部分,递归求逆序数

在这里插入图片描述

算法:

Merge-and-Count(A,B)
current指针,指向首元素
count计数逆序的个数
While两个表都不空
令ai与bi都是有current指针指向的元素
把两个中较小的计入到输出表
if bi较小 then
 count+a中的剩余元素数
endif
current指针移动
endwhile
如果表为空,则把另一个表剩余的所有元素加到输出中
返回count和合并后的表
Sort-and-Count(L)
if 这表由一个元素 then
没有逆序
else 
把表划分成两半A,B
(ra,A)=sort-and-count(A)
(rb,B)=sort-and-count(B)
(r,L)=sort-and-count(A,B)
endif
返回r=ra+rb+r以及拍好的表L

此时递推公式满足5.1
所以为O(nlogn)

四、找最邻近的点对

4.1 问题

寻找最邻近的点对是一个最自然的算法问题,能够运用在许多领域如图形学,计算机视觉、地理信息系统以及分子建模的。
给定平面上的n个点,找最邻近的一对点。

4.2 设计算法

通过将点集分成左右半边,然后寻找左半边最邻近的点以及右半边最邻近的点,然后再在全局中寻找来在线性时间内得到全局的解。
在这里插入图片描述
在这里插入图片描述
通过上述命题能够减少问题的规模
在这里插入图片描述
在这里插入图片描述
此处提醒了我们可以对点的y坐标也进行排序,从而找到相遇y的最近的十五个点之间的距离。

Closet-Pair(P)
构造px,py Onlogn
p0*,p1*=closet-Pair-Rec(Px,Py)

closet-pair-rec(px,py)
if(|p|<=3 then
度量两点间的距离找出最近的点对。
endif

构造Qx,Qy,Rx,Ry (On 时间)
q0*,q1*=closet-Pair-Rec(Qx,Qy)
r0*,r1*=closet-Pair-Rec(Rx,Ry)
 
θ=min(d(q0*,q1*),d(r0*,r1))
x*=集合Q中的最大x坐标
L={(x,y),x=x*}
S=P与L相聚θ的距离内的点集

构造Sy O(n)
for Sy中的每个点 计算从s到跟着Sy的15个点钟的每个距离
令s,s'是最小距离点对  O(n)

if d(s,s')< θ then
return s,s'
else if d(q0'q1*)<d(r0',r1*) then
return q0,q1
else 
return r0,r1
endif

算法的运行时间为Onlogn

五、整数乘法

5.1 问题

计算两个整数的相乘

5.2 算法设计

将x,y两个数分别分成高位和低位两个部分(此处假设为2进制)
在这里插入图片描述

此时递推公式为T(n)=4T(n/2)+cn

此时可以通过乘法的法则来讲子问题改为3个。

Recursive-Miltiply(x,y)
x=x1*2^n/2+x0
y=y1*2^n/2+y0
计算x1+x0 与y1+y0
p=Recursive-Miltiply(x1+x0,y1+y0)
x1y1=Recursive-Miltiply(x1,y1)
x1y1=Recursive-Miltiply(x0,y0)
return x1y1*2^n+(p-x1y1-x0y0)*2^n/2+x0y0

六、卷积与快速傅里叶变换

6.1 问题

卷积:

在这里插入图片描述
或者:
在这里插入图片描述
然后通过沿对角线(副对角线)求和来获得卷积向量中的坐标
对于两个不同长度的向量am和bn,a*b为一个有m+n-1个坐标的向量。坐标k为
在这里插入图片描述

相关卷积的应用:1.多项式的乘积 2.信号处理(平滑操作) 3.组合直方图

快速傅里叶变换(FFT):在数值序列的分析中有着广泛的进一步应用。

6.2 算法设计

多项式差值:任何d阶多项式可以由它在任何一组d+1个或者更多的点上的值重新构造出来。
如何将多项式的值分为两个大小相等的问题——多项式的奇偶项。

在这里插入图片描述
在这里插入图片描述
对于i)中的2n个密切相关的值,可以采用单位1的复数根。(?)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值