是否有有效的方法通过十进制因子缩减数组中元素的数量?
我希望通过某个因素缩小一个数组的元素。
实施例: 如果我有10个元素,需要按因子2缩小。
1 2 3 4 5 6 7 8 9 10
scaled to
1.5 3.5 5.5 7.5 9.5
将2分组2并使用算术平均值。
如果我需要将包含10个元素到6个元素的数组缩小,我的问题是什么?从理论上讲,我应该将1.6元素分组并找到它们的算术平均值,但是如何做到这一点?
答案 0 :(得分:2)
在提出解决方案之前,让我们以更正式的方式定义“缩小尺寸”。我会建议这个定义:
缩小从数组
a[N]
开始并生成数组b[M]
,以便满足以下条件:
M <= N
- 否则会增大规模,而不是缩小规模SUM(b) = (M/N) * SUM(a)
- 总和与元素数量成比例减少- 中出现的顺序参与
a
的元素按b
a
的计算 醇>
让我们考虑一下将1, 2, 3, 4, 5, 6, 7, 8, 9, 10
缩减为六个元素的示例。数组的总数为55,因此新数组的总数为(6/10)*55 = 33
。我们可以通过两个步骤实现这一目标:
a
总计其元素,直到我们达到N/M
分数的整数部分(它必须是上面规则1中的不正确分数)a[i]
是a
的最后一个元素,我们可以在当前迭代中作为一个整体。取a[i+1]
的分数等于N/M
a[i+1]
b
将包含总计为M
的{{1}}个数字。再次遍历数组,并按SUM(a)
缩放结果。以下是您的示例:
N/M
缩小b[0] = a[0] + (2/3)*a[1] = 2.33333
b[1] = (1/3)*a[1] + a[2] + (1/3)*a[3] = 5
b[2] = (2/3)*a[3] + a[4] = 7.66666
b[3] = a[5] + (2/3)*a[6] = 10.6666
b[4] = (1/3)*a[6] + a[7] + (1/3)*a[8] = 13.3333
b[5] = (2/3)*a[8] + a[9] = 16
--------
Total = 55
会产生最终结果:
6/10
这是C ++中的一个简单实现:
1.4 3 4.6 6.4 8 9.6 (Total = 33)
答案 1 :(得分:0)
您需要采用某种形式的插值,因为要求平均的元素数不是整数。
您可以考虑计算数组的前缀和,即
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
总和产量
0 1 2 3 4 5 6 7 8 9
1 3 6 10 15 21 28 36 45 55
然后执行线性插值以获得您缺少的中间值,例如0*, 10/6, 20/6, 30/5*, 40/6, 50/6, 60/6*
。 (带星号的那些很容易获得)。
0 1 10/6 2 3 20/6 4 5 6 40/6 7 8 50/6 9
1 3 15/3 6 10 35/3 15 21 28 100/3 36 45 145/3 55
现在通过成对减去值得到小数和。第一个平均值是
(15/3-1)/(10/6) = 12/5
答案 2 :(得分:-1)
我无法想到C ++库中会发生类似这样的事情,所有事情都已完全熟化并准备就绪。
因此,你必须卷起袖子去上班。在这一点上,问题是&#34;有效的&#34;这样做可归结为它的基础知识。这意味着:
1)计算输出数组应该有多大。根据问题的描述,您应该能够在查看输入数组中的值之前进行计算。您知道输入数组size()
,您可以计算目标数组的size()
。
2)因此,您预先resize()
目标阵列。现在,您不再需要担心增加动态输出数组大小所浪费的时间,逐步增加,当您通过输入数组进行计算时。
3)那么剩下的就是实际的工作:迭代输入数组,并计算缩小的值。
auto b=input_array.begin();
auto e=input_array.end();
auto p=output_array.begin();
除了蛮力迭代和计算之外,别在这里看到很多其他选项。从b
迭代到e
,获取样本,计算每个缩小的值,并将结果值保存到*p++
。