国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

JavaScript學(xué)習(xí)筆記之函數(shù)記憶

來源:懂視網(wǎng) 責(zé)編:小OO 時(shí)間:2020-11-27 20:04:50
文檔

JavaScript學(xué)習(xí)筆記之函數(shù)記憶

本文講解函數(shù)記憶與菲波那切數(shù)列的實(shí)現(xiàn),分享給大家,具體如下:定義;函數(shù)記憶是指將上次的計(jì)算結(jié)果緩存起來,當(dāng)下次調(diào)用時(shí),如果遇到相同的參數(shù),就直接返回緩存中的數(shù)據(jù)。舉個(gè)例子。原理;實(shí)現(xiàn)這樣一個(gè) memorize 函數(shù)很簡單,原理上只用把參數(shù)和對(duì)應(yīng)的結(jié)果數(shù)據(jù)存到一個(gè)對(duì)象中,調(diào)用時(shí),判斷參數(shù)對(duì)應(yīng)的數(shù)據(jù)是否存在,存在就返回對(duì)應(yīng)的結(jié)果數(shù)據(jù)。第一版;我們來寫一版。我們來測(cè)試一下。在 Chrome 中,使用 memorize 大約耗時(shí) 60ms,如果不使用函數(shù)記憶,大約耗時(shí) 1.3 ms 左右。注意;什么,我們使用了看似高大上的函數(shù)記憶,結(jié)果卻更加耗時(shí),這個(gè)例子近乎有 60 倍呢。所以,函數(shù)記憶也并不是萬能的,你看這個(gè)簡單的場(chǎng)景,其實(shí)并不適合用函數(shù)記憶。
推薦度:
導(dǎo)讀本文講解函數(shù)記憶與菲波那切數(shù)列的實(shí)現(xiàn),分享給大家,具體如下:定義;函數(shù)記憶是指將上次的計(jì)算結(jié)果緩存起來,當(dāng)下次調(diào)用時(shí),如果遇到相同的參數(shù),就直接返回緩存中的數(shù)據(jù)。舉個(gè)例子。原理;實(shí)現(xiàn)這樣一個(gè) memorize 函數(shù)很簡單,原理上只用把參數(shù)和對(duì)應(yīng)的結(jié)果數(shù)據(jù)存到一個(gè)對(duì)象中,調(diào)用時(shí),判斷參數(shù)對(duì)應(yīng)的數(shù)據(jù)是否存在,存在就返回對(duì)應(yīng)的結(jié)果數(shù)據(jù)。第一版;我們來寫一版。我們來測(cè)試一下。在 Chrome 中,使用 memorize 大約耗時(shí) 60ms,如果不使用函數(shù)記憶,大約耗時(shí) 1.3 ms 左右。注意;什么,我們使用了看似高大上的函數(shù)記憶,結(jié)果卻更加耗時(shí),這個(gè)例子近乎有 60 倍呢。所以,函數(shù)記憶也并不是萬能的,你看這個(gè)簡單的場(chǎng)景,其實(shí)并不適合用函數(shù)記憶。

這篇文章主要介紹了JavaScript學(xué)習(xí)筆記之函數(shù)記憶,小編覺得挺不錯(cuò)的,現(xiàn)在分享JavaScript源碼給大家,也給大家做個(gè)參考。對(duì)JavaScript感興趣的一起跟隨小編過來看看吧

本文講解函數(shù)記憶與菲波那切數(shù)列的實(shí)現(xiàn),分享給大家,具體如下

定義

函數(shù)記憶是指將上次的計(jì)算結(jié)果緩存起來,當(dāng)下次調(diào)用時(shí),如果遇到相同的參數(shù),就直接返回緩存中的數(shù)據(jù)。

舉個(gè)例子:

原理

實(shí)現(xiàn)這樣一個(gè) memorize 函數(shù)很簡單,原理上只用把參數(shù)和對(duì)應(yīng)的結(jié)果數(shù)據(jù)存到一個(gè)對(duì)象中,調(diào)用時(shí),判斷參數(shù)對(duì)應(yīng)的數(shù)據(jù)是否存在,存在就返回對(duì)應(yīng)的結(jié)果數(shù)據(jù)。

第一版

我們來寫一版:

我們來測(cè)試一下:

在 Chrome 中,使用 memorize 大約耗時(shí) 60ms,如果我們不使用函數(shù)記憶,大約耗時(shí) 1.3 ms 左右。

注意

什么,我們使用了看似高大上的函數(shù)記憶,結(jié)果卻更加耗時(shí),這個(gè)例子近乎有 60 倍呢!

