【发布时间】:2016-12-31 11:45:08
【问题描述】:
如何在 scala 的 Stream 中找到第一个重复项?
我目前的想法是将每个元素与所有先前元素的Set 配对。之后,find 会在结果 Stream 上被调用。
所以,对于每个元素,我们有
-
Set中的插入:O(1) - 在
Set中的测试contains:O(1)
因此,这个算法的整体复杂度似乎是 O(n)。
def firstDuplicate[A](s: Stream[A]) = {
def recurse(s: Stream[A], set: Set[A]) : Stream[(A, Set[A])]=
(s.head, set) #:: recurse(s.tail, set + s.head)
val pairedWithElements = recurse(s, Set.empty)
pairedWithElements.find{ case (e, elems) => elems.contains(e)}.get._1
}
有没有更好的办法?
【问题讨论】:
-
您希望流有多大?更好的是,可以出现的元素有多少?
-
这似乎是相当理想的方法,尽管对于大型或无限流它会使用大量内存。您可以尝试使用 Bloom filter 而不是 set,但您需要多次检查前 n 个元素,因为它可能会返回误报。