如何在不进行迭代的情况下获取、排序和计数舍入插值数据

本文关键字:排序 数据 插值 舍入 获取 情况下 迭代 | 更新日期: 2023-09-27 18:37:26

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

我想做的是:

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

像这样: 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 的顺序。

如何在不进行迭代的情况下获取、排序和计数舍入插值数据

在某些情况下,您可以使用小于 Z 值的计算来做到这一点,但我不确定它会比简单的 Z 计算更快。

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

案例 1:Z> Y - X

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

情况 2:Z == Y - X

简单:包括 X 和 Y 之间的每个数字都会计数 1。

案例 3:Z

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

所以你可以有一个像(数字:计数)这样的序列

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 大几个数量级)。扬子晚报.

更新:

您观察到的情况 3 中的计数是对称的,这是正确且非常有用的:它允许您将所需计算的数量减少一半。