首页 > 编程语言 >SWUST 算法分析与设计 实验报告1

SWUST 算法分析与设计 实验报告1

时间:2023-09-11 18:45:06浏览次数:59  
标签:实验报告 clock int flag 算法 蛮力 ans SWUST

Locker doors实验报告 

一、      实验内容及目的

实验内容

有一组数从1~n。从1开始,访问第i个数和它的倍数。以此类推。当i = n 结束时,求有多少个数的访问次数为奇数。

实验目的:

验证不同的算法,在不同的数据规模的情况下,运行时间的变化情况,绘制成曲线图,比较算法的优劣性。体会蛮力算法和非蛮力算法的区别,以及蛮力算法的优缺点。

分析的指标:

在较大数据规模的情况下的蛮力算法和非蛮力算法代码运行时间以及代码占用的空间。

二、实验方案

1实验硬件平台


实验环境:Windows10 + Dev-C++ + 硬盘大小100GB + 8核处理器 + 16GB内存

非蛮力算法伪代码:

非蛮力算法的思路就是找出其中包含的规律。

      1 = 1 * 1

      2 = 1 * 2

      3 = 1 * 3

4 = 1 * 4 或 2 * 2

5 = 1 * 5

6 = 1 * 6 或 2 * 3

7 = 1 * 7

8 = 1 * 8 或 2 * 4

9 = 1 * 9 或 3 * 3

……

我们发现,只有能够被开方的数他们被访问到的次数为奇数次。通过这个规律,可以判断在1~n的范围内有多少可以被开方的数,进而就能得出结果。

非蛮力算法伪代码:

        Fun1(int n)

       //功能:求在范围内访问次数为奇数的数的个数。 

       //输入:一个正整数n

     //输出:1~n中访问次数为奇数的数的个数。

                ans ← 0

                for i ← 1 to n do

                   if i^2 > n break

                   else ans++

                return ans

测试数据规模:一个整数,范围1~1x10^8

 蛮力算法:

      蛮力算法的思路就是根据题目进行模拟,申请布尔类型的数组,用正负表示柜子的开关。最后遍历计算布尔数组中有多少为正的数组单元的就是问题的答案。

蛮力算法伪代码:

Fun2(int n)

       //功能:求在范围内访问次数为奇数的数的个数。 

       //输入:一个正整数n

     //输出:1~n中访问次数为奇数的数的个数。

                ans ← 0

                for i ←1 to n do

                        for j ←1 to n do

                          if i * j > n

                                break

                          else

                                flag[i*j] = !flag[i*j]      //对flag数组取反表示或开或关

                for i ←1 to n do

                        if flag[i]

ans++;

return ans

测试数据规模:一个整数,范围1~1x10^8

运行时间采集方式:

2计时方法


使用系统自带函数clock(),这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元数。在程序开始时先记录一个时钟数,在程序结束时再记录一个时钟数。将两个时钟数相减并除以一秒钟内CPU运行的时钟周期数(宏定义为CLOCKS_PER_SEC)就能得到程序运行时间。

 

三、结果及分析

蛮力算法:

ans ← 0

                for i ←1 to n do ……………………………………………………  n

                        for j ←1 to n do   …………………………………………………  n/i

                          if i * j > n

                                break

                          else

                                flag[i*j] = !flag[i*j]     

                for i ←1 to n do    ……………………………………………………  n

                        if flag[i]

ans++;

return ans

T(n) = n * n/i + n = (n^2)/i + n

其时间复杂度为O(n^2)

此算法占用的空间为一个flag数组,随着数据的增加,其空间容量也增加。

 

非蛮力算法:

        Fun1(int n)

       //功能:求在范围内访问次数为奇数的数的个数。 

       //输入:一个正整数n

     //输出:1~n中访问次数为奇数的数的个数。

                ans ← 0

                for i ← 1 to n do

                   if i^2 > n break   ……………………………………………………  √n

                   else ans++

                return ans

此算法的时间复杂度为O(√n)

空间占用少

表 1


 

结论:我们可以发现,非蛮力算法的时间几乎不变,而蛮力算法在数据规模小的时候时间与非蛮力算法差不多,但是在数据规模变大以后蛮力算法的运行时间就会变得很大。总之,非蛮力算法要优于蛮力算法。

 

四、总结

由于开始输入规模较小,导致在n<1000的范围内两个算法所用时间相差不大。曾一度以为是记录时间的程序出了问题,输出一直是0ms。后来发现是输入规模还不够大,在调大规模后有了明显结果。

由于int数据类型的限制,在int能表示的范围里未能看见非蛮力算法有明显的改变。但是在理论推导中,是认为这个算法的时间是应该有变化的。

