有没有办法只用一次迭代来标准化一组值?

时间:2015-03-03 06:54:02

标签: algorithm normalize

所以说我有一个很大的浮动列表,我想将它们全部标准化为minmax之间的值。例如。 {2, 5, 10} min = 0max = 2的{​​{1}}会产生一组{0.4, 1, 2}

我目前的算法是

  1. 遍历所有元素并找到集合
  2. 的总和
  3. 再次遍历所有元素,除以总和(占最小值和最大值)
  4. 我的问题是一般的算法问题 - 是否可以在O(n)而不是O(2n)中执行此操作?

2 个答案:

答案 0 :(得分:5)

首先,O(n)=O(2n),这是一个渐近分析。 回到你的问题,你可以这样做:

  1. 遍历所有元素并找到集合的最小值/最大值
  2. 使用延迟评估技术:不要再遍历所有元素。当您从集合中要求输入对象i时,将其返回到您在1中计算的标准化函数。
  3. 请注意,您无法避免对该集合中的每个元素进行2次读取。

答案 1 :(得分:2)

这个问题很明显,因为O(N)O(2N)严格相同。

假设OP所要求的是单遍算法,答案是肯定的。规范化函数,无论它是什么,将取决于列表中的所有值,以便在规范化开始之前必须至少读取所有值,并且至少需要一次完整传递。在某种程度上,这意味着您可以立即规范化第一个元素,而无需查看其他元素。

唯一可以获得的是仅在使用这些值时将其标准化(请参阅@ avim的答案),而不是一次性。

从技术上讲,这会将渐近复杂度带到O(N + M),其中M是规范化值的使用次数。如果M超过N,则此方法成本更高。