C语言分治算法求中位数,【算法复习】分治算法

Outline

分治思想和递归表达式

大整数乘法

矩阵乘法的Strassen算法

快速傅里叶变化

基于分治的排序

merge-sort排序

快速排序

排序的下界问题

中位数和顺序统计量

最邻近点对

凸包

Notes

## 分治思想和递归表达式

【分治思想】算法

将一个问题分解为与原问题类似但规模更小的若干子问题,递归地解这些子问题,而后将这些子问题的解结合起来构成原问题的解。这种方法在每层递归上均包括三个步骤:编程

divide(分解):将问题划分为若干个子问题

conquer(求解):递归地解这些子问题;若子问题Size足够小,则直接解决之

Combine(组合):将子问题的解组合成原问题的解

【分治递归表达式】数组

设T(n)是Size为n的执行时间,若Size足够小,如n ≤ C (常数),则直接求解的时间为θ(1)

①设完成划分的时间为D(n)

②设分解时,划分为a个子问题,每一个子问题为原问题的1/b,则解各子问题的时间为aT(n/b)

③设组合时间C(n)

则有递归方程总结为:

T(n)=θ(1) if n

T(n)=aT(n/b)+D(n)+C(n) if n≥c

技术细节(注意):

在声明、求解递归式时,经常忽略向上取整、向下取整、边界条件

边界条件可忽略,这些细节通常只影响常数因子的大小,不改变量级。求解时,先忽略细节,而后再决定其是否重要!

## 大整数乘法

*********优化划分阶段,下降T(n)=aT(n/b) + f(n) 中的 a*********ide

这里咱们假设有两个大整数X、Y,分别设X=123四、Y=5678。如今要求X*Y的乘积,小学的算法就是把X与Y中的每一项去乘,可是这样的乘法所需的时间复杂度为O(n^2),效率低下,咱们能够尝试使用分治来解决。函数

625429eb8caa1536506118125dc1a579.png

XY = (A2n/2 + B)(C2n/2 + D)优化

= AC2n + (AD+BC)2n/2 + BDui

= AC2n + ((A-B)(D-C)+AC+BD)2n/2 + BDidea

算法分析:

首先将X和Y分红A,B,C,D

此时将X和Y的乘积转化为上述式子,把问题转化为求解式子的值

此时递归式为 T(n)=4T(n/2)+θ(n)

算法复杂度T(n)=θ(n2)

继续优化: AD+BC=(B-A)(C-D)+AC+BD

算法过程:

划分产生A,B,C,D;

计算 B-A 和 C-D;

计算 n/2 位乘法 AC、BD、(B-A)(C-D);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值