如何在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
有更好的方法吗?
答案 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
实现。