【问题标题】:Comparing Numbers Algorithm比较数字算法
【发布时间】:2016-03-31 14:14:19
【问题描述】:

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

  1. 177
  2. 150
  3. 212
  4. 45
  5. 91
  6. 330

然后是 X Coord Set 2(不总是 3 点,可能是 2,可能是 5):

  1. 212
  2. 91
  3. 150

这部分很简单,因为您只需比较第二个列表中的哪些与第一个列表中的相同。但是,当点偏移时,它会变得更加困难。例如下图中,红色的原图是默认位置,蓝色是不同的图像偏移+20px,这使得X点偏移+20px。我将原始图像点标记为红色,用户点击蓝色,最后完成图像应为黑色的样子。

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

【问题讨论】:

  • "which points have been clicked" - 被称为 hittest,谷歌为此,帖子的其余部分(包括图片)真的无关紧要。如果你有实现,但它有问题(例如性能),那么确定,发布它,也许可以优化它。
  • 有点不清楚你的实际目的是什么。点击与您问题的第一部分有什么关系?
  • 第一个列表是从 .csv 文件中检索的。第二个列表是由用户点击生成的。重点是拍摄PCB的图像并单击图像上的点以映射组件。单击的点越多,映射就越准确。它比较第一个列表和第二个列表以查看差异,即 20px 偏移量,然后将未点击的剩余点与发现的差异 (20px) 相加

标签: c# algorithm math


【解决方案1】:

据我了解,您在每次运行中总是有一个固定的偏移量,但您不知道偏移量是多少,任何贪婪的几何解决方案,例如将最接近的对匹配在一起,都可能导致错误的答案。

对两个列表中的数字进行排序,然后找到一对一的对应关系。不管偏移量如何变化,在排序列表中,数字总是在正确的位置。要以原始格式检索它,您可以执行以下操作(伪代码):

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 -> 244、257->277、279->299。当然,在某些情况下可能存在多个对应关系,但我们无法通过我们拥有的信息来区分它们。假设第一个列表的大小为 n,第二个列表的大小为 m,算法运行时间为 O(m.n),因为通常第二个列表很小(用户点击),这几乎是线性的。另一方面,最长公共子序列是 O(n^2),所以上述算法相当不错。

【讨论】:

  • 这行不通,因为我很可能不会在两个列表中获得相同数量的点数?
  • @KyleDama,是的,没错,我正要写这个,我也会更新以解决这个问题。
  • @KyleDama,我通过示例提供算法更新了答案。我不确定这是否是最好的,但考虑到您的输入格式(用户点击),它已经足够快了。
【解决方案2】:

这在计算几何中称为closest pair of points problem。它类似于寻找最近的邻居并结合评估它们的距离的最小二乘之和。

【讨论】:

  • 谢谢,我想这应该让我知道如何解决这个问题!
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
相关资源
最近更新 更多