我一直在考虑closest pair problem的变体,其中唯一可用的信息是已计算的距离集(我们不允许根据它们的x坐标对点进行排序)。
考虑4个点(A,B,C,D)和以下距离:
dist(A,B) = 0.5
dist(A,C) = 5
dist(C,D) = 2
在此示例中,我不需要评估dist(B,C)
或dist(A,D)
,因为可以保证这些距离大于当前已知的最小距离。
是否可以使用此类信息将O(n²)减少为O(nlogn)?
如果我接受一种近似解决方案,是否有可能将成本降低到接近O(nlogn)的成本?在这种情况下,我正在考虑一些基于强化学习的技术,当增援的数量达到无限时,它只会收敛到真正的解,但是为小n提供了很好的近似。
处理时间(以大O表示法测量)不是唯一的问题。保持大量先前计算的距离也是一个问题。
想象一下这个问题对于一个有10⁸分的集合。
我应该寻找什么样的解决方案?这种问题以前是否已经解决了?
这不是教室问题或相关的问题。我一直在考虑这个问题。
答案 0 :(得分:2)
如果您只有样本距离,而不是您可以操作的平面中的原始点位置,那么我怀疑您在O(E)处受限。 具体来说,从您的描述中可以看出,任何有效的解决方案都需要检查每个边缘,以便排除它有一些有趣的内容,同时,检查每个边缘并采取最小的解决问题。
平面版本绕过O(V ^ 2),通过使用平面距离来推断边缘集的限制,允许我们避免需要查看大多数边权重。
答案 1 :(得分:2)
我建议使用从快速解决k-最近邻搜索得出的想法。
M-Tree数据结构:(参见http://en.wikipedia.org/wiki/M-tree和http://www.vldb.org/conf/1997/P426.PDF)旨在减少为找到“最近邻居”而需要执行的距离比较。
就个人而言,我无法在网上找到一个我满意的M-Tree实现(请参阅我的封闭线程Looking for a mature M-Tree implementation),所以我自己动手了。
我的实施在这里:https://github.com/jon1van/MTreeMapRepo
基本上,这是二叉树,其中每个叶节点包含一个键的HashMap,它在您定义的某个度量空间中“接近”。
我建议使用我的代码(或其背后的想法)来实现一个解决方案:
这种解决方案将是一种“分而治之”的方法,返回一个近似的解决方案。
您应该知道此代码具有可调参数,该参数控制可放置在单个HashMap中的最大键数。减少此参数将提高搜索速度,但会增加找不到正确解法的可能性,因为一个Key位于HashMap A中,而第二个键位于HashMap B中。
此外,每个HashMap都与“半径”相关联。根据您对结果的准确程度,您可以只使用最大的hashMap.size()/ radius搜索HashMap(因为此HashMap包含最高密度的点,因此它是一个很好的搜索候选者) 祝你好运
答案 2 :(得分:1)
使用与空间分区相同的想法。通过选择两个点并将分组分成两部分递归地分割给定的一组点,更接近第一点的点和更接近第二点的点。这与通过在两个选定点之间传递的线分割点相同。
产生(二进制)空间分区,可以使用标准的最近邻搜索算法。