分治算法

思想:将原问题划分成n个规模较小,并且与原问题相似的子问题。递归解决子问题,然后合并结果

要求:
1)原问题与分解成的小问题具有相同的模式
2)小问题可以独立求解
3)具有分解终止条件
4)可以将子问题合并成原问题

如何编程求出一组数据的逆序对个数?
逆序对个数:存在 2,4,3,1,5,6,逆序对个数为4,分别为2-1 4-1 3-1 4-3
其实可以参考归并排序,如 1,5,6,2,3,4中逆序对求解
可以拆分为 1,5,6 和2,3,4的数组合并,合并过程中可以计算。

分治思想在海量数据中的应用
10Gb订单按照金额排序:
桶排序 1-100 100-200... 分好之后,每个桶内排序。

二维平面上有 n 个点,如何快速计算出两个距离最近的点对?
1)将数据点按照 x 坐标排序,找到中位点,过中位点划线 x = mid_x 将数据分成2部分,递归划分,直到两个半边只有1个或者2个数据,只有1个数据点,最短距离返回无穷大,有2个点直接返回2点的距离
2)合并左右两边的结果,取左右两边的最短距离的较小值为 d = min{dl,dr},那么在 x = mid_x 的 ± d 范围内的左右点对才有可能距离比 d 更小(好理解)
3)对这个范围内的点,再按照 y 坐标排序,查找两个点的 y 差值小于d的点对(重点在这里,见下面分析),计算其距离是否比 d 更小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值