既然是总结,就不要重复书中内容了,适当总结、扩展、思考。
实际上会用在javascript上面的算法实在是不会太多,但由于js非编译语言的特性,所以
浏览器解释器能给的优化不能算太好。优化仅有的一些循环和流程控制显得非常必要。
然后我一上来就中枪了,以为for in这样的写法会比较好写,所以一直做数组操作的时候
使用这个方法。但是,这个方法会同时搜索实例或原型属性,所以每次迭代的时候都会产生额外
的开销。因些,不要用for in来遍历数组。
递归如果次数太多,就不要使用了,会抛出异常。改用迭代。
如果不是均匀分布的话,可以使用二分法,找出数据出现次数多的一部分做数据判断切割。
书中提到了三个算法-
1.Duff's Device:处理大数据循环
var i = items.legnth%8; while(i){ process(items[i]--); } i = Math.floor(items.elgnth/8); while(i){ process(items[i]--); process(items[i]--); process(items[i]--); process(items[i]--); process(items[i]--); process(items[i]--); process(items[i]--); }
但是这里我产生了两个疑问,希望各位看客帮我解答一下。
1.为什么是八次。把一个循环用8拆分。
2.为什么这么做就可以减少很多时间问题?
实际上我感觉这个问题就像是把 for(i=0;i<100;i++)变成了
for(i=0;i<10;i++){
for(j=0;j<10;j++)
}
一样。那它改变的内容实质在哪里呢????
2.有映射关系的优化:
var arr = [r0,r1,r2,r3,r4,r5,r6,r7]; return arr[i]; 会比 if(i==0){ return r0; } else if(i==1){ return r1; } 快. 但是。!!!! 既然有映射关系, 那还不如直接 return r(映射值)*i(选择值); 请各位看客帮我解答一下。
3.缓存技术算法:
function memoize(fundamental,cache){ cache = cache||{}; var shell = function(arg){ if(!cache.hasOwnProperty(arg)){ cache[arg] = fundamental(arg); } return cache[arg]; }; } 调用方法: var memfactorial = memoize(factorial,{"0":1,"1":1}); var fact6 = memfactorial(6); var fact5 = memfactorial(5); var fact4 = memfactorial(4);
实际上这个算法就是将以后可能会用到的计算过的值保存下来,用空间換取时间。