我想比较两组数字我将得到随机顺序的数字目标是获取第二个列表中的数字,并将其定位到第一个列表中。数字是从第一个列表的文件中给出的点列表的x坐标,然后由用户通过单击第二个列表的图像来选择。例如x坐标集1:
177个
一百五十
二百一十二
45岁
91个
330个
然后X坐标集2(不总是3点,可以是2,可以是5):
二百一十二
九十一
150个
这一部分很简单,因为你只需比较第二个列表中的哪些与第一个列表中的相等但是,当点偏移时会变得更难例如在下面的图像中,红色的原始图像是默认位置,蓝色是偏移+20px的不同图像,这使得x点偏移+20px。我用红色标记原始图像点,用户用蓝色单击,然后用黑色完成图像的外观。
我的问题是,如果有像图像中的偏移一样的图像偏移,那么什么是最有效的方法来找出哪些点已被单击它不会总是20px,也不会总是正数。也许减去点,找出最常见的数字?
最佳答案
据我所知,每次运行都有一个固定的偏移量,但您不知道偏移量是多少,任何贪婪的几何解,比如将最近的对匹配在一起,都可能导致错误的答案。
对两个列表中的数字进行排序,然后找到一对一的对应关系。不管偏移量如何变化,在排序的列表中数字总是在正确的位置。要以原始格式检索它,可以执行以下操作(伪代码):
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…..二百九十九
和
输入:224257279
首先我们假设224对应200,然后257对应257-24=223,但是列表中没有223,向前移动指针,假设224对应211,然后257对应257-13=244,我们在原始列表中有244,那么279对应279-13=256,但原始列表中没有256,所以将指针向前移动,我们可以看到224-,244257-,277279-,299。当然,在某些情况下可能会有多个对应关系,但无法根据我们掌握的信息来区分它们假设第一个列表的大小为n,第二个列表的大小为m,则算法在时间o(m.n)内运行,因为第二个列表通常很小(用户单击),这几乎是线性的。另一方面,发现最长公共子序列是o(n^2),因此该算法是相当好的。
关于c# - 比较数字算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36335941/