2016-11-06 2 views
0

私は次のコードを使っています。ここでColorWalk cloneこのfloodFillアルゴリズムを最適化するにはどうすればよいですか?アドバイスが必要

がjsのコードは次のとおりです。

function floodFill(x, y, selectedColor, grayColor) { 
    if (x < 0 || x >= 600) return; 
    if (y < 0 || y >= 400) return; 
    let square = $('.blockattribute').filter(function(ind, el) { 
    return $(el).css('left') == x + 'px' && $(el).css('top') == y + 'px' 
    }); 
    let squareColor = square.css('background-color'); 
    if (squareColor === grayColor || squareColor === selectedColor) { 
    square.removeClass().addClass('blockattribute gray'); 
    floodFill(x + 20, y, selectedColor, grayColor); 
    floodFill(x, y + 20, selectedColor, grayColor); 
    floodFill(x - 20, y, selectedColor, grayColor); 
    floodFill(x, y - 20, selectedColor, grayColor); 
    } 
    else { 
    return; 
    } 
} 

私はジャバスクリプト/ jqueryのとアルゴリズムを学習に取り組んできたと私はかなり、私は深く得るという事実を除いて、このクローンが働いていましたし、より深くグリッドに入ると、コードは遅くて遅くなります。私はメモ帳について読んでいて、グリッド上で使ってみようとしていましたが、私はどのようにアプローチするかについて固執しています。私が本当に探しているのは、これをどうやって行うのかについてちょっとお勧めです。たぶんmemoizationは行く方法ではないと私は他の方法で私のコードを最適化することができます。私の現在の考えは、最後の灰色の四角形をつかんでそこから進む必要があるということです。正しい軌道にいるのですか?

----編集------

私は灰色または選択した色

+0

次の関数を呼び出すと、最後の関数呼び出しからの戻り値を待つ必要がありますか? – guest271314

+0

返信ありがとう@ guest271314。最後の関数が返ってくるのを待ってどういう意味ですか?まだ処理されていませんか? –

+0

Hey @ guest271314、私は本当にいくつかの助けを使用することができ、私は次の関数が前の関数の戻り値を待つことを意味するものを正確に把握しようとしています。あなたはこのstackoverflowの質問のようなものについて話していますか? http://stackoverflow.com/questions/37724384/how-to-make-a-function-wait-until-return-value –

答えて

2

からの読み取りとDOMへの書き込みをマッチングをチェックするif/elseオペレータが非常にある組み合わせることができますことに気づきましたJavascriptで高価です。また、データのソースとしてDOMを使用しないでください。

アルゴリズムを高速化するには、ピクセルデータを通常のJavascriptデータとしてオフラインで保存し、データのみを操作してからビジュアルコードを1回更新します。これにより、DOM操作の数を最小限に抑えることができます。

さらに、Javascriptは「テールコール最適化」ではなく、永遠に再帰することはできず、すべてのレベルの再帰によってプログラムがある程度遅くなります。この場合、再帰的でないフラッドフィルアルゴリズムを使用することができれば、より高速になる可能性があります。

+0

_ "Javascriptは"テールコール最適化 "の意味ではありませんあなたは永遠に再帰することはできません "_テールコールの最適化は再帰と同等ですか? – guest271314

+0

ありがとう@Andy Ray、そういうわけでDOM要素の代わりに、私はjavascriptでグリッドのような配列を構築しなければなりません。そして、それを操作すればDOMを更新できます。あれは正しいですか? –

+0

Dan:はい。ビューとデータを分離します。 guest2713:何? –

関連する問題