学习编程知识的同时,梳理知识,也便于以后查找
tags:《图解算法》、《算法图解》、B站视频
分而治之、递归、快速排序
分而治之
有时候,我们可能会遇到任何已知的算法都无法解决的问题,这时候就要尝试使用掌握的各种问题解决方法来找出解决方案。
分而治之(D&C)就是一种通用的问题解决方法。
快速排序也是使用的分而治之的策略。
分而治之是一种著名的递归式问题解决方法。
简而言之,就是将一个问题分割成一些小问题,并且递归地解决后,再利用这些小问题的解合并成原来大问题的解。
示例
- 如曹冲称象
- 有一块土地,想要将其均分成方块,且分出来的方块尽可能大。
使用D&C解决问题的过程包括两个步骤:
- 使用基线条件,这种条件必须尽可能简单
- 不断将问题分解(或者说缩小问题规模),直到符合基线条件。
适用于这小块地的最大方块,也是适用于整块地的最大方块。
换言之,适用于整个问题的方法,也适用于缩小问题规模后的整个问题!
欧几里得算法
其中原理参阅欧几里得算法
重点在于这种思路
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–