「メモ化」と「キャッシュ」という用語を比較し、ウィキペディアのメモ化エントリを読んで、人々は「メモ化」という用語を使用すると意味があることに同意しますか?
- メモ化された結果はプロセスのメモリに保持されます。つまり、memcachedには保存されません。
- フィボナッチなどの数学関数のように、時間の経過とともに変化する可能性のある値ではなく、関数を「メモ化」するだけです。たとえば、Web サイトの登録ユーザー数などです。
上記以外のことをしている場合、結果をキャッシュしているだけですか?
「メモ化」と「キャッシュ」という用語を比較し、ウィキペディアのメモ化エントリを読んで、人々は「メモ化」という用語を使用すると意味があることに同意しますか?
上記以外のことをしている場合、結果をキャッシュしているだけですか?
よくわかりませんが、メモ化では、 の結果を格納できるように、決定論的 (つまり、特定y = f(u)
のに対しては常に同じでなければならない) であることが必要であると理解しています。f
u
y
f
私には、キャッシュは、どのデータが頻繁にアクセスされるかを判断し、それらのデータを高速ストレージに保持するという問題のほうが大きいように思えます。
前者は決定論的ですが、後者は確率論的です。
関数をメモ化すると、特定の引数セットに対する関数の結果をローカルにキャッシュできると思います。それはほとんどのようです:
function f(a, b, c) {
if (a==1 && b==2 && !c) {
return 5;
} else if (a==1 && b==3 && !c) {
return 17.2;
} /* ... etc ... */
// some horribly long/complex/expensive calculation
return result;
}
ただし、最初の巨大な「if」ブロックは自動的に処理され、はるかに効率的であり、関数が異なる引数で呼び出されると追加されます。
メモ化できるのは、決定論的で副作用のない関数のみであることに注意してください。これは、関数の結果がその入力にのみ依存し、実行時に何も変更できないことを意味します。
要するに、メモ化は非常に特殊な状況での関数ローカル キャッシングであり、通常のキャッシングの特殊化です。
私の理解では、はい、メモ化はキャッシングであり、数列 (フィボナッチ数列など) を計算するプログラムなど、時間が重要なプログラムを高速化するために使用されます。
この用語は大まかに同じ意味で使用できるため、議論の余地があります。
私にとって、「メモ化」の唯一の意味は次のとおりです。「キャッシング」は、事前計算されたテーブルではなく、以前の入力のものです。つまり、メモ化は、関数が独自の戻り値を記憶するプロセスです。