Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 向流中的特定值添加的第一对数字_Algorithm_Stream - Fatal编程技术网

Algorithm 向流中的特定值添加的第一对数字

Algorithm 向流中的特定值添加的第一对数字,algorithm,stream,Algorithm,Stream,有一个整数流通过。问题是要从流中找到添加到特定值(比如k)的第一对数字 对于静态阵列,可以使用以下任一方法: 方法(1):对数组进行排序,使用两个指针指向数组的开头和结尾并进行比较 方法(2):使用散列,即如果A[i]+A[j]=k,那么A[j]=k-A[i]。在哈希表中搜索[j] 但这两种方法都不适用于溪流。有效地解决这个问题有什么想法吗?我相信,如果不使用至少O(n)个内存,就没有办法做到这一点,其中n是出现在第一对和k之前的元素数。我假设我们使用的是一台RAM机器,但不是一台允许可怕的

有一个整数流通过。问题是要从流中找到添加到特定值(比如k)的第一对数字

对于静态阵列,可以使用以下任一方法:

  • 方法(1):对数组进行排序,使用两个指针指向数组的开头和结尾并进行比较
  • 方法(2):使用散列,即如果A[i]+A[j]=k,那么A[j]=k-A[i]。在哈希表中搜索[j]

但这两种方法都不适用于溪流。有效地解决这个问题有什么想法吗?

我相信,如果不使用至少O(n)个内存,就没有办法做到这一点,其中n是出现在第一对和k之前的元素数。我假设我们使用的是一台RAM机器,但不是一台允许可怕的位黑客操作的机器(换句话说,我们不能用位打包做任何花哨的事情)

验证示意图如下所示。假设我们不存储出现在第一对和为k的元素之前的所有n个元素。然后,当我们看到第n个元素,它与某个先前的值求和得到k时,有可能我们已经丢弃了它配对的先前元素,因此不知道k的和已经达到。更正式地说,假设一个对手可以看到我们在内存中存储了哪些值,因为我们查看了前n-1个元素,并注意到我们没有存储某些元素x。然后,对手可以将流的下一个元素设置为k-x,我们会错误地报告尚未达到总和,因为我们不记得看到了x

考虑到我们需要存储我们看到的所有元素,而不需要知道更多关于流中数字的信息,一个非常好的方法是使用一个哈希表,其中包含我们到目前为止看到的所有元素。给定一个好的哈希表,这将需要预期的O(n)内存和O(n)时间来完成

如果你对数据流中的数字种类做出更有力的假设,我不确定是否有更聪明的策略来解决这个问题,但我相当有信心,就时间和空间而言,这是渐进理想的


希望这有帮助

哈希表出了什么问题?好吧,我们必须把这个庞大的数字流哈希成一个。其次,对于每个元素,我需要不断搜索它的对,因为有可能该对还没有出现在流中。不过,我同意散列方法比排序技术更具可伸缩性。您可以在处理流时构建散列,并在第一对上停止。数字上还有其他特征吗?它们都在某个范围内吗?@Nick:没有限制,但我很想知道如果它们在某个特定范围内,你会说些什么?你说的很有道理。我想看看除了我概述的两种方法之外,还有没有更聪明的方法来解决这个问题。我想看看我们能否利用问题的“第一对数字”部分,但猜不到。