本人写这篇报告时,发现了一个更好的非蛮力的算法:

        非蛮力算法伪代码:

        Fun3(int n)

       //功能:求在范围内访问次数为奇数的数的个数。 

       //输入:一个正整数n

     //输出:1~n中访问次数为奇数的数的个数。

                n = sqrt(n);

                return n;

这个算法的时间复杂度为O(1)而且稳定,是最好的算法。

 

五、参考文献及附录

clayyjh. C语言 记录程序的执行时间[EB/OL] [2021-03-12].https://www.cnblogs.com/clayyjh/p/14526665.html

 小乔流水人家. C语言 查看运行程序所需要的时间和占用的内存[EB/OL] [2017-02-22].https://www.cnblogs.com/BeautyFuture/articles/6428551.html

 附录:

蛮力算法:

#include<bits/stdc++.h>

using namespace std;

bool flag[100000000+7] = {0};

int main() {

        int n ;

        int ans = 0;

        cin >> n ;

        clock_t start_time=clock();

        for(int i = 1 ; i <= n ; i ++) {

                for(int j = 1 ; i*j <= n ; j++) {

                        flag[i*j] = !flag[i*j];

                }

        }

        for(int i = 1 ; i <= n ; i++) {

                if(flag[i]) ans++;

        }

        cout << ans << endl;

        clock_t end_time=clock();

        cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC<<"s"<<endl;

}

 

非蛮力算法:

#include<bits/stdc++.h>

using namespace std;

int main() {

        int n;

        cin >> n ;

        clock_t start_time=clock();

        int ans = 0;

        for(int i = 1; i <= n ; i++) {

                if(i * i > n) break;

                ans++;

        }

        cout << ans << endl;

        clock_t end_time=clock();

        cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC<<"ms"<<endl;

}

标签:实验报告,clock,int,flag,算法,蛮力,ans,SWUST
From: https://www.cnblogs.com/LikeFish/p/17694223.html

相关文章

  • 《Hello 算法》个人笔记
    https://www.hello-algo.com/算法算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学会了许多算法,用以解决生活中的大小问题。查阅字典的原理与二分查找算法相一致。二分查找算法体现了分而治之的重要算法思想。整理扑克的过程与插入排序算法......
  • Matlab 遗传算法优化极限学习机(GA-ELM)回归预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • Matlab 灰狼优化算法优化极限学习机(GWO-ELM)回归预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • Lnton羚通视频分析算法开发平台关于AI智能识别操作行为流程规范识别算法分析展示
    Lnton羚通的算法算力云平台是一款优秀的解决方案,具有突出的特点。它提供高性能、高可靠性、高可扩展性和低成本的特性,使用户能够高效地执行复杂计算任务。此外,平台还提供丰富的算法库和工具,并支持用户上传和部署自定义算法,提升了平台的灵活性和个性化能力。AI工人操作行为流程规范......
  • 深入了解选择排序算法
    在计算机科学中,排序是一个基本而重要的问题。排序算法有许多种,其中之一是选择排序(SelectionSort)。本文将深入介绍选择排序的工作原理,讨论其时间复杂度,以及提供Python、Go、Java和C语言的示例代码。选择排序的基本思想选择排序是一种比较排序算法,其基本思想是将数组分为已排序和未......
  • 《落实算法安全主体责任基本情况》范文,修改主体即可提交2
    在数字化时代,算法已经成为了商业竞争和创新的关键要素。然而,算法的广泛应用也引发了对其安全性和合规性的关切。《落实算法安全主体责任基本情况》作为算法备案过程中的一环,具有极高的专业性,需要企业全面考虑算法的隐私保护、数据合规、风险预防等一系列关键问题。正因如此,许多......
  • 【目标检测】RCNN算法实现
    一、前言RCNN(RegionswithCNNfeatures)算法由RossGirshick在2014年的论文“Richfeaturehierarchiesforaccurateobjectdetectionandsemanticsegmentation”提出,是深度学习目标检测的开山之作。RCNN将CNN应用到目标检测问题上,它使用选择性搜索从图像中提取候选区域,利用......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • 例2.6 设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂
    1.题目例2.6设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂度为0(1)。2.算法思想3.代码voidDeleteX(SeqListLA,SeqList*LC,intx){inti=0,j=0;while(i<=LA.last){if(LA.element[i]==x)i++;else......
  • 机器学习算法原理实现——神经网络反向传播,链式求导核心
    记得先看之前的梯度下降文章!   链式求导的核心来了,就高中数学知识: 代码实现:importnumpyasnpimportmatplotlib.pyplotasplt#Sigmoid激活函数及其导数defsigmoid(z):return1/(1+np.exp(-z))defsigmoid_derivative(z):returnsigmoid(......