发表于: 2017-07-29 23:02:45
3 939
今天完成的事情:
1.基本上是完成了任务2,目前还有点小bug
明天计划的事情:
1.解决bug
2.重新再看看正则表达式
3.了解并试用F12调试
遇到的问题:
1.关于变量作用域,看得时候还算明白,自己写代码的时候就头脑不清晰了,今天要再看看
收获:
1.经典的洗牌算法
今天最大的收获就是洗牌算法了,体会到一点编程的乐趣,以为以前喜欢的数学没了卵用,今天排上点用场。果然还是喜欢知识比喜欢女的有用
所谓洗牌算法(shuffle),就是有序的随机打成乱序,要求是随机,每种情况的概率相同
比如讲数组["a","b","c","d","e","f","g"]打乱。
经典洗牌算法的的原理:
长度为len的数组,依次执行以下操作:
(1)从前len位中随机选出一个元素,与第len位交换;
(2)从前len-1位中随机选出一个元素,与第len-1位交换;
……
(len)从前1位中随机选出一个一个元素,与第1位交换;
经典算法的洗牌函数:
现在再写一下经典算法的洗牌函数,算是对学习进行各检验:
function shuffle(arr){
var len=arr.length;
for (i=0;i<len;i++){
var idx=Math.floor(Math.random()*(len-i));
var temp=arr[idx];
arr[idx]=arr[len-i-1];
arr[len-i-1]=temp;
}
return arr;
}
证明:
经典算法可以用数学归纳法证明,先回顾一下中学时代的数学归纳法:
比如欲证明某一结论对一切自然数n均成立:
a.验证当n=1时成立;
b.假设当n=k时成立;
由a,b假设推出n=k+1时成立,但是不能将n=k+1直接带入到假设原式中去,以下是证明过程:
i.当n=2时成立,从前两位中随机抽出一个与第二位交换,再从前一位中随机抽出一个与第一位交换,原来的元素洗牌后出现在第一位、第二位的概率相等,故成立。
ii.假设n=k时成立,即每一个元素洗牌后出现在每一位的概率都为1/k;
iii.当n=k+1:
第一次交换是从前k+1中选出任意选出一个元素,与第k+1个进行交换,被交换到最后一位的概率为1/k+1,不被交换到最后一位的概率为k/k+1;
接下来的k次交换中,每个数字出现在前k位中任意一位的概率为1/k;
那么,前k+1位元素中的每一位,在洗牌后出现在前k位中任意一位的概率为(k/k+1)*1/k,即1/k+1,
那么,前k+1位元素中的每一位,在洗牌后出现在前k+1位中任意一位的概率为1/k+1。
当n=k+1时,假设成立;
故假设成立,洗牌算法得证。
2.数组的一些常见方法:
(1)concat()方法,用于将两个数组组合在一起,或者说是在某一个数组上增加另外一个
如:
var arr1=["A","B"];
var arr2=["C", "D"];
arr1.concat(arr2);//["A","B","C","D"];
(2)join()方法,将数组的元素组合成字符串
arr1.join(".")//A.B.C 添加的参数为新字符串之间的连接符
(3)sort()方法 对数组进行排序
不输入参数时按字符编码排序,可以自定义排序函数作为参数
如:
var arr=[1,2,3,4,5,6];
arr.sort(function mySort(a,b){return a-b;})
相当于sort()方法每次从中选出两个元素a、b,这两个元素a、b按照排序函数里定义的运算进行运算,若输出为负数或零,则将a排在前面,否则排在后面
(4)push()方法 在末尾添加一个或多个新的元素,并返回新的长度
(5)splice()方法 添加/删除元素,并返回删除的项目
3.位运算法~~,两个否运算用来取整,效率最高,相当于是下舍入
评论