2011-06-24 20 views
59

我想知道緩存和memoization之間的實際區別是什麼。正如我所看到的,它們都涉及避免重複的函數調用通過存儲來獲取數據。Caching和Memoization有什麼區別?

兩者有什麼區別?

+0

我想知道是否可以說「memoization是爲了緩存」,因爲「數組是稀疏數組」。換句話說,您只需「按需」存儲事物,而不是列舉每種可能的輸入組合。 –

回答

60

記憶是一種特定形式的緩存,它涉及基於其參數緩存函數的返回值。

緩存是一個更通用的術語;例如,HTTP緩存是緩存但不是記憶。

維基百科says

雖然相關的緩存,記憶化是指這種優化的特定情況下,從高速緩存的形式,如緩衝或頁面替換區分開來。

+2

但是你總是可以使用緩存與函數一起使用的部分,並命名爲'memoization'。雖然區別在於你在控制你的函數中的緩存策略,而memoization是更高階的,並且發生在我猜想的函數之外。 – nicolas

5

我認爲術語緩存通常用於存儲IO操作的結果,或者基本上來自外部的任何數據(文件,網絡,db查詢)。術語記憶通常適用於存儲自己的計算結果,例如在動態編程的情況下。

23

正如我所見,他們使用「memoization」是「緩存確定性函數的結果」,可以在任何時間給予相同的功能和輸入重現。

「緩存」基本上包括任何輸出緩衝策略,無論源值在給定時間是否可重現。實際上,高速緩存也被用來指代輸入緩衝策略,例如磁盤或內存上的寫緩存。所以這是一個更通用的術語。

+0

您確定函數必須是確定性的嗎? – Gherman

+1

@德國,是的,記憶取決於決定論。經典的例子是遞歸算法,如斐波那契數列或階乘。不是一直重新計算到基本情況,而是通過重複使用先前的結果來計算已經計算的值,從而使已記憶的函數短路。這顯然取決於相同的輸入總是產生相同的輸出,這就是決定論的定義。另一方面,高速緩存經常用於非確定性(例如隨機或時間戳)過程,並且理解結果可能與「刷新」值不匹配。 – harpo

0

記憶是一種緩存確定性函數結果的特殊形式。這意味着將結果緩存到函數之外不是記憶,因爲函數在計算新結果(不在緩存中)時不得不改變緩存,所以它不再是(純)函數。記憶通常意味着將緩存作爲附加參數傳遞(在輔助函數中)。 Memoization將優化需要爲單次訪問多次計算值的函數。緩存將優化使用相同參數多次調用的函數。換句話說,Memoization將優化第一次訪問是否緩存只會優化經常訪問。