キャッシングとメモ化の違いは何ですか?


114

私は、実際のものとの違いの間知っていただきたいと思いますcachingし、memoizationです。
私が見ているように、どちらも、データを格納することによってデータを取得するために繰り返される関数呼び出しを回避することを含みます。

2つの主な違いは何ですか?


「メモ化はキャッシュすること」と「配列はスパース配列」と言えるのではないでしょうか。つまり、可能な入力の組み合わせをすべて列挙するのではなく、「オンデマンド」でのみ格納します。
Sridhar Sarnobat 2017

回答:


110

メモ化は、パラメーターに基づいて関数の戻り値キャッシュする特定の形式のキャッシュです。

キャッシングはより一般的な用語です。たとえば、HTTPキャッシングはキャッシングですが、メモ化ではありません。

ウィキペディアは言う

キャッシュに関連していますが、メモ化はこの最適化の特定のケースを参照し、バッファリングやページ置換などのキャッシュの形式と区別します。


2
ただし、関数でキャッシュが使用されている部分を常に「メモ化」することができます。違いは、関数のキャッシュポリシーを制御していることですが、メモ化はより高次であり、関数の外側で発生すると思います。
ニコラス2014年

HTTPキャッシングが記憶されないのはなぜですか?これもパラメーター(要求されたリソースのURL)に基づいています。
topo Reinstate Monica

@topomorto:などの機能If-Matchと有効期限のため。メモ化は、HTTPがそうであることがほとんどない純粋な関数に対してのみ意味があります。
SLaks

@nicolas、結構だと思います。メモ化では、「関数」という用語は純粋/数学的な意味で使用されていると思います。特定のアドレスからのWebページのダウンロードは、ページが変更される可能性があるため、機能とは見なされません。
Alexey 2018

@Alexeyは同じ発言がキャッシュに適用されませんか?これらの戦略はすべて、同じ結果を返す同じ関数呼び出しに依存しています。つまり、上流の副作用はありません。
ニコラス2018

47

私がそれらを使用したのを見てきたように、「メモ化」は「確定的関数の結果をキャッシュする」ことであり、同じ関数と入力を与えられるといつでも再現できます。

「キャッシング」には、ソース値が特定の時間に再現可能かどうかに関係なく、基本的にすべての出力バッファリング戦略が含まれます。実際、キャッシュは、ディスクまたはメモリの書き込みキャッシュなど、入力バッファリング戦略を参照するためにも使用されます。したがって、これはより一般的な用語です。


関数は決定論的である必要があると確信していますか?
ガーマン

4
@ドイツ語、はい、メモ化は決定論に依存します。古典的な例は、フィボナッチ数列や階乗などの再帰アルゴリズムです。メモ化された関数は、ベースケースに至るまでずっと再計算する代わりに、すでに計算された値の以前の結果を再利用することで短絡します。これは明らかに、同じ入力に常に依存し、常に同じ出力を生成します。これは決定論の定義です。一方、キャッシングは、結果が「更新された」値と一致しない可能性があることを理解した上で、非決定的(たとえば、ランダムまたはタイムスタンプ付き)プロセスに頻繁に使用されます。
harpo 2016年

6

キャッシュという用語は通常、IO操作の結果、または基本的に外部から送られてくるデータ(ファイル、ネットワーク、dbクエリ)を格納するときに使用されると思います。通常、用語のメモ化は、たとえば動的プログラミングのコンテキストで、独自の計算の結果を保存する場合に適用されます。


1

メモ化は、確定的関数の結果をキャッシュする特別な形式です。これは、関数が新しい結果(まだキャッシュにない)を計算するときにキャッシュを変更する必要があるため、関数の外部で結果をキャッシュすることはメモ化されないことを意味します。メモ化は一般的に、キャッシュを(ヘルパー関数の)追加の引数として渡すことを意味します。メモ化は、1回のアクセスで値を数回計算する必要がある関数を最適化します。キャッシングは、同じパラメーターで複数回呼び出される関数を最適化します。言い換えると、メモ化は、キャッシュが繰り返しアクセスのみを最適化するかどうかにかかわらず、最初のアクセスを最適化します。


0

他の素晴らしい答えに加えて、メモ化タブリングとも呼ばれます。メモ化とキャッシングとは何かを学ぶ人にとっては、この用語を知ることも重要だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.