程序计算覆盖平面上所有点的最小直线数

问题描述

我想要一种算法,以找到能够覆盖所有给定点的最小直线数。

我在互联网上搜索了算法,到目前为止,我只在geeksforgeeks上找到了一篇稍有不同的文章,这是所有行都必须通过一个点的条件,但是我的问题是我没有意义参考。

链接文章= https://www.geeksforgeeks.org/minimum-lines-cover-points/

解决方法

通常,您可以每行分配任意两个点。因此,选择任意两个点,使它们通过一条线,选择下一对,并通过一条线,依此类推。我的最后一行仅剩一个点,没关系-您可以任意选择其方向(随机或固定方向)。

如果有任何一点是重合的,则将它们视为只是一点。穿过其中一个点的任何线都将穿过所有点。

当有3个或更多共线点的任何组时,您也可以将一条线穿过所有点,并且您希望按共线集大小的降序“吃掉”这些点。因此,如果您有一组3个共线点,而另一个有10个共线点,那么我想,贪婪是最有意义的,但也许可以设计出一些特殊情况,这并不是最好的方法。

无论如何,这都取决于您要解决的是实际问题还是想象中的问题(又称家庭作业)。如果是家庭作业问题,那么解决方案将与实际问题大不相同。

但是在该算法的几乎所有应用中,您应该实现的基本图元是找到共线点集,或者等效地将一组点划分为共线子集。

您必须允许通过点的线的宽度为非零,因为在合成示例之外,实点坐标(从物理数据获得)永远不会精确地位于线上,但是可能非常接近-那么,您只允许使用1微米宽的线还是20米宽的线就可以了。

术语“宽度”的确切含义取决于线的尺寸:它自然是2D中矩形的宽度,变成3D中圆柱体的直径(厚度),并且最终变成4维和更高维数据集中的超圆柱体的超直径。

在2D中,宽度是沿主线扫掠以创建矩形的线段的长度;在3D中,宽度是沿主线扫掠以创建圆柱的圆的直径;在4D中,其宽度为直径沿主线扫过的球体的球体产生了超圆柱体,依此类推。

现在,由于宽度的含义始终相同:从线到“通过”的点的最大允许距离,该算法可以轻松缩放到任意数量的尺寸:该距离就是您选择的矢量长度指标,也可以根据应用进行参数设置。欧几里得度量标准是一个很好的默认值,但是没有什么可以说它在所有情况下都有用。

最后,很多情况还取决于点所在的特定向量空间。您自然会想到R ^ n,即。实数的向量,但是当您使用浮点数时甚至都不是真的:那些不是实数而是有理数,因此,如果要保证完全的准确性,则需要使用可以对有理数进行精确算术的数值库-内部需要可变精度整数支持,现在您可以对这些主题进行愉快的探索。基本上,高级算法必须不对这些细节承担任何责任-它们是特定于应用程序的参数。如果您要使用通用应用程序,则使用任何特定类型来表示矢量或其坐标都是死胡同,这会使该算法仅对非常狭窄的应用程序有用。例如。如果在浮点中执行操作,将永远不会获得准确的结果,并且由于数值误差,对数据进行的简单更改(例如,对这些点进行置换(更改其顺序))会将一些共线的点重新分类为非共线的。精确算术意味着不会引入数值误差。您可能会做得很好,以允许您的算法具有足够的灵活性,以使这些细节可以使用eg来实现。 cgal库。它具有多种内核,包括可以以精确的方式回答诸如“此点距直线不远于给定距离”之类问题的精确内核。

您要使用的算法只是表面上的简单。使它对现实世界有用的实现细节绝非易事,需要对基础数学有很好的了解。这是在学习算法的过程中学习此类数学的一种非常不错的方式-有些人(包括我自己)在应用程序上下文中对数学的理解更好。我曾经使用过类似的算法,并且花了很多时间探索实现中涉及的数学之美!

实际上,Code Project和类似网站上介绍的几何“算法”都没有实际用途,因为它们写的是高中课程的数学深度:一个好的起点,但是您不能在不了解足够的数学知识的情况下直接插入产品,就无法阐明实现的局限性,尤其是不精确的算法,该算法仅基于对相同数据的改组而导致不同的输出(!!)是可以接受的任务。也许我们会-提醒您-但您确实需要能够清楚地说明原因,并显示示例,其中算法给出的结果不稳定,并证明整个应用程序不会受到影响。此外,您必须将其放入测试套件中,这样,如果您的应用程序中发生了某些更改,这些更改可能会默默地假设结果是稳定的,即使从精确的算术实现中来看,结果也会失败。

,

您有一个oracle,它查找通过所有点的最小行数和O(N)中的参考点。因此,您可以遍历给定的所有点,找到每个点的最小行数,然后在O(N ^ 2)时间中取最小的行数。 https://link.springer.com/chapter/10.1007/11758471_4是更有效的方法。