比较数字算法

时间:2016-03-31 14:14:19

标签: c# algorithm math

我试图比较两组数字。我会以随机顺序给出这些数字。目标是获取第二个列表中的数字,并在第一个列表中找到它们。数字是从第一个列表的文件中给出的点列表中的X坐标,然后由用户通过点击第二个列表的图像来选择。例如X Coord Set 1:

  1. 177
  2. 150
  3. 212
  4. 45
  5. 91
  6. 330
  7. 然后X Coord Set 2(不总是3分,可能是2分,可能是5分):

    1. 212
    2. 91
    3. 150
    4. 这部分很简单,因为你只需要比较第二个列表中的哪个等于第一个列表中的那个。然而,当点被抵消时,它变得更难。例如,在下图中,红色的原始图像是默认位置,蓝色是偏移+ 20px的不同图像,这使得X点偏移+ 20px。我将原始图像点标记为红色,用户点击蓝色,并完成图像的黑色图像。

      enter image description here

      我的问题是,如果图像中存在图像偏移,则找出点击哪些点的最有效方法是什么。它不会总是20px,它永远不会是一个正数。也许减去积分并找到最常见的数字?

2 个答案:

答案 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。它类似于找到最近的邻居,并评估其距离的最小平方和。