第5章:概率分析与随机算法

本文介绍了概率分析在算法中的应用,重点讲述了概率分析与随机算法的区别。概率分析关注输入分布下的平均运行时间,而随机算法则依赖内部随机数生成器产生的输入分布。文中提到了指示器随机变量的概念,并举例说明其应用。此外,还提供了随机数组排列、周期循环的随机数组排列及数组子集随机排列三种随机算法的C++代码实现。
摘要由CSDN通过智能技术生成

知识点总结

  1. 概率分析是在问题分析中应用概率的理念,必须要假设输入的分布,然后计算出一个平均情形下的运行时间,其中对所有可能的输入分布取平均值,得到的这种运行时间称为平均情况运行时间

  2. 如果一个算法的行为不仅由输入决定,而且也由随机数生成器产生的数值决定,我们称这个算法是随机的。当分析一个随机算法的运行时间时,我们以运行时间的期望值来衡量,其中输入值由随机数生成器产生,我们称为期望运行时间

  3. 当我们在概率分析时,是假设输入具有某种分布。但是在分析随机算法时,我们能通过该算法内部的随机数生成器产生我们想要的输入分布。也就是说在概率分析时,具有某种输入的分布是虚拟的,是人为假设的;但是对于随机算法来说,具有某种输入的分布是真真实实的,可以人为得到的。因此为了便于区分,我们将概率分析时得到的平均时间称之为平均情况运行时间,但是对于随机算法来说,我们将得到的平均时间称之为期望运行时间,有点细微差别。

  4. 指示器随机变量: 给定一个样本空间S和一个事件A,那么事件A对应的指示器随机变量 I{A} 定义为:I{A}=1(如果A发生);I{A}=0 (如果A不发生)。因此I{A}的期望值E[I{A}]=1*Pr{A发生}+0 *Pr{A不发生}=Pr{A发生}。具体应用例子可以看5.2-45.2-5

算法或例子代码

我列举了随机数组排列周期循环的随机数组排列数组中一个子集的随机排列这三种算法代码。

  • 随机数组排列:

~~~c++
#include
#include
using namespace std;

template<class Type>
void randomPermuteArray(vector<Type>& array)
{
    if(array.size()==0){
            cout<<"The array is empty?!"<<endl;
            return;
    }

    for(int i=0;i!=array.size();++i)
    {
             // random number in the range between i and the end of the array
            int randomPosition=rand()%(array.size()-i)+i;
            swap(array[i],array[randomPosition]);
    }
}   

~~~

该算法可以理解为在箱子里面有n个不同的小球,现在从箱子里面不放回的拿小球,一共有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值