算法学习笔记_分而治之

学习编程知识的同时,梳理知识,也便于以后查找
tags:《图解算法》、《算法图解》、B站视频
分而治之、递归、快速排序

分而治之

有时候,我们可能会遇到任何已知的算法都无法解决的问题,这时候就要尝试使用掌握的各种问题解决方法来找出解决方案。

分而治之(D&C)就是一种通用的问题解决方法。
快速排序也是使用的分而治之的策略。

分而治之是一种著名的递归式问题解决方法。

简而言之,就是将一个问题分割成一些小问题,并且递归地解决后,再利用这些小问题的解合并成原来大问题的解。

示例

  • 如曹冲称象
  • 有一块土地,想要将其均分成方块,且分出来的方块尽可能大。

使用D&C解决问题的过程包括两个步骤:

  1. 使用基线条件,这种条件必须尽可能简单
  2. 不断将问题分解(或者说缩小问题规模),直到符合基线条件。

适用于这小块地的最大方块,也是适用于整块地的最大方块。换言之,适用于整个问题的方法,也适用于缩小问题规模后的整个问题!

欧几里得算法

其中原理参阅欧几里得算法

重点在于这种思路

D&C不是一种可用于解决问题的算法,而是一种解决问题的思路。

分而治之应用案例

找最大值

从一些数据中找出其中的最大值。

将数组分割为两个均等的小数组,递归地找它们的最大值。

二维极点问题

将寻找最大值的问题扩展到坐标平面上,则成了二维极点问题。

一个平面上的点的坐标时用两个整数(x,y)表示。当x1>x2,且y1>y2时、我们说一个平面上的点(y)支配另一个点。即在图中右上方的点支配左下方的点。

二维极点问题就是在一些平面 上的点中找到那些没有被其他点支配的点、也就是极点(maxima)。直觉上,极点就是所有坐标点中那些位居在上方的一些坐标点。

若给定n个点,任意两点需要比较一次,总共要比几次?

从n个点中任意选取两点的所有组合,也就是C(n, 2)或
在这里插入图片描述

算法实现

在这里插入图片描述

时间复杂度:O(n log n)

寻找第k小值问题

分组:分成几个较小的小数组

算法实现

在这里插入图片描述

分而治之法的技巧

一个问题可被分而治之法解决, 也营隐含此问题可被井行处理。

  • 使用分而治之法时的注意事项。

    • 分割:尽可能快速地将问题平均地分割。若能将问题平均地分制成几个小问题,则可降低所需的运行时间。

    • 克服( conquer) :利用递归解决分割后的小问题。

    • 合并(merge):尽可能快速地合并上述小问题的解,成为原问题的解。合并时所需的时间会影响整个算法所需的运行时间。

  • 可被分而治之法解决的常见问题

    • 合并排序(merge sort) :是一个利用矩阵中邻近的数字两两合并,将数字从小到大排列的方法。

    • 二分搜索法( binary search) :利用一组已从小到大(或从大到小)排序好的数值进行特定数值的搜索。每次取出搜索区间的中间数值,与欲搜索的值进行比较后,舍弃不可能的一半数值,并到可能存放的另一半区域继续寻找。直到寻得或确定不存在,才停止搜索。

    • 前缀和(prefix sum) :计算一 维矩阵B,使得B[]中存储着从A矩阵中第个值加到第i(1≤i≤n)个值的总和。此技巧常被用于设计并行处理的算法。

    • 矩阵相乘问题:将两个矩阵快速相乘的问题。

    • 邻近配对问题( closest pair problem ) :找出平面点中最靠近的两点的

    • 凸包问题(convex hull problem) :找出一个包含所有输人平面点的最小凸多边形的问题。

    • 维诺图( Voronoi diagrams ) :将每一个平面点x分割落于单独的一个区域,使得另一个新加的平面点y落于此区域时,其最近的点为x。此算法技巧可用于无线移动设备(y) 快速地寻找最近的基站(x)。

–END–

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值