3

メモ化を説明するための階乗計算などの例を見つけました。これらは役に立ちますが、私はより深い理解を求めています。

誰かがこの手法の実際のアプリケーションを説明できるかどうか、そしてなぜ再帰の代わりにそれを使用したのか、またはメモ化を使用して他の何かを使用したことが最適化に役立つのではないかと思います。

4

3 に答える 3

7

メモ化は、単なるキャッシュよりも少し具体的です。

jQueryの場合と同様に、セレクターを使用してDOM内の要素を検索することを検討してください。言う、$('.some-selector')。このコンテキストでは、関数を呼び出し$て、CSSセレクター「.some-selector」を持つすべての要素を検索するように指示しています。$('.some-selector')ドキュメントが大きく、何度も電話をかける必要があるとしましょう。

を呼び出すたびに同じ結果が返されると想定できるため、$('.some-selector')呼び出されるたびに実際の処理を行うのは無駄な作業です。したがって、$引数(この場合は「.some-selector」)をルックアップテーブルまたはディクショナリのキーとして使用できます。その引数を使用して関数を初めて呼び出すと、通常どおりに処理され、引数をキーとして使用して結果がディクショナリに配置され、結果が返されます。後続の呼び出しでは、キーにすでに計算された結果を表す値がディクショナリにあることがわかります。そのため、キーはそれらの以前の結果を返すだけです。正味の効果は、あなたがすでに知っている結果を見つけるのに時間を無駄にしないということです。

少し大雑把なJavaScriptの例:

var _dictionary = {};

function $(selector) {
   if (_dictionary[selector]) return _dictionary[selector]; // lookup the results of the selector and return them if they exist

   // otherwise, execute the function's logic normally
   // TODO: search logic
   var results = doSearch();

   _dictionary[selector] = results;

   return results;

}

このリンクはさらに詳細になり、memoize他の関数に使用できる汎用JS関数も含まれています。

于 2012-05-16T02:34:22.750 に答える
2

あらゆる種類のキャッシュにメモ化を使用できます。たとえば、いくつかのajax呼び出しの結果をキャッシュできます。

例:

var cache = new Array()

function memoized_ajax(url, callback) (
  if (cache[url]) {      
    callback(cache[url]);  // we already know the result for this url
  }
  else {
    $.ajax({
      url: url,
      success: function(data) {
        cache[url] = data;   // we will remember result for this url
        callback(data);
    });
  }
}
于 2012-05-16T02:26:42.047 に答える
1

私はあなたの質問に実際に答えることができないので(つまり、メモ化の使用例を示します)、必要に応じてこれを削除できますが、メモ化は再帰とはまったく異なるタイプの問題を解決することを目的としていることを指摘しておきます。メモ化では、メソッド呼び出しの出力が保存されるため、将来の同一のメソッド呼び出し(同じパラメーターとオブジェクトバインディング)の結果を取得することは、計算ではなくルックアップになります。再帰は関数アルゴリズムの一種です。これは、再帰関数の出力をメモ化できるため、反対されないことを意味します。

于 2012-05-16T02:31:11.263 に答える