スカラのストリームで最初の複製を見つける方法はありますか?スカラのストリームで最初の複製を見つける方法
私の現在のアイデアは、各要素をすべて前の要素のSet
とペアにすることです。その後、Stream
にfind
が呼び出されます。
したがって、各要素について、我々は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
}
もっと良い方法がありますか?
ストリームがどれくらい大きくなると思いますか?どのようにさまざまな要素が出現するのでしょうか? – Chobeat
大規模なストリームや無限ストリームの場合は、大量のメモリを使用することになりますが、かなり最適なアプローチと思われます。 setではなくbloom filterを試してみることもできますが、前のn個の要素を何回も繰り返す必要があるため、誤検出が返される可能性があります。 – adamwy