如何在scala中查找Stream中的第一個副本?如何在scala中查找流中的第一個副本
我目前的想法是將每個元素與以前所有元素的Set
配對。之後,在產生的Stream
上調用find
。
因此,對於每個元素,我們有
- 插入在
Set
:O(1) - 測試
contains
在Set
: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
}
有沒有更好的方法?
你認爲這條河流有多大?更好的是,可以出現的元素有多種? – Chobeat
這似乎是相當優化的方法,儘管對於大型或無限流,它將使用大量內存。您可以嘗試使用布盧姆過濾器而不是集合,但您需要多次瀏覽前n個元素,因爲它可能會返回誤報。 – adamwy