所以,函數(shù)記憶也并不是萬能的,你看這個(gè)簡單的場(chǎng)景,其實(shí)并不適合用函數(shù)記憶。

需要注意的是,函數(shù)記憶只是一種編程技巧,本質(zhì)上是犧牲算法的空間復(fù)雜度以換取更優(yōu)的時(shí)間復(fù)雜度,在客戶端 JavaScript 中代碼的執(zhí)行時(shí)間復(fù)雜度往往成為瓶頸,因此在大多數(shù)場(chǎng)景下,這種犧牲空間換取時(shí)間的做法以提升程序執(zhí)行效率的做法是非常可取的。

第二版

因?yàn)榈谝话媸褂昧?join 方法,我們很容易想到當(dāng)參數(shù)是對(duì)象的時(shí)候,就會(huì)自動(dòng)調(diào)用 toString 方法轉(zhuǎn)換成 [Object object],再拼接字符串作為 key 值。我們寫個(gè) demo 驗(yàn)證一下這個(gè)問題:

兩者都返回了 1,顯然是有問題的,所以我們看看 underscore 的 memoize 函數(shù)是如何實(shí)現(xiàn)的:

從這個(gè)實(shí)現(xiàn)可以看出,underscore 默認(rèn)使用 function 的第一個(gè)參數(shù)作為 key,所以如果直接使用

肯定是有問題的,如果要支持多參數(shù),我們就需要傳入 hasher 函數(shù),自定義存儲(chǔ)的 key 值。所以我們考慮使用 JSON.stringify:

如果使用 JSON.stringify,參數(shù)是對(duì)象的問題也可以得到解決,因?yàn)榇鎯?chǔ)的是對(duì)象序列化后的字符串。

適用場(chǎng)景

我們以斐波那契數(shù)列為例:

我們會(huì)發(fā)現(xiàn)最后的 count 數(shù)為 453,也就是說 fibonacci 函數(shù)被調(diào)用了 453 次!也許你會(huì)想,我只是循環(huán)到了 10,為什么就被調(diào)用了這么多次,所以我們來具體分析下:

當(dāng)執(zhí)行 fib(0) 時(shí),調(diào)用 1 次

當(dāng)執(zhí)行 fib(1) 時(shí),調(diào)用 1 次

當(dāng)執(zhí)行 fib(2) 時(shí),相當(dāng)于 fib(1) + fib(0) 加上 fib(2) 本身這一次,共 1 + 1 + 1 = 3 次

當(dāng)執(zhí)行 fib(3) 時(shí),相當(dāng)于 fib(2) + fib(1) 加上 fib(3) 本身這一次,共 3 + 1 + 1 = 5 次

當(dāng)執(zhí)行 fib(4) 時(shí),相當(dāng)于 fib(3) + fib(2) 加上 fib(4) 本身這一次,共 5 + 3 + 1 = 9 次

當(dāng)執(zhí)行 fib(5) 時(shí),相當(dāng)于 fib(4) + fib(3) 加上 fib(5) 本身這一次,共 9 + 5 + 1 = 15 次

當(dāng)執(zhí)行 fib(6) 時(shí),相當(dāng)于 fib(5) + fib(4) 加上 fib(6) 本身這一次,共 15 + 9 + 1 = 25 次

當(dāng)執(zhí)行 fib(7) 時(shí),相當(dāng)于 fib(6) + fib(5) 加上 fib(7) 本身這一次,共 25 + 15 + 1 = 41 次

當(dāng)執(zhí)行 fib(8) 時(shí),相當(dāng)于 fib(7) + fib(6) 加上 fib(8) 本身這一次,共 41 + 25 + 1 = 67 次

當(dāng)執(zhí)行 fib(9) 時(shí),相當(dāng)于 fib(8) + fib(7) 加上 fib(9) 本身這一次,共 67 + 41 + 1 = 109 次

當(dāng)執(zhí)行 fib(10) 時(shí),相當(dāng)于 fib(9) + fib(8) 加上 fib(10) 本身這一次,共 109 + 67 + 1 = 177 次
所以執(zhí)行的總次數(shù)為:177 + 109 + 67 + 41 + 25 + 15 + 9 + 5 + 3 + 1 + 1 = 453 次!

如果我們使用函數(shù)記憶呢?

我們會(huì)發(fā)現(xiàn)最后的總次數(shù)為 12 次,因?yàn)槭褂昧撕瘮?shù)記憶,調(diào)用次數(shù)從 453 次降低為了 12 次!

興奮的同時(shí)不要忘記思考:為什么會(huì)是 12 次呢?

