十进制因子

时间:2016-01-25 13:33:26

标签: c++ arrays algorithm c++11

是否有有效的方法通过十进制因子缩减数组中元素的数量?

我希望通过某个因素缩小一个数组的元素。

实施例: 如果我有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元素分组并找到它们的算术平均值,但是如何做到这一点?

3 个答案:

答案 0 :(得分:2)

在提出解决方案之前,让我们以更正式的方式定义“缩小尺寸”。我会建议这个定义:

  

缩小从数组a[N]开始并生成数组b[M],以便满足以下条件:

     
      
  1. M <= N - 否则会增大规模,而不是缩小规模
  2.   
  3. SUM(b) = (M/N) * SUM(a) - 总和与元素数量成比例减少
  4.   
  5. a的元素按b
  6. 中出现的顺序参与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)

Demo.

答案 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++