我试图比较两组数字。我会以随机顺序给出这些数字。目标是获取第二个列表中的数字,并在第一个列表中找到它们。数字是从第一个列表的文件中给出的点列表中的X坐标,然后由用户通过点击第二个列表的图像来选择。例如X Coord Set 1:
答案 0 :(得分:3)
据我了解,每次运行时总是有一个固定的偏移,但你不知道什么是偏移,任何贪婪的几何解决方案,比如将最近的对匹配在一起,可能会导致错误的答案。
对两个列表中的数字进行排序,然后找到一对一的对应关系。无论偏移如何变化都不重要,在排序列表中,数字总是在正确的位置。要以原始格式检索它,您可以执行以下操作(伪代码):
struct item
{
int value;
int position;
}
List<item> inputs = new List<item>()
List<item> original = new List<item>()
for i=1 ... n :
original[i] = new item{lst1[i],i}
inputs[i] = new item{lst2[i],i}
Sort inputs and originals w.r.t. their values,
For i=1...n
input[i].position = original[i].position;
For i=1..n
lst2[inputs[i].position] = inputs[i].value;
请注意,上述伪代码仅在两个列表具有相同大小的情况下有效,因为它们具有不同的大小,我将在稍后更新我的答案。
考虑我们有两个不同大小的排序列表:
原文:200 211 222 233 244 255 ..... 299
和
输入:224,257,279
首先我们假设224对应于200,那么257应该对应于257-24 = 223,但是列表中没有223,向前移动指针,假设224对应211然后257应该对应于257 - 13 = 244,我们在原始列表中有244个,然后279应该对应于279 - 13 = 256,但是我们在原始列表中没有256个,所以将指针向前移动...,我们可以看到224 - &gt; 244,257-> 277,279-> 299。当然,在某些情况下可能存在多种对应关系,但不可能通过我们拥有的信息来区分它们。假设第一个列表的大小为n,第二个列表的大小为m,算法在时间O(m.n)中运行,因为通常第二个列表很小(用户点击),这几乎是线性的。另一个发现最长的公共子序列是O(n ^ 2),所以提到的算法相当不错。
答案 1 :(得分:1)
这在计算几何中称为closest pair of points problem。它类似于找到最近的邻居,并评估其距离的最小平方和。