2016-10-12 11 views
0

私はキューを使用して移動ウィンドウの最小値を見つけようとしています。私は解決策を作成することができましたが、これは非常に遅いと感じています。移動ウィンドウの最小と最大、より良い実装?

def min_max(value:T, windowSize: Int):(T,T) = { 
    val queue = new scala.collection.mutable.Queue[A]() //I added the creation of this queue here for you to see 
    if(queue.size == windowSize) queue.dequeue 
    queue.enqueue(value)  
    var min = queue.head 
    var max = queue.head 
    for(i <- queue) { 
    if(i<min) min = i 
    if(i>max) max = i 
    } 
    (min, max)     // returns the min and max in a tuple 
} 

答えて

0

それはあなたのキューが構築され、移入されどのように依存し、どのように大きなそれは次のとおりです。

は、ここに私のソリューションです。要するに、最小/最大スキャンを高速化することができますが、キューに要素を追加する速度を遅くするか、または先行コストをかけることになります。

線形のデータ構造体と同じくらい良い線形ですが、より慣用的な方法で書くことができます(また、dequeueの内容はわかりません)。開始、およびキューサイズが小さいか大きい方より)であるときには起こることを期待するもの:

queue 
    .take(windowSize) 
    .foldLeft(Option.empty[A] -> Option.empty[A]) { 
    case ((None, None), x) => Some(x) -> Some(x) 
    case ((x, y), z) => x.map(x min z) -> y.map(y max z) 
    } 

をこれまた何のレースは(あなたがそれを横断している間、誰もがキューにデータを追加されていない)が存在しないことを前提としてい。あなたが絶対にしなければ、可変構造を使用しないという機能的なアプローチを採用すれば、このようなことは非常に簡単になります。

関連する問題