首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分治最近问题

蛮力 算法思想 蛮力,顾名思义,即穷举所有点与之间的距离,两层循环暴力找出最近算法执行可视化如图1所示,word文档GIF静态显示,附件已含动图。...表1 分析: 由实验结果可知,蛮力的实验值与理论值基本一致,算法的时间复杂度确实为O(n2),确实很慢。...分治 算法思想 先进行预处理按横坐标排序,然后每次将均分成左右两个子集,最短距离的两个要么都在左子集,要么都在右子集,要么一个点在左子集中,一个点在右子集中,对于前面两种情况,问题变成递归寻找子集的最短距离...表3 分析: 由实验结果可知,分治明显远远快于蛮力,小规模数据时实验值略小于理论值,大规模时实验值与理论值基本一致。...图9 在数据规模为10w到100w上与原始分治对比,如图10所示。

15120

原 初学算法-分治求平面上最近(Cl

本来这个算法在笔者电脑里无人问津过一段时间了,但今天正好做HDU 1007见到了这个问题,今天就来把代码分享出来吧!     ...那么最短距离一定在左半部分、右半部分、跨越左右的中的一个。      那么你可能会有疑问了:本来最近也一定在这三个区域内,这不还是相当于什么都没干吗?     还真不是。...我们可以假设通过递归得到了左边最小距离为d1,右边最小距离为d2,令δ = min(d1,d2)     如图所示,如果跨越左右的可能是最短距离,那么它也必然比δ小。...另外,可以证明对于每个矩形区域,最多尝试8个一定能找到最短距离(算法导论第33.4节有详细的证明,这里不再赘述)。     ...下面,通过这个算法,我们就可以写出一份代码来: /**  * Find closest distance in N points.

1.5K150
您找到你想要的搜索结果了吗?
是的
没有找到

分治应用--最近问题 & POJ 3714

问题描述 二维平面上有n个,如何快速计算出两个距离最近? 2....解题思路 暴力做法是,每个与其他去计算距离,取最小的出来,复杂度O(n2) 采用分治算法 将数据点按照 x 坐标排序,找到中位,过中位划线 x = mid_x 将数据分成2部分,递归划分,直到两个半边只有...范围内的左右才有可能距离比 d 更小(好理解) 这个范围内的,再按照 y 坐标排序,查找两个的 y 差值小于 d 的(重点在这里,见下面分析),计算其距离是否比 d 更小 ?...假如在这个范围内的有1,2,3,4,5,6六个(按 y 坐标排序),寻找距离小于 d 的,如果暴力查找,复杂度还是 n2,我们可以看出点4只有可能在其上下y坐标 ± d 的范围内找到满足距离小于...实现代码 /** * @description: 2维平面寻找距离最近分治) * @author: michael ming * @date: 2019/7/4 23:16 * @modified

65210

计算几何 平面最近 nlogn分治算法 求平面中距离最近的两

平面最近,即平面中距离最近的两 分治算法: int SOLVE(int left,int right)//求解集中区间[left,right]中的最近 { double ans...分析当前集合[left,right]中的最近,有两种可能: 1....当前集合中的最近的两同属于集合[left,mid]或同属于集合[mid,right] 则ans = min(集合1中所有点的最近距离, 集合2中所有点的最近距离...于是我们可以对temp以y为唯一关键字从小到大排序,进行枚举, 更新ans,然后在枚举时判断:一旦枚举到的与py值之差大于ans,停止枚举。最后就能得到该区间的最近。...return sqrt ( (double) ( (a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ) ); } /*分治求计算几何中平面点最近距离

2.4K20

经典优化算法分治(Divide-and-Conque Algorithm)

1 目录 1.1 分治基本介绍 1.2 分治通俗解释 1.3 分治严谨定义 1.4 分治的流程 1.5 分治的经典例子 1.6 总结 2 分治基本介绍 分治分治,即分而治之。...4 分治严谨定义 4.1 分治算法主定理 分治算法通常遵守一种通用模式:即:在解决规模为n的问题时,总是先递归地求解a个规模为n/b的子问题,然后在 ?...ADHOC(P)是该分治中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。...算法导论: 动态规划要求其子问题既要独立又要重叠,这看上去似乎有些奇怪。虽然这两要求听起来可能矛盾的,但它们描述了两种不同的概念,而不是同一个问题的两个方面。...两个子问题俩说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,是重叠的,则它们是重叠的。 ---- 6 分治算法的经典例子 6.1 归并排序 ?

5K33

hdu1007平面最近分治

题目大意:给你N,求这N点中两队的距离的一半,精确到小数点后两位 暴力显然O(n^2),不能过。 分治即可,N,求中间值,mid。...按照横坐标升序排列,递归求出0到mid以及mid+1到N-1的最小距离。 分治关键步骤在合并。 我们求出两个最小距离,但是没有考虑一个点在左边,一个点在右边的情况。  ...先求出两个最小距离中较小的一个,记为mdis   根据mid为分界【mid-mdis,mid+mdis】的闭区间筛选出可能取得最小距离的,因为平面上的还包含纵坐标,所以水平 距离不在这个范围内不可能是最短距离...同理再进入暂时数组(记为temp)的按纵坐标分类,再次筛选,并不断更新mdis 的值。

61410

常见算法设计方法-分治

分治(Devide & Conquer) 1....举例分析 归并排序就是常见的一种采用“分治”进行设计的算法,以下先给出具体的C#版代码示例 /// /// 列表进行递归排序 /// </summary...,归并算法的递归部分在于不断地将待排序数组分为左右两个等长的数组直至左右列表中都只含有一个元素,再继续进行Merge操作,前者递归所花费的时间可以简单表示成2T(n/2),后者排序可以认为是θ(n),则总时间可以表示成...这里是主定理的相关说明 针对T(n)=aT(n/b)+f(n)的函数式子(a≥1,b>1),我们可以知道归并排序算法的函数符合主定理的第二种情况,即如果存在常数k ≥ 0,有 f(n)=θ(n^...这里的k=0,则归并算法最终的时间复杂度T(n)=θ(n㏒n) 额外补充一个二分实例 /// /// 二分查找 ///

66790

3.算法设计与分析__分治

棋盘覆盖问题 4.3 循环赛日程安排问题 5 几何问题中的分治 5.1 最近问题 5.2 凸包问题 1 概 述 1.1 分治的设计思想 将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破...5.1 最近问题 设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个构成的集合S,最近问题就是找出集合S中距离最近。...严格地讲,最接近可能多于一,简单起见,只找出其中的一作为问题的解。 用分治解决最近问题,很自然的想法就是将集合S分成两个子集 S1和 S2,每个子集中有n/2个。...按这种分治策略求解最近问题的算法效率取决于划分点m的选取,一个基本的要求是要遵循平衡子问题的原则。...递归地在S1和S2上求解最近问题,分别得到S1中的最近距离d1和S2中的最近距离d2,令d=min(d1, d2),若S的最近(p, q)之间的距离小于d,则p和q必分属于S1和S2,不妨设p∈S1

68220

有趣的算法(十一) ——分治:大数相乘

有趣的算法(十一)——分治:大数相乘 (原创内容,转载请注明来源,谢谢) 太大的两个数字相乘,有可能会超出计算机的位数,需要人工进行转化。...2、尝试优化分治的思想进行优化,即将一个大的数字拆成两半的长度(不是数值的1/2,是字面上的折成两半),再进行计算。...即T(n)=4T(n/2)+θ(n),根据算法中的master定理,算出结果是O(n2)。结果和上面的算法是一样的,但是有了分析思路。...3、再次优化 master定理中,n的阶数和T(n)=4T(n/2)+θ(n)中的4这个系数密切相关,对于当前场景来说,就是4次乘法太多了,要想办法减少乘法次数。...即T(n)=3T(n/2)+θ(n),由master定理,得到结果是O(nlog3)≈O(n1.59),达到优化的目的。

1.4K30

算法学习-分治-大整数乘法

基本问题 大整数乘法(C)请设计一个有效的算法,可以进行两个n位大整数的乘法运算。 设X和Y都是n位的二进制整数,现在要计算它们的乘积XY。...我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要作O(n^2)步运算才能求出乘积XY。 ?...下面我们用分治来设计一个更有效的大整数乘积算法。 我们将n位的二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见,假设n是2的幂),如图6-3所示。 ?...要想改进算法的计算复杂性,必须减少乘法次数。...极端情况, 直接按位计算,相当于分为N段, 就回到了这个文章开始提出的原始算法了. (这个似乎与前文矛盾了,但是个人觉得这种解释是有道理的。)

2.5K20

每周算法练习——最近问题

一、最近问题的解释     看到算法书上有最近的问题,简单来讲最近问题要求出一个包含 ? 个的集合中距离最近的两个。...二、最近问题的蛮力解法     蛮力是最直接的方法,就是求解任意两个之间的距离,返回坐标和最小的距离 Java代码实现 package org.algorithm.closestpair; /*...三、最近问题的分治解法     分治的思想是将一个问题划分成几个独立的子问题,分别对子问题的求解,最终将子问题的解组合成原始问题的解。...个人理解的分治与现在的并行十分相似,如在演化计算中,由于运算规模比较大,十分强调是否可以并行计算,本身演化计算又特别适合做并行。再如Map-Reduce,同样是一种并行的计算方式。...如何将原始问题划分成子问题成为分治的关键。     在最近问题中,首先通过一维坐标将整个空间分成坐标点个数相同的两个区间,如下图: ?

1.3K40

每周算法练习——最近问题

一、最近问题的解释     看到算法书上有最近的问题,简单来讲最近问题要求出一个包含 个的集合中距离最近的两个。抽象出来就是求解任意两个之间的距离,返回距离最小的的坐标,以及最小距离。...二、最近问题的蛮力解法     蛮力是最直接的方法,就是求解任意两个之间的距离,返回坐标和最小的距离 Java代码实现 package org.algorithm.closestpair; /*...double result[] = Util.closestPair(p, length); System.out.println("最近为:"); System.out.println...((int) result[0] + "\t" + (int) result[1] + "\t" + Math.sqrt(result[2])); } } 最终的结果 三、最近问题的分治解法...个人理解的分治与现在的并行十分相似,如在演化计算中,由于运算规模比较大,十分强调是否可以并行计算,本身演化计算又特别适合做并行。再如Map-Reduce,同样是一种并行的计算方式。

1K60

算法分析】分治详解+范例+习题解答

分治 1.分治(Divide-and-Conquer) 1.1分治的设计思想 1.2分治的适用条件 1.3分治的基本步骤 1.4主定理Master Theorem 2.范例 2.1合并排序 2.1.1...3.3矩阵走 3.4排序 3.4.1合并排序 3.4.2快速排序 3.4.2.1复杂度 3.5线性时间选择算法 3.6快速排序中第k小的元素的算法 3.6.1复杂度 4.书后习题 2-4 大整数乘法的...O(nm ^log(3/2)^) 2-5 2-27 以中位数为基准的选择问题 2-31 1.分治(Divide-and-Conquer) 1.1分治的设计思想 将一个难以直接解决的大问题,分割成一些规模较小的相同问题...这条特征涉及到分治的效率,如果各子问题是不独立的,则分治要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治,但一般用动态规划较好。...设计算法,计算序列a[n]中的逆序数 3.3矩阵走 有一个5×4的矩阵,从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,总共有多少种走

1.7K30

Maximum Subarray (Kadane算法 动态规划 分治

【分析】 这是一道非常简单的算法题,但是实现的方法却有很多种。在本篇文章中,博主想介绍三种巧妙的方法,这三种方法在面试和刷题过程中有非常广泛的应用。...方法一:Kadane算法 算法描述: 遍历该数组, 在遍历过程中, 将遍历到的元素依次累加起来, 当累加结果小于或等于0时, 从下一个元素开始,重新开始累加。...{ maxSoFar = maxEndHere; } } return maxSoFar; } 理解此算法的关键在于...global = Math.max(global, maxLocal); } return global; } } ---- 方法三:分治...int helper(vector& nums,int l,int r){ if(l>r)return INT_MIN;//注意此处不是返回0,比如{-2,-1},分治以后变为左中右

3.7K30

《python算法教程》Day11 - 分治求解平面凸包问题平面凸包问题简介分治求解思路与直线的位置判断代码示例

这是《python算法教程》的第11篇读书笔记,笔记主要内容是使用分治求解凸包。 平面凸包问题简介 在一个平面点集中,寻找点集最外层的,由这些所构成的凸多边形能将集中的所有点包围起来。...convexHull.png 分治求解思路 按照暴力的思路(求出所有由集任意两的直线,再获取使得点集剩余的点在该直线的一侧的直线)去求解凸包问题,显然算法复杂度达到了n^3,这并不是在时间复杂度上可以接受的算法...因此,可考虑使用分治去求解凸包。大体思路如下: 1.找出由横坐标最大、最小的两个p1p2所组成的直线。用该直线将集分成上下两set1,set2部分。...plt.show() #---------------------------------------------------------------------- #下包的右包进一步划分...minSize=float('inf') minDot=() #med_x=(seq[len(seq)//2][0]+seq[-len(seq)//2-1][0])/2 #序列划分为直线

1.9K80

优化算法——牛顿(Newton Method)

一、牛顿概述     除了前面说的梯度下降法,牛顿也是机器学习中用的比较多的一种优化算法。...牛顿的基本思想是利用迭代点 处的一阶导数(梯度)和二阶导数(Hessen矩阵)目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,并不断重复这一过程,直至求得满足精度的近似极小值。...牛顿的速度相当快,而且能高度逼近最优值。牛顿分为基本的牛顿和全局牛顿。...二、基本牛顿 1、基本牛顿的原理 2、基本牛顿的流程 三、全局牛顿     牛顿最突出的优点是收敛速度快,具有局部二阶收敛性,但是,基本牛顿初始点需要足够“靠近”极小点,否则,有可能导致算法不收敛...1、全局牛顿的流程 image.png 2、Armijo搜索    四、算法实现     实验部分使用Java实现,需要优化的函数 最小值为 1、基本牛顿Java实现 package org.algorithm.newtonmethod

2K50
领券