有一个整数流通过。问题是从流中找到第一对数字,该数字加上特定值(比如k)。
对于静态阵列,可以使用以下任一方法:
- 方法(1):对数组进行排序,使用两个指针指向数组的开头和结尾并进行比较
- 方法(2):使用哈希,即如果A[i]+A[j]=k,则A[j]=k-A[i]。在哈希表中搜索A[j]
但这两种方法都不能很好地适应流。对有效解决这个问题有什么想法吗?
我相信,如果不使用至少O(n)内存,就没有办法做到这一点,其中n是出现在第一对和k之前的元素数量
证明草图如下。假设我们没有存储出现在与k求和的第一对之前的所有n个元素。然后,当我们看到第n个元素,它与之前的某个值求和得到k时,我们有可能已经丢弃了与它配对的前一个元素,因此不知道已经达到了k的和。更正式地说,假设当我们查看前n-1个元素时,对手可以观察我们在内存中存储的值,并注意到我们没有存储一些元素x。然后对手可以将流的下一个元素设置为k-x,我们会错误地报告尚未达到和,因为我们不记得看到过x。
考虑到我们需要存储我们所看到的所有元素,而不需要更多地了解流中的数字,一个非常好的方法是使用一个哈希表,其中包含我们迄今为止所看到的全部元素。给定一个好的哈希表,这将需要预期的O(n)内存和O(n)时间才能完成。
如果你对流中的数字种类做出更有力的假设,我不确定是否有更聪明的策略来解决这个问题,但我很有信心,这在时间和空间方面是渐进理想的。
希望这能有所帮助!