我刚开始编程,今天我完成了二维空间中最近对问题的简单解法。(2个用于环路)
然而,我放弃了在O(n log n)中找到任何能解决这一问题的方法。即使在研究了它之后,我仍然不明白这怎么能比琐碎的方法更快。
我理解的是:->首先,我们将数组分成两半,只考虑X坐标对所有内容进行排序。这可以在n log n中完成。
接下来是递归调用,它们在每一半中“找到两个距离最小的点”。但是在O(n^2)下是怎么做到的呢?根据我的理解,如果不检查每一个点,就不可能找到N/2个点之间的最小距离。
有一个在一维的解决方案,这对我来说绝对是有意义的。经过排序,我们知道两个非相邻点之间的距离不能小于至少两个相邻点之间的距离。然而,这对于二维空间是不成立的,因为我们有一个附加的Y坐标,它可以导致在X轴上不相邻的两点之间的最小距离。
首先,听从用户@evg的建议--这个答案不能代替对算法的全面描述和数学上严谨的分析。
然而,这里有一些让直觉开始的想法:
>
(递归结构)问题说明:
(在一半中找到最近对的结果)
如果在点集的“左”一半中找到了最近对(p,q)
,则该对的距离设置了一个上界,该上界设置了围绕半线的走廊宽度,从该上界可以画出一个从左到右的r
和s
的更近的(r,s)
对。如果到目前为止找到的最近距离是“小”的,它会显著减少候选集的大小。由于点是按其x
坐标排序的,该算法可以有效地利用信息。所述走廊仍然可以覆盖n
点的整个集合,但如果覆盖了,它提供了点集几何形状的信息:每一半的点基本上将沿着一条垂直线对齐。这些信息可以通过算法加以利用--最简单的方法是再次执行算法,但沿着y
坐标排序,并将点集减半一条水平线。请注意,以恒定的次数执行任何算法不会改变由O(.)
表示法表示的渐近运行时间。
(查找每半个点的接近对)
考虑检查一对点(r,s)
,每半个点。已知它们的x
和y
坐标的差值不应超过到目前为止找到的最小距离d
。由递归可知,不可能有比d
更接近r、s
的点r'、s'
(左边r'
,右边s'
)。因此,给定一些R
,就不可能有来自另一半的“许多”候选者。
想象一个半径D
的圆画在R
周围。任何距离另一半s
比d
近的点必须位于该圆内。让它们有几个--然而,每对之间的最小距离仍然至少为d
。在半径d
的圆内可以分布的点的最大数目,使得每对点之间的距离至少为d
为7-考虑边长为d且其中心与圆心重合的正六边形。因此,在递归之后,最多需要将左半部分的每个R
与另半部分的最大恒定点数进行检查,这使得递归之后的算法部分在O(N)
中运行。
注意,为给定的R
寻找配对候选者是一个有效的操作-来自两个半部分的点数已按相同的准则排序。
主要内容:KNN算法原理,KNN算法流程,KNN预测分类本节继续探机器学习分类算法——K 最近邻分类算法,简称 KNN(K-Nearest-Neighbor),它是有监督学习分类算法的一种。所谓 K 近邻,就是 K 个最近的邻居。比如对一个样本数据进行分类,我们可以用与它最邻近的 K 个样本来表示它,这与俗语“近朱者赤,近墨者黑”是一个道理。 在学习 KNN 算法的过程中,你需要牢记两个关键词,一个是“少数服从多数”,另一个是“距离”,它们是实现 KN
介绍 KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思。KNN 也是一种分类算法。但是与之前说的决策树分类算法相比,这个算法算是最简单的一个了。算法的主要过程为: 1、给定一个训练集数据,每个训练集数据都是已经分好类的。 2、设定一个初始的测试数据a,计算a到训练集所有数据的欧几里得距离,并排序。 3、选出训练集中离a距离最近的
@subpage tutorial_py_knn_understanding_cn 了解kNN的基本知识。 @subpage tutorial_py_knn_opencv_cn 现在让我们在OpenCV中使用kNN进行数字识别(OCR)
目标 在本章中,我们将理解k-最近邻(kNN)算法的概念。 理论基础 kNN是可用于监督学习的最简单的分类算法之一。这个想法是在特征空间中搜索最接近的测试数据。我们用下面的图片来看看它是怎么工作的。 在图像中,有两类家庭,蓝色方块和红色三角形。我们称每种家庭为一个为Class。他们的房子被显示在他们的城镇地图上,我们称之为特征空间。 (您可以将一个特征空间视为所有数据投影的空间,例如,考虑一个二维
KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。 一句话总结:近朱者赤近墨者黑! k 近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k 近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预
我知道如何不用分而治之来解决这个问题,但我不知道用分而治之的方法。 感谢帮助!