有一串整数通过。问题是要从流中找到添加到特定值(例如k)的第一个数字对。
使用静态数组,可以使用以下任一方法:
但这些方法都不适合流媒体。有效解决这个问题的想法吗?
答案 0 :(得分:2)
我认为没有办法不使用至少O(n)内存,其中n是第一对之前出现的元素数量,它们总和为k。我假设我们正在使用RAM机器,但不是一台机器允许可怕的按位hackery(换句话说,我们不能做任何花哨的位打包。)
校样草图如下。假设我们不存储在第一对之前出现的所有n个元素,它们总和为k。然后,当我们看到第n个元素,它与一些先前的值相加得到k时,我们有可能丢弃它与之配对的前一个元素,因此不会知道已达到k的总和。更正式的是,假设对手可以观察我们在内存中存储的值,因为我们查看了前n - 1个元素并注意到我们没有存储某些元素x。然后对手可以将流的下一个元素设置为k-x,并且我们会错误地报告尚未达到总和,因为我们不记得看到x。
鉴于我们需要存储我们所见过的所有元素,而不了解更多有关流中的数字的信息,一个非常好的方法是使用包含我们目前看到的所有元素的哈希表。给定一个好的哈希表,这将花费预期的O(n)内存和O(n)时间来完成。
如果您对流中的各种数字做出更强的假设,我不确定是否有一个更聪明的策略来解决这个问题,但我相信这在时间和空间方面是渐近理想的。< / p>
希望这有帮助!