算法竞赛时间复杂度分析

ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客:面向阿尼亚学习
算法学习笔记系列持续更新中~

阿



一、前言

相信很多人在写完题提交会出现TLE的情况,很让人苦恼,这是因为我们在做题时没有提前计算好时间复杂度导致的超时,所以什么是时间复杂度?我们又该如何根据数据范围选择合适的时间复杂度呢?

在算法竞赛以及有关计算机科学的诸多学科中,时间复杂度和空间复杂度是评判一个算法/程序的重要标准。一般使用O()来表示。
同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。所以算法分析的目的在于选择合适算法和改进算法。


二、时间复杂度的定义

时间复杂度,简单来说,就是一段程序执行的时间长短。但是在实际应用中,我们很难准确的计算出准确的执行时间,因为影响具体程序执行时间的因素太多:硬件(CPU,内存,寄存器),软件(编译器,垃圾回收机制),系统(网络,操作系统)。准确计算算法运行的时间也没有必要,我们只需要知道,相对的,哪个算法花费时间少,哪个算法花费时间多就够了。

三、不同数据范围算法的选择

首先,我们要知道,在竞赛中,一般认为计算机1 秒能执行`5 × 1 0 8 次计算,如果题目给出的时间限制为1秒,那么选择的算法执行的计算次数最多应该在108 量级(尽量不要超过1e9)才有可能解决这个题目。

那么对于不同的数据范围,我们就要选择合适的算法来分析,如下:
img
图片来自y总的网站点这里

四、语法小技巧【代码加速器】

cin和cout属于C++的概念,调用时涉及输入输出流,而scanf和printf属于C的概念,是C语言的标准输入/输出库中的函数,所以在时效上,scanf和printf优于cin、cout,对于大数据的输入输出,通常情况下应该用``scanf、printf。

对于普通数据的输入输出,cin和cout比较方便,而在格式化方面,scanf和printf比较容易。cin效率比scanf低很多,尤其输入数据达到20万以上时非常明显,在100万时cin读入就会超时。
所以对于c++选手我们可以在主函数中加入如下代码来加速我们的输入输出

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

五、比较常见的数

20~210:0 1 2 4 8 16 32 64 128 256 522 1024
220 约106 (1048576)
216 ==65536
215 ==32768
263 ==10^8

当然,这些仅供参考,在一般情况下基本可以得出结果。这样我们在设计算法的时候就可以考虑能不能通过了,不用做无用功甚至交一发TLE。

最后

莫言真理无穷尽,寸进自有寸进欢

请添加图片描述

猜你喜欢

转载自blog.csdn.net/m0_63233163/article/details/124760564
今日推荐