如何在scala中查找Stream中的第一个副本

时间:2016-12-31 11:45:08

标签: scala stream

如何在scala中查找Stream中的第一个副本?

我目前的想法是将每个元素与所有先前元素的#include <string> #include <iostream> using namespace std; int main() { string input, numBin = ""; cout << "Enter a hexadecimal number: "; getline(cin, input); for (int i = 0; i < input.length(); i++) { switch (input[i]) { case 0: numBin.append("0000"); break; case 1: numBin.append("0001"); break; case 2: numBin.append("0010"); break; case 3: numBin.append("0011"); break; case 4: numBin.append("0100"); break; case 5: numBin.append("0101"); break; case 6: numBin.append("0110"); break; case 7: numBin.append("0111"); break; case 8: numBin.append("1000"); break; case 9: numBin.append("1001"); break; case 'a': numBin.append("1010"); break; case 'A': numBin.append("1010"); break; case 'b': numBin.append("1011"); break; case 'B': numBin.append("1011"); break; case 'c': numBin.append("1100"); break; case 'C': numBin.append("1100"); break; case 'd': numBin.append("1101"); break; case 'D': numBin.append("1101"); break; case 'e': numBin.append("1110"); break; case 'E': numBin.append("1110"); break; case 'f': numBin.append("1111"); break; case 'F': numBin.append("1111"); break; default: break; } } cout << "Your number in binary is " << numBin << "."; } 配对。然后,在生成的Set上调用find

因此,对于每个元素,我们都有

  • Stream中的插入:O(1)
  • Set:O(1)
  • 中的测试contains

因此,这个算法的整体复杂性似乎是O(n)。

Set

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

你应该使你的函数尾递归。你拥有它的方式,你正在堆栈上制作整个流的另一个副本。另外,我不明白为什么要制作整个流的副本(以及设置的whoooole buuunch),然后再次扫描以找到dup。当你把它添加到集合中时,你可以立即告诉它是一个重复,并在那里停止。

或许这样的事情:

   def firstDup[T](s: Stream[T], seen: Set[T] = Set.empty[T]): Option[T] =  s match {
      case head #:: tail if seen(head) => Some(head)
      case head #:: tail => firstDup(tail, seen + head)
      case _ => None
   }

上面评论中的bloom过滤建议对真正巨大的输入流来说是一个好主意。在这种情况下,“外壳”将保持不变,您只需要更改基础seen实现。