发表于: 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.位运算法~~,两个否运算用来取整,效率最高,相当于是下舍入




返回列表 返回列表
评论

    分享到