從 0 到 10 的結(jié)果各儲(chǔ)存一遍,應(yīng)該是 11 次吶?咦,那多出來的一次是從哪里來的?

所以我們還需要認(rèn)真看下我們的寫法,在我們的寫法中,其實(shí)我們用生成的 fibonacci 函數(shù)覆蓋了原本了 fibonacci 函數(shù),當(dāng)我們執(zhí)行 fibonacci(0) 時(shí),執(zhí)行一次函數(shù),cache 為 {0: 0},但是當(dāng)我們執(zhí)行 fibonacci(2) 的時(shí)候,執(zhí)行 fibonacci(1) + fibonacci(0),因?yàn)?fibonacci(0) 的值為 0, !cache[address] 的結(jié)果為 true,又會(huì)執(zhí)行一次 fibonacci 函數(shù)。原來,多出來的那一次是在這里!

也許你會(huì)覺得在日常開發(fā)中又用不到 fibonacci,這個(gè)例子感覺實(shí)用價(jià)值不高吶,其實(shí),這個(gè)例子是用來表明一種使用的場(chǎng)景,也就是如果需要大量重復(fù)的計(jì)算,或者大量計(jì)算又依賴于之前的結(jié)果,便可以考慮使用函數(shù)記憶。而這種場(chǎng)景,當(dāng)你遇到的時(shí)候,你就會(huì)知道的。

相關(guān)推薦:

JavaScript函數(shù)綁定用法解析

javascript函數(shù)的節(jié)流throttle與防抖debounce詳解

實(shí)例講解JavaScript函數(shù)綁定用法

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

JavaScript學(xué)習(xí)筆記之函數(shù)記憶

本文講解函數(shù)記憶與菲波那切數(shù)列的實(shí)現(xiàn),分享給大家,具體如下:定義;函數(shù)記憶是指將上次的計(jì)算結(jié)果緩存起來,當(dāng)下次調(diào)用時(shí),如果遇到相同的參數(shù),就直接返回緩存中的數(shù)據(jù)。舉個(gè)例子。原理;實(shí)現(xiàn)這樣一個(gè) memorize 函數(shù)很簡單,原理上只用把參數(shù)和對(duì)應(yīng)的結(jié)果數(shù)據(jù)存到一個(gè)對(duì)象中,調(diào)用時(shí),判斷參數(shù)對(duì)應(yīng)的數(shù)據(jù)是否存在,存在就返回對(duì)應(yīng)的結(jié)果數(shù)據(jù)。第一版;我們來寫一版。我們來測(cè)試一下。在 Chrome 中,使用 memorize 大約耗時(shí) 60ms,如果不使用函數(shù)記憶,大約耗時(shí) 1.3 ms 左右。注意;什么,我們使用了看似高大上的函數(shù)記憶,結(jié)果卻更加耗時(shí),這個(gè)例子近乎有 60 倍呢。所以,函數(shù)記憶也并不是萬能的,你看這個(gè)簡單的場(chǎng)景,其實(shí)并不適合用函數(shù)記憶。
推薦度:
標(biāo)簽: js 記憶 函數(shù)
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 图片亚洲va欧美va国产综合 | 在线综合亚洲欧美自拍 | 国产欧美一区二区精品久久久 | 日本欧美一区二区三区不卡视频 | 亚洲va国产va欧美va综合 | 久久亚洲私人国产精品 | 久久亚洲国产成人精品性色 | 欧美一页| 久久久久久91精品色婷婷 | 91麻豆视频网站 | 亚洲欧美偷拍另类 | 亚洲 欧美 自拍 另类 | 欧美在线中文 | 欧美 国产 日韩 第一页 | 亚洲综合视频 | 一区二区三区在线 | 欧美日韩亚洲天堂 | 日韩一区二区久久久久久 | 国产高清a毛片在线看 | 国产欧美日韩另类 | 国自产拍亚洲免费视频 | 日b毛片| 精品欧美一区二区三区在线 | 国产片91 | 日韩精品免费一区二区 | 欧美极品欧美精品欧美视频 | 久久精品a亚洲国产v高清不卡 | 欧美爱爱网站 | 日韩午夜免费视频 | 国产精品成人69xxx免费视频 | 精品国产一区二区三区香蕉 | 国产成人精品免费视频大全五级 | 中文在线免费看视频 | 在线播放国产视频 | 亚洲欧美视频在线观看 | 成人在线日韩 | 性欧美大战久久久久久久野外黑人 | 久久精品国产亚洲a不卡 | 亚洲国产97在线精品一区 | 久久国产成人精品 | 亚洲va国产va欧美va综合 |