2011-03-22 88 views
1

在最近優化一些代碼時,我們最終執行了我認爲是「記憶式」的「類型」,但我不確定我們應該這麼稱呼它。下面的僞代碼不是實際的算法(因爲我們在我們的應用程序中幾乎不需要階乘因子,並且發佈了所述代碼是一個觸發攻擊),但它應該足以解釋我的問題。這是原文:這是否被認爲是記憶?

def factorial (n): 
    if n == 1 return 1 
    return n * factorial (n-1) 

很簡單,但我們增加了固定點,這樣可避免較大的數字大量的計算,是這樣的:

def factorial (n): 
    if n == 1 return 1 
    if n == 10 return 3628800 
    if n == 20 return 2432902008176640000 
    if n == 30 return 265252859812191058636308480000000 
    if n == 40 return 815915283247897734345611269596115894272000000000 
    # And so on. 

    return n * factorial (n-1) 

這當然意味着12!計算爲12 * 11 * 3628800而不是效率較低12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

但我不知道我們是否應該調用此memoisation因爲這似乎被定義爲記住計算的過去的結果,並使用它們。這更多的是關於硬編碼計算(不記得)和使用這些信息。

這個過程是否有一個合適的名稱,或者我們可以聲稱memoisation不僅延伸到運行時所做的計算,還包括那些在編譯時完成的計算,甚至在我開始之前回到我腦海中完成的計算編寫代碼?

+0

是的。這是一種記憶。你還需要知道什麼? – 2011-03-22 03:00:37

+0

_這是我需要知道的。它不會與維基百科條目凝結在一起,它具體指出:「一個memoized函數」記住「與某些特定輸入集相對應的結果。隨後的記憶輸入的調用返回記憶的結果,而不是重新計算它,......。我認爲可能會有不同的術語,因爲它不記得它,而是將其硬編碼。 – paxdiablo 2011-03-22 03:03:01

+0

好吧,到目前爲止我有兩個答案,是和否。這意味着可能需要引用權威來源。我會離開這個問題幾個小時,看看會發生什麼。 – paxdiablo 2011-03-22 03:08:40

回答

4

我把它叫做預先計算,而不是記憶化。你並沒有真正記得你在計算給定輸入的最終答案的過程中所做的任何計算,而是預先計算特定輸入的某些固定數量的答案。根據我的理解,Memoization實際上更類似於在計算它們以備後用時「緩存」一組結果。如果您要存儲計算的每個值,以便以後不需要重新計算,那就是記憶。您的解決方案不同之處在於,您不會存儲程序中的任何「計算」結果,只會存儲預先計算的固定點。通過記憶,如果您重新輸入與預先計算的輸入不同的輸入的函數,則不必重新計算結果,只需重新使用它即可。

1

無論你是否對結果進行硬編碼,這仍然是記憶,因爲你已經計算出了期望再次計算的結果。現在這可能會以運行時或編譯時間的形式出現..但無論如何,它都是memoization。

1

記憶在運行時完成。您正在編譯時進行優化。所以,事實並非如此。

例如參見... Wikipedia

或者...

  1. 記憶化 術語記憶化由Donald米基(1968)提出的,用以指過程,通過該函數是記得自動記得以前的計算結果。隨着功能語言的興起,這個想法近年來變得越來越流行;菲爾德和哈里森(1988)致力於整個篇章。基本思想就是保留一張先前計算的輸入/結果對的表格。

彼得·諾維格 加州大學 的(粗體是我的)

Link

+0

這個神祕的「運行時間」是什麼時候?我可以將以前運行的結果緩存在持久存儲中嗎?如果是這樣,我可以緩存以前運行的結果在可執行代碼本身嗎?如果是這樣,我可以緩存源代碼中以前運行的結果嗎?我不明白爲什麼有一個不包括「在源代碼中緩存先前結果」的隨機行。 – 2011-03-22 09:43:57

+0

@ S.Lott與往常一樣,單詞只是單詞,定義總是令人反感。我認爲OP使用的概念與通常的memoization定義不一樣,因爲1)他被迫修改函數來存儲新的/其他的結果,以及2)通常意義上的「函數會自動記住先前的計算結果「沒有人爲干預(因此_automatically_)。如果沒有這樣的協議,沒有人會死。 – 2011-03-22 11:43:33

+0

@belisarius:那麼,通過memoization測試的方法是讓函數重寫它自己的源代碼? – 2011-03-22 12:07:09