我有一组元素,它们之间的距离函数满足三角不等式。
我想找到以最大距离分隔的元素对。
有没有比尝试所有配对更好的已知解决方案?
答案 0 :(得分:3)
如果你测量从a点到b,c和d点的距离,你会发现| ab | + | ac | < | ad |,那你知道| bc |比| ad |短,并且不需要测量| bc |。因此,不需要检查所有对以找到最长距离。
可能的算法是:
首先测量从a点到所有其他点的距离,找到距离a最远的点n,然后给出所有对b,x,其中| ab | + | ax | < |的|距离| ab | + | ax | (因为那是他们最大可能的距离)
对b点执行相同操作,仅测量尚未设置的距离。检查您是否找到了新的最大值,然后再次给出所有对c,x,其中| bc | + | bx | < MAX距离| bc | + | bx |。
继续为c,d,......做这个。
在最好的情况下,你可以在N-1次测量后找到一组N个点中的最长距离(如果| ax |是a的任何其他距离的两倍)。在最坏的情况下,您需要测量每一对(如果最短距离超过最长距离的一半,或者如果您按照通过这些点的顺序不幸)。
如果你想将距离测量的数量减少到绝对最小值,并且对于每个未知距离x,y你检查每个先前存储的值| ax | + | ay |,| bx | + | by |,| cx | + | CY | ...为了查看它是否小于当前最大值并因此可以用作| xy |的值,测量次数大大减少。
在方形2D空间中的1000个随机点上运行此算法(通常需要499,500次测量),返回2,000到10,000次测量之间的最大距离(或者总数的0.4%到2%之间,平均值大约为1) %)。
这并不一定意味着算法在实践中比测量每个距离要快得多;这取决于测量与避免测量所需的环路,添加和比较的组合相比有多昂贵。
正如@mcdowella指出的那样,随着空间维数的增加,这种方法效率降低。分数也有很大的影响。下表显示了必须执行的与总对数相关的测量次数。这些是在“正方形”空间中具有随机分布点的测试的平均值(即,所有维度中的坐标在相同范围内)。如您所见,此方法对于2D或3D空间中具有多个点的几何问题最有意义。但是,如果您的数据在某种程度上存在高度偏差,则结果可能会有所不同。
10 points (45 pairs) 100 points (4950 pairs) 1000 points (499500 pairs) dim measurem. % of total measurem. % of total measurem. % of total 1 16.6674 37.04 221.17 4.47 4877.97 0.98 2 22.4645 49.92 346.77 7.01 5346.78 1.07 3 27.5892 61.31 525.73 10.62 7437.16 1.49 4 31.9398 70.98 731.83 14.78 12780.02 2.56 5 35.3313 78.51 989.27 19.99 19457.84 3.90 6 38.1420 84.76 1260.89 25.47 26360.16 5.28 7 40.2296 89.40 1565.80 31.63 33221.32 6.65 8 41.6864 92.64 1859.08 37.56 44073.42 8.82 9 42.7149 94.92 2168.03 43.80 56374.36 11.29 10 43.4463 96.55 2490.69 50.32 73053.06 14.63 20 44.9789 99.95 4617.41 93.28 289978.20 58.05 30 44.9996 99.999 4936.68 99.73 460056.04 92.10 40 4949.79 99.99 496893.10 99.48 50 4949.99 99.9999 499285.80 99.96 60 499499.60 99.9999
正如预期的那样,测试结果在更高的维度上变得可预测,异常值之间只有几个百分点,而在2D中,一些测试案例需要的测量结果比其他测试案例多30倍。