如何在不迭代的情况下获取,排序和计算圆形插值数据?

时间:2013-10-30 16:24:41

标签: c# sorting math interpolation

标题相当含糊,所以我在那里道歉。

我想要做的是:

每个数据集我有三个数字。 X,Y和Z.它们总是正的,Z是2的幂。我需要在X和Y之间进行插值,Z次。每次插值从X到Y的距离是当前迭代除以Z的百分比。然后使用round to nearest舍入插值的返回值。然后,我需要计算每个数据集中每个结果的存在量。

这样的事:n(i)= Round(x +(y - x)*(i /(Z-1)))

示例(为简单起见,仅输出3位小数):

X, Y, Z
3, 5, 8

没有舍入的值:

3.000   3.286   3.571   3.857   4.143   4.429   4.714   5.000

带舍入的值:

3 3 4 4 4 4 5 5

结束目标:

2 3's, 4 4's, 2 5's.

这个,我可以做得很好。然而,我想要做的是弄清楚有2个3个,4个4个和2个5个(按此顺序),而不必如实例所示实际插值8次。实际上,这些数字更像是291,3472,8192;我需要快速合理地处理数以千计的这些。

如何在不对每个数据集重复Z次的情况下执行此操作?

编辑:Y并不总是大于X.在这个例子中,如果它变为5,3,8 ..我想知道那个顺序中有2个5,4个4和2个3。

1 个答案:

答案 0 :(得分:1)

在某些情况下,你可以用少于Z值的计算来做到这一点,但我不确定它会比直接的Z计算更快。

首先,您需要区分三种情况。

案例1:Z> Y - X

在这种情况下,所有的计数都是1,问题是哪些数字有计数。唯一知道的方法是计算所有Z数。

案例2:Z == Y - X

简单:X和Y之间的每个数字都包含一个。

案例3:Z< Y - X

我的想法如下:除了第一个和最后一个计数之外,数字不会有太大差别。事实上,我认为(但尚未证明,所以我的直觉可能是错误的)最小和最大数量永远不会超过1个。

所以你可以有一个像(number:count)

这样的序列
1:1 2:5 3:5 4:4 5:5 6:4 7:5 8:2

但不是

1:1 2:5 3:5 4:3 5:5 6:4 7:5 8:2

您可以做的是以下内容:

首先以直截了当的方式计算X的计数

然后以直截了当的方式计算X + 1的计数,让我们称之为C,并记住最后一个非舍入的数字,让我们称之为N.所以ROUND(N)== X + 1.

然后,对于X + 2直到Y - 1,测试计数是否为C - 1,C或C + 1

你怎么能这样做?只需计算

N + ((Y - X) / Z) * (C - 1)
N + ((Y - X) / Z) * (C)
N + ((Y - X) / Z) * (C + 1)
围绕它们,看看会发生什么。

但是:这将导致代码复杂且难以理解和维护,并且可能不会比直接的方式更快(除非Z比Y-X大几个数量级)。 YMMV。

更新:

您的观察结果是,在案例3中,计数是对称的是正确且非常有用的:它允许您将所需计算的数量减少一半。