Introduction to Algorithm(chapter 5)

这一章主要介绍了概率分析和随机算法,概率分析就是假设对于不确定的输入的条件下通过概率分析来得到时间复杂度的一个平均情况。

     对于某些平均情况较好的算法,而对于某些特定输入条件下时间复杂度较高的情况,可以对输入进行随机化来达到平均情况,即对部分地随机化来达到一个较好的情况。例如对于数组A[1.....n]的输入,要让数组中元素随机排列文中提高两个方法,1.给A[i]随机赋予一个优先级R[i],1<R[i]<=n3,然后根据优先级顺序来排列数组中各元素,这其中包括一个排序的过程时间为o(nlogn) 2.是遍历数组对于A[i],随机地交换A[i]<->A[i...n]来完成随机化。

    然后文中介绍了几种常见的情形:生日悖论,投球等等。

    整体来说就是通过对输入或其他某些部分进行随机化来达到一个平均的情况。

    do...while的形式可以应用到很多情况下,例如产生两个不同的数,往往应用于那么需要有些不同的情况,例如产生一个集合中尚未包含的数。

    指示器随机变量的作用在于将一个集合问题平摊到每个个体上,例如对于帽子保管问题,顾客将他的帽子给服务生保管,然后服务生随机地将帽子还给顾客,那么顾客得到他原来自己的帽子的人数期望是多少?我们假设最后得到自己帽子的顾客总人数为X的话,那么E(X)就是解,对于这个总人数就相当于一个集合或者整体问题,那么我们利用指示器随机变量来分解这个问题的话就相当于设Xi =1:顾客i得到自己的帽子,即单独对每个顾客来讨论,这就将一个整体问题分解(平摊)到每个个体上,对个体来讨论的话问题往往就容易多了。

    C++中的rand()是一个产生随机变量的函数,但其实只是伪随机函数,因为当seed()设置的值一样时,产生的随机数也是一样的,所以常常可以讲当前时间设置成种子值srand(time(NULL))来模拟随机函数。注意rand()返回的是一个[0,RAND_MAX]间的随机数,RAND_MAX在机器上是32767,故rand()%number中如果希望返回的值在0~number-1之间的话那么number是不能大于35527的否则如果利用它来求0-1之间的小数的话例如(rand()%num)/num如果num>32767那么求的小数就偏小因为rand()得到的数达不到num-1,举例来说,num=1000000,那么rand()返回k=0-32766, k%1000000 仍然等于k, 然后k/1000000那么就远小于1了,所以这里使用rand()时要注意number的值不能大于RAND_MAX(32767)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值