【发布时间】:2014-07-29 20:06:28
【问题描述】:
假设一个进程每 60 秒接收一个新整数。我想保留最后 5 个数字的总和。例如:
3 1 99 10 8 0 7 9 --> running total is 10+8+0+7+9==34
<--------->
60 秒后,我们收到一个新整数。接收到的整数列表现在如下所示:
3 1 99 10 8 0 7 9 2 --> running total is now 8+0+7+9+2==26
<-------->
如果你有存储空间来保存最后 5 个整数,这很容易实现。我正在尝试提出一种内存效率更高的算法。有人有什么想法吗?
【问题讨论】:
-
你的内存太痛苦了,20字节太多了(假设
sizeof(int) == 4)? -
这似乎更像是一个编程难题,而不是一个实际的编程问题。也许您应该将其发布在 codegolf.stackexchange.com。
-
我可能错了,但我认为你不能那样做。如果您可以将任意数据的最后 n 个数字的总和存储在小于 O(n) 的内存中,这意味着您可以将 n 个任意数字存储在小于 O(n) 的内存中,这是荒谬的。
-
为了便于讨论,我正在简化问题。在实践中,大约会有 8000 个这样的列表,我需要保留最后 5、60 和 3600 个元素的运行总和。这就是为什么我如此关注内存高效解决方案的原因。
-
如果尺寸对你来说太大了,我会开始寻找替代解决方案。你真的需要精确的总和吗?每个数字你真的需要多少位?可变长度编码有帮助吗?存储增量有帮助吗?你可以使用一些实际的压缩算法,它会节省空间还是足够快?等等。