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