記憶化是一個輔助函數,或者我們可以說是一種透過追蹤函數過去已經計算出的值來提高程式效率的技術。在本文中,我們將透過不同的範例來討論 Memoization Helper 功能,並詳細討論所有範例,以便我們更好地理解 Memoization。
現在讓我們在下面的部分深入討論 Memoization 輔助函數,並查看它們的實作和解釋。
記憶化是一種程式設計技術,用於透過追蹤函數過去已經計算過的值來提高程式的時間複雜度和空間複雜度。透過將函數呼叫的結果保存在快取中,程式變得更加有效率。透過重複運行具有先前計算的相同參數的函數,我們經常浪費時間。然後我們可以快取計算值,並在使用相同參數呼叫函數時傳回它。
在這裡,我們將探索大量範例和解釋,以幫助您更好地理解記憶輔助函數。
讓我們透過這個範例來看看記憶輔助函數的工作原理,在這個範例中我們將討論程式碼、輸出和解釋,以便更好地理解這個概念 -
function add(num1,num2){ for(let i=0;i<100000;i++){ } return num1+num2; } console.log(add(5,4)); console.log(add(5,4));
這裡我們定義了add函數,傳入兩個參數num1和num2來執行整數num1和num2的加法。在這個函數中,我們運行了 for 循環,之後我們必須傳回兩個整數的總和。
在本例中,我們呼叫了加法函數,但由於 for 循環,我們的函數需要一些時間。我們使用相同的參數一次又一次地呼叫該函數。因此,如果我們透過儲存加法值來使用記憶,以便能夠節省時間,那麼我們將傳回快取的值。我們不需要計算相同參數的附加價值。
讓我們在程式碼和解釋的幫助下看看我們的函數花了多長時間來確定 add (5,4) 的值 -
function add(num1,num2){ for(let i=0;i<100000;i++){ } return num1+num2; } console.time("Time taken"); console.log(add(5, 4)); console.timeEnd("Time taken");
我們的函數花了 14.441ms 的時間來增加整數 5 和 4。
透過使用記憶技術,我們可以快取已經計算出的值,然後在使用相同參數呼叫函數時傳回它,從而提高函數的效率。
現在讓我們討論如何利用記憶技術來縮短重複執行具有相同參數的函數所需的時間。
function memoizeFunction(func) { let storage = {}; return function (val1, val2) { const val = val1.toString() + val2.toString(); if (!storage[val]) { storage[val] = func(val1, val2); } return storage[val]; } } function add(num1, num2) { for (let i = 0; i < 10000000; i++) { } return num1 + num2; } console.time("First time, time taken"); let func = memoizeFunction(add); console.log(func(5, 4)); console.timeEnd("First time, time taken"); console.time("Second time, time taken"); func = memoizeFunction(add); console.log(func(5, 4)); console.timeEnd("Second time, time taken"); console.time("Third time, time taken"); func = memoizeFunction(add); console.log(func(5, 4)); console.timeEnd("Third time, time taken");
注意 - 完成任務所需的時間長度可能會改變。
在本例中,我們快取了先前使用記憶函數計算的值。當我們最初使用 func(4,5) 時,參數首先被轉換為字串形式,然後與計算值一起保存在物件「儲存」中。
此外,當使用相同參數呼叫函數時,它首先確定它是否已存在於物件「儲存」中。如果已經計算過,則不會再次計算,而只會傳回物件「儲存」中包含的值。
從輸出可以看出,每次使用具有相同參數的函數時,添加 5 和 4 所花費的時間都會更少。
每次都花時間 -
98.885 ms 83.375 ms 13.071 ms
因此,從輸出中可以明顯看出,記憶技術有助於縮短我們每次重複調用具有相同參數的函數的時間。
讓我們討論斐波那契數列記憶輔助函數的另一個例子。
function memoizeFunction(func) { let storage = {}; return function (val) { const value = val.toString(); if (!storage[value]) { storage[value] = func(val); } return storage[value]; } } function fibonacci(num) { if (num === 0 || num === 1) return num; else return fibonacci(num - 1) + fibonacci(num - 2); } console.time("First time, time taken"); let func = memoizeFunction(fibonacci); console.log(func(6)); console.timeEnd("First time, time taken"); console.time("Second time, time taken"); func = memoizeFunction(fibonacci); console.log(func(6)); console.timeEnd("Second time, time taken"); console.time("Third time, time taken"); func = memoizeFunction(fibonacci); console.log(func(6)); console.timeEnd("Third time, time taken");
如果在沒有記憶技術幫助的情況下執行所有步驟,斐波那契數列的執行時間將呈指數級增長。透過儲存先前的結果,我們可以得到預先定義的結果,減少對計算結果的進一步檢查,並且可以採取一些步驟來線性化。
在本文中,我們了解到 Memoization 是一種輔助函數或一種透過追蹤函數過去已經計算的值來提高程式效率的技術。透過將函數呼叫的結果保存在快取中,程式變得更加有效率。然後我們可以快取計算值,並在使用相同參數呼叫函數時傳回它。
以上是解釋實現記憶輔助功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!