摘要:函數(shù)可以將先前操作的結(jié)果記錄在某個(gè)對象里,從而避免無謂的重復(fù)運(yùn)算。這種優(yōu)化被稱為記憶。在看看斐波那契數(shù)列的栗子使用了函數(shù)記憶,調(diào)用次數(shù)從次減少到了次。
函數(shù)可以將先前操作的結(jié)果記錄在某個(gè)對象里,從而避免無謂的重復(fù)運(yùn)算。這種優(yōu)化被稱為記憶。
最近讀javascript語言精粹這本書函數(shù)章節(jié)的時(shí)候,里面有個(gè)記憶函數(shù)的優(yōu)化,書中給的栗子是斐波那契數(shù)列執(zhí)行的時(shí)候減少調(diào)用次數(shù)的優(yōu)化,那么這種優(yōu)化能在哪些場景使用呢?
在看書中的栗子之前,我們先看一個(gè)栗子:
var memorize = function(f,hasher){ var memoize = function(name){ var cache = memoize.cache; var key = "" + (hasher ? hasher.apply(this,arguments):name) if(!cache[key]){ cache[key] = f.apply(this,arguments); } return cache[key]; } memoize.cache = {}; return memoize; } function add(a,b){ return a+b; } var memorizedAdd = memorize(add,function(){ var args = Array.prototype.slice.call(arguments); return JSON.stringify(args); }); console.time("使用函數(shù)記憶執(zhí)行時(shí)間"); for(var i = 0; i < 10000;i++){ memorizedAdd(1,2); } console.timeEnd("使用函數(shù)記憶執(zhí)行時(shí)間"); console.time("原生調(diào)用執(zhí)行時(shí)間"); for(var i = 0; i < 10000;i++){ add(1,2); } console.timeEnd("原生調(diào)用執(zhí)行時(shí)間"); //使用函數(shù)記憶執(zhí)行時(shí)間: 15.49462890625ms //原生調(diào)用執(zhí)行時(shí)間: 0.962890625ms
上面的memoize方法來自u(píng)nderscore源碼,這說明函數(shù)記憶并不是萬能的。
在看看斐波那契數(shù)列的栗子:
var count = 0; var fibonacci = function(n){ count++; return n< 2 ? n : fibonacci(n-1) + fibonacci(n-2); } for(var i = 0; i <= 10;i++){ fibonacci(i); } console.log(count);//453 fibonacci = memorize(fibonacci); for(var i = 0; i <= 10;i++){ fibonacci(i); } console.log(count);//12
使用了函數(shù)記憶,調(diào)用次數(shù)從453次減少到了12次。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90440.html
摘要:路由記憶名詞解釋在中后臺(tái)系統(tǒng)開發(fā)中,訪問任何頁面時(shí),認(rèn)證是永遠(yuǎn)繞不過的檻。這個(gè)過程,暫且稱之為路由記憶,前面例子中的登錄頁面稱之為記憶節(jié)點(diǎn)。 SPA 路由記憶 名詞解釋 在中后臺(tái)系統(tǒng)開發(fā)中,訪問任何頁面時(shí),認(rèn)證是永遠(yuǎn)繞不過的檻。以登錄為例,如果檢測出當(dāng)前用戶未登錄,會(huì)強(qiáng)制跳轉(zhuǎn)到登錄頁面提示用戶進(jìn)行登錄。登錄完成后,系統(tǒng)需要跳轉(zhuǎn)至用戶原先想訪問的頁面。這個(gè)過程,暫且稱之為路由記憶,前面例...
摘要:而從數(shù)學(xué)上看的話,更是短時(shí)記憶了,因?yàn)樘荻攘鹘?jīng)的時(shí)候,經(jīng)歷的是的連環(huán)相乘的路徑在輸入輸出門關(guān)閉前,顯然如前邊的數(shù)學(xué)證明中所述,這樣會(huì)發(fā)生梯度爆炸和 引人入勝的開篇:想要搞清楚LSTM中的每個(gè)公式的每個(gè)細(xì)節(jié)為什么是這樣子設(shè)計(jì)嗎?想知道simple RNN是如何一步步的走向了LSTM嗎?覺得LSTM的工作機(jī)制看不透?恭喜你打開了正確的文章!?前方核彈級(jí)高能預(yù)警!本文信息量非常大,文章長且思維連貫...
摘要:專題系列第十七篇,講解函數(shù)記憶與菲波那切數(shù)列的實(shí)現(xiàn)定義函數(shù)記憶是指將上次的計(jì)算結(jié)果緩存起來,當(dāng)下次調(diào)用時(shí),如果遇到相同的參數(shù),就直接返回緩存中的數(shù)據(jù)。 JavaScript 專題系列第十七篇,講解函數(shù)記憶與菲波那切數(shù)列的實(shí)現(xiàn) 定義 函數(shù)記憶是指將上次的計(jì)算結(jié)果緩存起來,當(dāng)下次調(diào)用時(shí),如果遇到相同的參數(shù),就直接返回緩存中的數(shù)據(jù)。 舉個(gè)例子: function add(a, b) { ...
函數(shù)式編程之記憶是一種時(shí)間換空間的方法,用犧牲空間的復(fù)雜度來換取時(shí)間的復(fù)雜度 字符串連接 function f() { var s = arguments.length + Array.prototype.join.call(arguments); console.log(s); }; 這里使用的是Array.prototype.join方法進(jìn)行字符串連接返回的是連接的結(jié)果 接下來,寫一個(gè)...
摘要:意味著完全保持,意味著完全丟棄。卡比獸寫這篇博文的時(shí)間我本可以抓一百只,請看下面的漫畫。神經(jīng)網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)會(huì)以的概率判定輸入圖片中的卡比獸正在淋浴,以的概率判定卡比獸正在喝水,以的概率判定卡比獸正在遭遇襲擊。最終結(jié)果是卡比獸正在遭遇襲擊 我第一次學(xué)習(xí) LSTM 的時(shí)候,它就吸引了我的眼球。事實(shí)證明 LSTM 是對神經(jīng)網(wǎng)絡(luò)的一個(gè)相當(dāng)簡單的擴(kuò)展,而且在最近幾年里深度學(xué)習(xí)所實(shí)現(xiàn)的驚人成就背后都有它們...
閱讀 2977·2023-04-25 17:22
閱讀 1542·2019-08-30 15:54
閱讀 1270·2019-08-30 15:53
閱讀 1787·2019-08-30 15:43
閱讀 3020·2019-08-29 12:29
閱讀 1232·2019-08-26 11:37
閱讀 3255·2019-08-23 18:02
閱讀 1604·2019-08-23 14:15