Algorithm 近似最近对算法

Algorithm 近似最近对算法,algorithm,graph,computational-geometry,closest-points,Algorithm,Graph,Computational Geometry,Closest Points,我一直在考虑一种变化,其中唯一可用的信息是已经计算的距离集(我们不允许根据点的x坐标对点进行排序) 考虑4个点(A、B、C、D)和以下距离: dist(A,B) = 0.5 dist(A,C) = 5 dist(C,D) = 2 在本例中,我不需要计算距离(B,C)或距离(A,D),因为可以保证这些距离大于当前已知的最小距离 是否有可能使用此类信息将O(n²)减少为类似O(nlogn)的值 如果我接受一种近似的解决方案,是否有可能将成本降低到接近O(nlogn)的水平?在这种情况下,我正在考虑

我一直在考虑一种变化,其中唯一可用的信息是已经计算的距离集(我们不允许根据点的x坐标对点进行排序)

考虑4个点(A、B、C、D)和以下距离:

dist(A,B) = 0.5
dist(A,C) = 5
dist(C,D) = 2
在本例中,我不需要计算距离(B,C)或距离(A,D),因为可以保证这些距离大于当前已知的最小距离

  • 是否有可能使用此类信息将O(n²)减少为类似O(nlogn)的值

  • 如果我接受一种近似的解决方案,是否有可能将成本降低到接近O(nlogn)的水平?在这种情况下,我正在考虑一些基于强化学习的技术,这种技术仅在强化数为无穷大时才收敛到实际解,但对小n提供了一个很好的近似值

  • 处理时间(用大O表示法衡量)不是唯一的问题。保留大量以前计算的距离也是一个问题

  • 想象一下这个问题对于一个10的集合⁸ 要点

  • 我应该寻找什么样的解决方案?这种问题以前解决过吗


    这不是课堂问题或相关问题。我一直在想这个问题

    如果在一个平面上只有采样距离,而没有可以操作的原始点位置,那么我怀疑你在O(E)处有界。 具体地说,从您的描述中可以看出,任何有效的解决方案都需要检查每一条边,以排除它有什么有趣的话要说,同时,检查每一条边并取最小的边解决问题


    平面版本绕过了O(V^2),通过使用平面距离来推断边集的限制,允许我们避免查看大多数边权重。

    使用与空间分区相同的想法。递归地分割给定的点集,方法是选择两个点并将该点集分成两部分,即距离第一点较近的点和距离第二点较近的点。这与通过两个选定点之间的直线分割点相同


    这就产生了(二进制)空间划分,可以使用标准的最近邻搜索算法。

    我建议使用从快速求解k-最近邻搜索中衍生出来的思想

    M-Tree数据结构:(参见和)旨在减少查找“最近邻居”所需的距离比较次数

    就我个人而言,我在网上找不到一个我满意的M-Tree实现(参见我的封闭线程),所以我推出了自己的M-Tree

    我的实施是:

    基本上,这是一个二叉树,其中每个叶节点包含一个键的HashMap,这些键在您定义的某个度量空间中“接近”

    我建议使用我的代码(或其背后的想法)来实现一个解决方案,您可以:

  • 搜索每个叶节点的HashMap,并在该小子集中找到最近的一对密钥
  • 当只考虑每个HashMap的“获胜者”时,返回最接近的密钥对
  • 这种类型的解决方案是一种“分而治之”的方法,它返回一个近似的解决方案

    您应该知道这段代码有一个可调参数,该参数控制可以放置在单个HashMap中的最大键数。减少此参数将提高搜索速度,但会增加找不到正确解决方案的可能性,因为一个键在HashMap A中,而第二个键在HashMap B中

    此外,每个HashMap都关联一个“半径”。根据您希望结果的准确程度,您可能只需要使用最大的HashMap.size()/radius搜索HashMap(因为此HashMap包含最高密度的点,因此它是一个很好的搜索候选)
    祝你好运

    @PhamTrung给定
    dist(A,B)=0.5;dist(A,C)=5,如果A,B和C是共线的,则最接近的B和C可能是,并且按该顺序。这导致距离(B,C)>=4.5,大于当前最短路径,因此无需计算。@PhamTrung,这取决于10^8点的分布。对于非常密集的分布点,您可能是正确的。运行时将不仅取决于点的分布,而且取决于您考虑(对)的顺序,而不幸的是,最坏情况下的运行时间将是O(n ^ 2),假设“从A到B”的距离是我们唯一允许的查询。例如,如果在(0,0)处有一个点,在(d,0)处有另一个点(其中d是接近0的某个小值),并且n-2个点均匀分布在以(0,0)为中心半径r的圆的圆周上,r足够大,使得d小于圆上任意两个点之间的距离,则。。。。。。最近邻对将是(0, 0)和(d,0)-但是没有别的东西能告诉我们要尽早考虑这对点,所以在最坏的情况下,它将被认为是最后一个。同样在这种最坏的情况下,我们需要首先考虑O(n ^ 2)其他点:圆点上的每个点与对角相反,然后在该点的两边点,最终将其与其两边的邻居进行比较。(这不是证据,甚至不是草图,但我认为它可以作为一个起点。在尺寸=点数的情况下,在最坏的情况下比较O(n^2)点对的必要性要容易得多。)对不起,@RichardPlunkett我不太理解你的断言!你对edge的确切意思是什么?它们是以前计算的距离吗?我也不理解第二个断言!他说的是解决方案O(nlogn)只适用于平面情况。一般情况下,你有O(E)输入。除非你完全读取输入(这需要O(E)