hw3_解题报告

水一篇算法分析与设计的实验报告

就是说咱也不知道为什么算法课那么水,可能这就是RUC吧

无放回采样

题意简述

实现无放回采样算法,输入为一个数组和正整数k,算法对数组进行操作,前k位为采样结果。

算法基本思路

使用c++中的vector容器,定义可迭代的数组,从而便于输入未知长度的数组;

在生成随机数的时候,使用c++中自带的rand()函数,对该函数取模,模的数字为当前数组的长度,从而实现生成一个范围在数组长度内的整数。

在采样过程中,通过生成的随机数对数组进行索引,并删除对应的数据,将被删除的数组元素加入采样结果中。然后根据输入的k的大小进行下一次迭代

算法正确性证明

算法复杂度

时间复杂度为​$O(n)$,,空间复杂度为​$O(n)$,

代码设计以及基本框架

int main()
{
    vector<int> A;
    long long int number = 0;
    vector<int>numbers;
    cout<<"请输入数组";
    while(1)
    {
        cin>>number;
        A.push_back(number);//每输入一个数字就放在数组最后
        if(cin.get()=='\n')break;  
    }
    long long int len = A.size();//数组长度len
    cout<<"您输入的数组是:";
    for(int i=0;i<len;i++)
    {
        cout<<A[i]<<' ';
    }
    cout<<"请输入要采样的个数:";
    long long int k = 0,i=0;
    cin >>k;
    long long int random = 0;
​
    for(i=0;i<k;i++)
    {
        std::srand(std::time(0));
        random = std::rand()%A.size();
        std::cout<<"删除当前数组中第"<<random<<"个数字";
        numbers.push_back(A[random-1]);
        A.erase(A.begin()+random-1);
        cout<<"现在的数组是:";
        for(int i=0;i<A.size();i++)
        {
            cout<<A[i]<<' ';
        }
        cout<<endl;
        
    }
    cout<<"您采样出的数组为:";
    for(int j = 0;j<numbers.size();j++)
    {
        cout<<numbers[j]<<" ";
    }
    return 0;
​
}

运行结果示例

 

蒙特卡洛模拟圆周率

题意简述

实现pi的Monte Carlo算法,假设我们要求误差小于0.0001。在不使用pi真实值的前提下,如何设计算法的停止条件。

算法基本思路

使用蒙特卡洛对圆周率进行模拟,我们随机地生成点,通过计算落在半径为1的圆内的数量与落在2*2的正方形中的总数量的比值。

由于题目要求不能使用真实值,我们模拟计算pi的结果。

利用​arctan(x) = 1-\frac{x}{3}+\frac{x^2}{5}+...

可以得到\frac{\pi}{4}=arctan(1) = 1-\frac{1}{3}+\frac{1}{5}+...:​,

于是我们通过模拟值对圆周率进行估计,利用估计值蒙特卡洛估计值,|估计值-蒙特卡洛估计值|<1e-4 作为停止条件

算法正确性证明

只要我们设置足够的迭代次数使得pi的估计值尽可能准确,该算法得到的结果与真实值相差必然小于0.0001

代码设计以及基本框架

int main()
{
    std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
    double pi;
    unsigned long long int num;
    num = 1000000;
    for(unsigned long long int i = 0;i<num;i++)
    {
        pi += pow(-1,i)*1/(2*i+1);
    }
    pi = 4.0*pi;
    // cout<<pi;
    double guji=0;
    double x = 0;
    double y = 0;
    long  numCount = 0;
    long  sum = 0;
    srand((unsigned)time(NULL));
    // cout<<1e-4<<endl;
    while(abs(guji-pi)>1e-6)
    {
        sum++;
        x = rand()/(double)(RAND_MAX);
        y = rand()/(double)(RAND_MAX);
        if((x*x)+(y*y)<1)
            numCount++;
        guji = 4.0*numCount/sum;
    }
    cout<<"迭代次数"<<sum<<endl;
    // cout<<guji;
    cout<<guji;
    return 0;
}

运行结果示例

思路2

尽可能增大迭代次数,通过数学计算可以得知当迭代次数达到一定值的时候结果与真实值的差距小于0.0001的概率接近于1。

### 回答1: hw4_data.txt是一个文本文件,其中包含了某个关于hw4的数据信息。根据文件名来看,很可能是某个作业或者实验的第四部分所使用的数据。 由于题目给出的信息比较有限,我无法确定文件具体内容和格式,但可以推测它可能是一种结构化数据或者某种文本格式的数据。 如果是结构化数据,那么hw4_data.txt可能是一个表格或者矩阵的形式。它可能包含有行和列的标签,每一行代表一个观测值或样本,每一列代表不同的特征或变量。通过分析这些数据,我们可以进行统计分析、数据挖掘或者机器学习等操作。 如果是文本格式的数据,那么hw4_data.txt可能包含一系列的文本信息,每行代表一个文本段落或者句子。我们可以通过文本处理技术来分析这些文本数据,例如进行文本分类、文本情感分析或者文本生成等任务。 无论hw4_data.txt的具体内容和格式如何,我们可以使用相应的编程工具(如Python中的pandas库)来读取和处理这个文件。通过分析文件中的数据,我们可以获取到有关hw4作业的相关信息,进而进行后续的工作。 总而言之,对于题目中提到的hw4_data.txt文件,我无法给出具体的数据内容和格式,但可以根据文件名推测它可能是某种数据文件,我们可以用相应的工具来解析和处理。 ### 回答2: hw4_data.txt是一个数据文件。根据文件名可以推测,这是一个与第四次作业相关的数据文件。根据常规命名规则,它可能是一个用于存储或处理数据的文本文件。 该文件可能包含各种类型的数据,如数值、文本、日期等。根据实际情况,它可能是一个用逗号、制表符或其他分隔符分隔的数据集,以便于读取和处理。 要进一步了解hw4_data.txt文件的内容,我们可以尝试打开文件并查看其内容。在文件中,可能会包含一些数据列,每一列代表一个属性或特征,每一行代表一个数据点或实例。 我们可以使用各种方法来读取和处理hw4_data.txt文件中的数据。例如,可以使用Python中的pandas库来读取和解析数据。读取后,我们可以进行数据清洗、转换、分析和可视化等操作。 最后,根据具体的作业要求和数据文件的内容,我们可以设计相应的数据处理和分析方法,以提取有用的信息、回答问题或完成任务。 ### 回答3: hw4_data.txt是一个文本文件,文件名指明了它是第四次作业的数据文件。根据文件名的命名规则,可以推测这个文件是用来存储作业四的数据的。 文本文件是一种常见的文件格式,它以文本形式存储数据,可以被文本编辑器或其他文本处理软件(如记事本)读取和修改。根据.txt的文件扩展名,我们可以推断出这个文件是以纯文本形式存储数据的。 hw4_data.txt的具体内容可能包括实验数据、用户调查结果、统计数据等,具体取决于作业要求和任务内容。根据作业的性质,这个文件可能包含按行或按列排列的数据。每行可能代表一个样本、一次试验或一个观测值;每列可能代表不同的变量、测量指标或属性。 要分析hw4_data.txt中的数据,我们可以使用各种计算分析工具和编程语言(如Python)来读取、处理和分析文本文件中的数据。可以根据具体的需求编写程序来读取文件,提取数据,计算统计指标,绘制图表等。 总之,hw4_data.txt是一个存储作业四数据的文件,我们可以通过适当的工具和编程语言来读取和分析其中的数据,以满足作业的要求和任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值