成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

提升JavaScript遞歸效率:Memoization技術詳解

開發 前端
遞歸是拖慢腳本運行速度的大敵之一,太多的遞歸會讓瀏覽器變得越來越慢直到死掉或者莫名其妙的突然自動退出。這里我們可以通過memoization技術來替代函數中太多的遞歸調用,提升JavaScript效率。

遞歸是拖慢腳本運行速度的大敵之一。太多的遞歸會讓瀏覽器變得越來越慢直到死掉或者莫名其妙的突然自動退出,所以我們一定要解決在JavaScript中出現的這一系列性能問題。

我們可以通過memoization技術來替代函數中太多的遞歸調用。memoization是一種可以緩存之前運算結果的技術,這樣我們就不需要重新計算那些已經計算過的結果。

對于通過遞歸來進行計算的函數,memoization簡直是太有用了。我現在使用的memoizer是由Crockford寫的,主要應用在那些返回整數的遞歸運算中。當然并不是所有的遞歸函數都返回整數,所以我們需要一個更加通用的memoizer()函數來處理更多類型的遞歸函數。

  1. function memoizer(fundamental, cache) {   
  2.   cachecache = cache || {};   
  3.   var shell = function(arg) {   
  4.       if (! (arg in cache)) {   
  5.           cache[arg] = fundamental(shell, arg);   
  6.       }   
  7.       return cache[arg];   
  8.   };   
  9.   return shell;   

這個版本的函數和Crockford寫的版本有一點點不同。首先,參數的順序被顛倒了,原有函數被設置為***個參數,第二個參數是緩存對象,為可選參數,因為并不是所有的遞歸函數都包含初始信息。在函數內部,我將緩存對象的類型從數組轉換為對象,這樣這個版本就可以適應那些不是返回整數的遞歸函數。在shell函數里,我使用了in操作符來判斷參數是否已經包含在緩存里。這種寫法比測試類型不是undefined更加安全,因為undefined是一個有效的返回值。我們還是用之前提到的斐波納契數列來做說明:

  1. var fibonacci = memoizer(function(recur, n) {   
  2.   return recur(n - 1) + recur(n - 2);   
  3. }, { "0": 0, "1": 1} ); 

同樣的,執行fibonacci(40)這個函數,只會對原有的函數調用40次,而不是夸張的331,160,280次。memoization對于那些有著嚴格定義的結果集的遞歸算法來說,簡直是棒極了。然而,確實還有很多遞歸算法不適合使用memoization方法來進行優化。

有的觀點認為,任何使用遞歸的情況,如果有需要,都可以使用迭代來代替。實際上,遞歸和迭代經常會被作為互相彌補的方法,尤其是在另外一種 出問題的情況下。將遞歸算法轉換為迭代算法的技術,也是和開發語言無關的。這對JavaScript來說是很重要的,因為很多東西在執行環境中是受到限制的。讓我們回顧一個典型的遞歸算法,比如說歸并排序,在JavaScript中實現這個算法需要下面的代碼:

  1. function merge(left, right) {   
  2.   var result = [];   
  3.   while (left.length > 0 && right.length > 0) {   
  4.       if (left[0] < right[0]) {   
  5.           result.push(left.shift());   
  6.       } else {   
  7.           result.push(right.shift());   
  8.       }   
  9.   }   
  10.   return result.concat(left).concat(right);   
  11. }  
  12.  
  13. //采用遞歸實現的歸并排序算法   
  14. function mergeSort(items) {   
  15.   if (items.length == 1) {   
  16.       return items;   
  17.   }   
  18.   var middle = Math.floor(items.length / 2),   
  19.   left = items.slice(0, middle),   
  20.   right = items.slice(middle);   
  21.   return merge(mergeSort(left), mergeSort(right));   

調用mergeSort()函數處理一個數組,就可以返回經過排序的數組。注意每次調用mergeSort()函數,都會有兩次遞歸調用。這個算法不可以使用memoization來進行優化,因為每個結果都只計算并使用一次,就算緩沖了結果也沒有什么用。如果你使用mergeSort()函數來處理一個包含100個元素的數組,總共會有199次調用。1000個元素的數組將會執行1999次調用。在這種情況下,我們的解決方案是將遞歸算法轉換為迭代算法,也就是說要引入一些循環:

  1. // 采用迭代實現的歸并排序算法   
  2. function mergeSort(items) {   
  3.   if (items.length == 1) {   
  4.       return items;   
  5.   }   
  6.   var work = [];   
  7.   for (var i = 0,   
  8.   len = items.length; i < len; i++) {   
  9.       work.push([items[i]]);   
  10.   }   
  11.   work.push([]); //in case of odd number of items   
  12.   for (var lim = len; lim > 1; lim = (lim + 1) / 2) {   
  13.       for (var j = 0,   
  14.       k = 0; k < lim; j++, k += 2) {   
  15.           work[j] = merge(work[k], work[k + 1]);   
  16.       }   
  17.       work[j] = []; //in case of odd number of items   
  18.   }   
  19.   return work[0];   

這個歸并排序算法實現使用了一系列循環來代替遞歸進行排序。由于歸并排序首先要將數組拆分成若干只有一個元素的數組,這個方法更加明確的執行了這個操作,而不是通過遞歸函數隱晦的完成。work數組被初始化為包含一堆只有一個元素數組的數組。

在循環中每次會合并兩個數組,并將合并后的結果放回work數組中。當函數執行完成后,排序的結果會通過work數組中的***個元素返回。在這個歸并排序的實現中,沒有使用任何遞歸,同樣也實現了這個算法。

【編輯推薦】

  1. JavaScript中的函數式編程實踐
  2. JavaScript函數的定義及形式參數
  3. 揭開Javascript閉包的真實面目 

 

責任編輯:王曉東 來源: JavaEye博客
相關推薦

2009-03-11 17:31:46

2015-10-08 17:15:20

RFID技術物聯網

2025-01-07 10:48:08

2024-10-15 10:11:04

2020-08-11 08:11:40

JavaScript開發技術

2025-03-04 13:00:00

JavaScrip代碼語言

2025-03-03 00:15:00

JavaScript開發效率

2020-07-25 19:38:54

JavaScriptJavaScript庫Web

2012-04-19 10:23:03

虛擬化微虛擬化

2012-06-26 09:55:38

2020-03-23 09:31:51

JavaScript函數技術

2022-01-19 16:13:20

戴爾

2020-06-16 10:00:00

航空

2017-12-21 19:53:25

潤乾蔣步星

2020-10-19 15:39:34

人工智能

2020-07-17 10:40:35

人工智能

2011-07-08 10:22:12

智能布線

2024-10-09 12:18:38

2024-08-30 17:14:34

2015-07-28 10:42:34

DevOpsIT效率
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av国产精品| 国产精品视频一二三区 | 精品久久影院 | 欧美日韩一区二区在线观看 | 国产精品一区二区不卡 | 国产超碰人人爽人人做人人爱 | 国产色婷婷精品综合在线播放 | 成人激情视频网 | 国产69久久精品成人看动漫 | 正在播放一区二区 | 99色综合 | 久久com| 精品国产乱码久久久久久闺蜜 | 久久一级 | 小草久久久久久久久爱六 | 国产精品久久久久久久久久久久 | 日韩av在线免费 | 亚洲高清在线视频 | 99久久国产免费 | 黄色视频a级毛片 | 欧美精品一区二区三区四区 在线 | 精品网| 新91视频网| 国产精品视频在线免费观看 | 欧美一区二区三区在线观看 | 国产精品欧美一区二区 | 成人久久18免费网站 | 99热精品在线观看 | 九九热精品免费 | 最新中文字幕第一页视频 | 日韩成人在线看 | 亚洲国产精品va在线看黑人 | 看羞羞视频 | 久久久久久综合 | 色视频免费 | 国产羞羞视频在线观看 | 一区影视| 亚洲成人精品 | 在线国产欧美 | 亚洲一页| 国产精品成人国产乱一区 |