0

私は、学習目的で慣用的な Scala を使用して、非常に単純な問題、Eratosthenes sieve を解決しようとしていました。

私は Stream キャッシュを学習したので、n 番目の要素を決定するときはそれほどパフォーマンスが高くありません。これは、データのメモ化を伴う O(n) 複雑なアクセスであるため、この状況には適していません。

    def primes(nums: Stream[Int]): Stream[Int] = {
        Stream.cons(nums.head,
            primes((nums tail) filter (x => x % nums.head != 0)))
    }

    def ints(n: Int): Stream[Int] = {
        Stream.cons(n, ints(n + 1))

    };
    def nthPrime(n: Int): Int = {
        val prim = primes(ints(2)).view take n toList;
        return prim(n - 1);
    };

Integer ストリームが問題です。素数フィルタリングが行われている間、JVM は OutOfMemory を実行します。Streams を使用せずに同じ機能を実現する正しい方法は何ですか?

基本的に、整数のビューから素数のビューを取得し、メモ化せずに最後の要素を表示しますか?

4

1 に答える 1

1

ストリームが良いアイデアであるという同様のケースがありましたが、その値を保存する必要はありませんでした。私が作成した値を保存せずにストリームを消費するために(私が呼んだもの)ThrowAwayIterator

class ThrowAwayIterator[T](var stream: Stream[T]) extends Iterator[T] {
  def hasNext: Boolean = stream.nonEmpty
  def next(): T = {
    val next = stream.head
    stream = stream.tail
    next
  }
}

渡されたストリームのインスタンスへの参照を保存しないようにしてください。

于 2013-04-25T19:03:14.323 に答える