2012-05-16 53 views
2

我發現了一些例子,如階乘計算來解釋memoization。這些很有幫助,但我正在尋求更深入的瞭解。在javascript中記憶的真實世界的例子?

我不知道是否有人能描述這種技術的實際應用程序,以及爲什麼他們用它來代替遞歸或任何其他的他們感到使用記憶化可以幫助他們優化。

回答

6

記憶化不僅僅是緩存更具體一點。

考慮使用一個選擇,就像你可能會使用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; 

} 

This link進入更詳細地,並且甚至包括可用於任何其它功能的一個通用memoize JS功能。

+0

感謝您的鏈接。 –

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); 
    }); 
    } 
} 
+0

對於初學者是緩存同義與記憶化?在你的例子中,通過緩存你只是指將ajax調用的結果賦值給局部變量? –

+0

是的,你緩存函數調用的結果,但這樣,它對函數調用的用戶是透明的,請參閱我的更新回答或@HackedByChinese示例 – snies

+0

結果不會對用戶透明函數調用「? –

1

,如果你願意,你可以刪除這一點,因爲我真的不能回答你的問題(也就是給你使用記憶化的一個例子),但我想指出的是,記憶化是爲了解決與遞歸完全不同類型的問題。記憶化存儲方法調用的輸出,使得未來的導出相同的方法調用(相同的參數和對象的綁定)的結果是一個查找,而不是計算。遞歸是一種函數算法。這意味着他們不會反對,因爲您可以記憶遞歸函數的輸出。

+0

感謝澄清如何使用memoization遞歸,並且它們不是直接可比較的概念 –