假设您有N
个大小为1
的数组,每个数组包含从N
到[1,4,2,3]
[4,2,3,1]
[2,3,4,1]
的唯一值。
您将如何找到平均距离最远的两个数字?
例如,给定数组:
1
然后答案将是项2
和k
,因为它们在前两个数组中的距离为2,在最后一个数组中的距离为3。
我知道O(kN ^ 2)解决方案(通过测量每个{{1}}数组的每对数字之间的距离),但是有更好的解决方案吗?
我想用C ++实现这样的算法,但是对解决方案的任何描述都会有所帮助。
答案 0 :(得分:3)
在对数字进行索引的线性时间变换之后,此问题归结为计算相对于L1距离的一组点的直径。不幸的是,这个问题受到维度的诅咒。
给予
1 2 3 4
1: [1,4,2,3]
2: [4,2,3,1]
3: [2,3,4,1]
我们计算
1 2 3
1: [1,4,4]
2: [3,2,1]
3: [4,3,2]
4: [2,1,3]
,然后1
和2
之间的L1距离为|1-3| + |4-2| + |4-1| = 8
,这是它们的平均距离(按问题而言)乘以k = 3
。
也就是说,您可以使用上面的输入作为数据库,并使用N+1-v
下的数据库中每个点的图像作为查询,来应用近似最近邻居算法。
答案 1 :(得分:1)
我建议最好的情况是 。您可以遵循启发式方法。
例如,您知道如果N=4
,N-1=3
将是最大距离,而1
将是最小距离。平均距离为10/6=1,66667
(阵列中线对之间的距离之和/阵列中线对的数量之和)。
然后,您知道,如果k/2
数组的边上有两个数字(大多数情况下),则即使在距离的顶部(> = 2
),即使在它们在其他1
数组中的距离仅为k/2
。对于O(2k)
= O(k)
的最佳情况,这可能是一个解决方案。