蓝桥杯基础--时间复杂度
目录一、 什么是时间复杂度大O表示法的两大核心原则二、 常见的时间复杂度全解析1. O(1) - 常数复杂度2. O(log N) - 对数复杂度3. O(N) - 线性复杂度4. O(N log N) - 线性对数复杂度5. O(N^2) - 平方复杂度6. O(2^N) 和 O(N!) - 指数与阶乘复杂度三、 蓝桥杯赛场上的“一秒法则”四、 实战绝技看数据范围猜算法五、 蓝桥杯特色“骗分”与部分分策略六、 总结在蓝桥杯、ACM、牛客等各类算法竞赛中很多初学者都会经历这样一种痛辛辛苦苦敲出几百行代码样例测试完美通过满怀信心地点击“提交”结果却迎来了刺眼的TLE (Time Limit Exceeded超出时间限制)。在蓝桥杯的赛制中一道大题通常有多个测试点TLE 往往意味着你只能拿到极少的部分分数甚至颗粒无收。为什么代码逻辑明明是对的却拿不到满分这就引出了算法竞赛中最核心、也是最基础的概念之一时间复杂度。本文将从零开始带你彻底搞懂时间复杂度并掌握在蓝桥杯赛场上“看数据范围猜算法”的独门绝技。一、 什么是时间复杂度很多同学以为评估一个程序跑得快不快直接用秒表测一下运行时间就可以了。但实际上同一个程序在顶级服务器上和在老旧的笔记本电脑上运行时间是天差地别的甚至使用不同的编程语言C、Java、Python执行效率也有巨大差异。因此我们需要一个独立于硬件和语言的客观标准来衡量算法的效率。这就是时间复杂度。时间复杂度并不是计算程序具体运行了多少秒而是评估随着输入数据规模$N$的增大算法执行基本操作次数的增长趋势。在计算机科学中我们通常使用大O符号 (Big O notation)来表示时间复杂度例如 $O(1)$、$O(N)$、$O(N^2)$ 等。大O表示法的两大核心原则忽略常数项如果一个算法执行了 3N 次操作我们不写成 O(3N)而是直接写成 O(N)。因为当 N 趋于无穷大时常数 3 的影响微乎其微。同理O(N/2) 也是 O(N)。只保留最高阶项如果一个算法的操作次数是 N^2 5N 1000我们只保留最高阶的 N^2即 O(N^2)。因为随着 N 的急剧膨胀低阶项 5N 和常数项 1000 都可以忽略不计。二、 常见的时间复杂度全解析在蓝桥杯的题目中我们最常遇到的时间复杂度有以下几种按照运行效率从高到低即增长速度从慢到快排列1. O(1) - 常数复杂度无论数据规模 N 有多大算法只需执行固定的次数即可完成。示例判断一个数是否为偶数、利用数学公式直接计算等差数列求和。int sum (1 n) * n / 2; // O(1)2. O(log N) - 对数复杂度极其高效通常出现在每次操作都能将数据规模减半的算法中。示例二分查找Binary Search、快速幂、求最大公约数辗转相除法。 当 N 10^9十亿时log_2(10^9) 仅仅只有大约 30 次操作int l 0, r n; while(l r) { int mid l (r - l) / 2; if(check(mid)) ans mid, l mid 1; else r mid - 1; }3. O(N) - 线性复杂度算法的执行时间与数据规模成正比。通常表现为一层 for 循环。示例遍历数组、求数组最大值、双指针算法、KMP 字符串匹配。for(int i 0; i n; i) { // 基础操作 }4. O(N log N) - 线性对数复杂度这是算法竞赛中最常见的复杂度之一。通常是结合了分治思想。示例快速排序Quick Sort、归并排序、堆排序、线段树/树状数组的单次构建。 C STL 中的sort()函数其时间复杂度就是严格的 O(N log N)。5. O(N^2) - 平方复杂度通常表现为嵌套的两层 for 循环。当数据规模稍微变大时运行时间就会急剧上升。示例冒泡排序、插入排序、简单的二维矩阵遍历、基础的动态规划。for(int i 0; i n; i) { for(int j 0; j n; j) { // 基础操作 } }6. O(2^N) 和 O(N!) - 指数与阶乘复杂度这两种被称为“爆炸型”复杂度。除非数据规模极小否则绝对会 TLE。示例没有优化的递归、穷举所有的子集2^N、全排列枚举N!。三、 蓝桥杯赛场上的“一秒法则”在蓝桥杯中绝大多数题目的时间限制是1.0 秒。 那么1秒钟内计算机到底能执行多少次操作呢记住这个黄金准则针对 C/C 而言现代计算机1秒钟大约能执行10^7到10^8次基本运算。如果你的算法需要执行10^7次操作毫无压力瞬间跑完。如果是 10^8 次比较悬但如果常数较小代码写得很精简一般也能卡着时间过。如果是 10^9 次或更多必定 TLE。四、 实战绝技看数据范围猜算法既然我们知道了“1秒钟跑 10^8 次”这个底线那么在蓝桥杯比赛时我们完全可以根据题目给定的数据范围N来反推这道题应该用什么复杂度的算法这是拿奖牌最核心的技巧之一。我们来看一张“祖传”的神奇对照表数据规模 $N$最大允许的复杂度对应的常见算法类型$N \le 20$$O(2^N)$ 或 $O(N!)$深度优先搜索(DFS)、状态压缩DP、全排列$N \le 100$$O(N^3)$Floyd多源最短路、区间DP、矩阵乘法$N \le 10^3$$O(N^2)$两重循环、朴素版Dijkstra、简单的DP递推$N \le 10^5$$O(N \log N)$排序、二分查找、线段树、贪心加优先队列$N \le 10^6$$O(N)$双指针、单调栈/单调队列、KMP、前缀和$N \ge 10^9$$O(\log N)$ 或 $O(1)$数学定理如数论、快速幂、或者寻找规律【实战模拟】假设题目描述了一个复杂的问题你在考场上一筹莫展但你扫了一眼题目的输入格式“对于100%的数据满足1 N 10 ^5。”此时你的大脑应该迅速产生条件反射N 10^5如果写 O(N^2的两层循环操作次数是(10^5)² 10^10远超10^8必定 TLE。因此正确算法的复杂度一定是 O(N)或者 O(N log N)。接着去思考这题能不能先排个序O(N log N)能不能用双指针扫一遍O(N)是不是二分答案O(N log N)) ?这一步能够帮你过滤掉90%的错误思考方向直奔正解。五、 蓝桥杯特色“骗分”与部分分策略蓝桥杯的赛制属于类似 OI信息学奥赛的赛制按测试点给分。一道 20 分的编程大题通常包含 10 个测试点。如果一道题的数据范围是N ≤ 10^5 需要O(N Iog N算法)但你实在想不出最优解该怎么办千万不要交白卷仔细看题目的数据范围说明通常会有梯度对于 30%的数据 N 1000, 对于 100%的数据N 1^5这意味着什么意味着你只要写一个最简单的、甚至看起来很蠢的 O(N^2) 暴力双重循环提交上去这 30% 的数据你就能在 1 秒内跑完稳稳拿到 6 分在蓝桥杯中省赛拿奖往往就是靠这道题骗 6 分那道题骗 10 分拼凑出来的。竞赛格言暴力出奇迹打表过样例。想不出正解直接上暴力 O(N^2) 或 DFS 搜索拿到 30% ~ 50% 的基础分。把节省下来的时间去死磕那些你真正有把握拿满分的题目。六、 总结时间复杂度不仅仅是一个学术概念它是算法竞赛生手中的“指南针”和“量油尺”。牢记 10^8次操作/秒这个分水岭。养成做题前先看数据范围的习惯做到看N定算法。比赛时分清主次实在无法优化复杂度时果断写暴力拿部分分。修炼好时间复杂度这门内功你不仅能告别满屏的 TLE 报错更能站在出题人的角度审视题目。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2447539.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!