算法复杂度-CSP-普及组
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。
也就是说,为解决一个具体的问题,执行一系列程序指令,能够对一定规范的输入,在有限时间内获得所要求的输出。
例如如下问题:
题目描述
求前N项和
1+2+3+ …… +N 的值。
输入格式
输入
N
输出格式
输出
和
输入样例
5
输出样例
15
参考程序
需要如下程序指令完成
#include<bits/stdc++.h>
using namespace std;
int N,sum;
int main(){
cin>>N;
for(int i=1;i<=N;i++){
sum+=i;
}
cout<<sum;
return 0;
}
上述程序执行,涉及到输入,循环,输出等基本程序指令,主要时间耗费在for循环,且执行时间是随循环中N变化而变化的函数,分析算法执行时间通常使用算法的时间复杂度来衡量
算法的时间复杂度
算法的时间复杂度是一个函数,它定性描述该算法的运行时间,常用大O符号表述,它可以被认为是渐进,不考虑常数
对于足够大的输入规模,我们往往不需要花费很大力气计算太精确的结果,通常指关系增长级量,即算法的渐进效率
比如:
int sum = 0;
for(int i = 1; i<=n; i ++ ){
sum = sum + i;
}
我们关心for循环的时间复杂度,而 int sum=0 忽略
因此时间复杂度为O(n),而不是O(n+1)
举例说明
1.O(1)
O(1)的时间复杂度可以这样理解:代码按顺序一行一行执行,没有任何的循环
比如:
int a = 1;
int b = 2;
cout << a + b <<endl;
无论有多少个这样的代码块,只要不出现循环,就可以被认为是O(1),没有O(2),O(3)
1个和几个都是O(1),不考虑常数
2.O(n)
O(n)的时间复杂度是与数据规模成线性的,比如:
int sum = 0;
for(int i = 1; i<=n; i ++ ){
sum = sum + i;
}
循环体内循环了n次,这样的时间复杂度就是O(n)的,如果有多个这样的循环,只要不是循环嵌套,我们也认为是O(n)的,因为时间复杂的不考虑常数
3.O(n^2)
O(n^2)的时间复杂度很容易理解,就是循环里嵌套了一层循环,比如:
int count = 0;
for(int i = 1; i<=n; i ++ ){
for(int j = 1; j <= n; j++){
count ++;
}
}
4.O(logn)
O(logn)的时间复杂度我们常常认为在数据规模为n下,代码执行的次数x满足c^x=n(c是一个较小的常数),比如:
int count = 0;
for(int i = 1; i <= n; i = i * 2){
count ++;
}
for循环中i每次*2,执行次数为$ log_2n $
常见的O(logn)的算法还有二分查找
5.O(nlogn)
O(nlogn)的时间复杂度就是在一个循环中嵌套了一个O(logn)的算法,比如:
int count = 0;
for(int i = 1; i<=n; i ++ ){
for(int j = 1; j <= i; j = j * 2){
count ++;
}
}
6.O(2^n)
O(2^n)的时间复杂度常见于搜索,递归中,比如在用递归求斐波那契数的时候:
int fib(int n){
if (n <= 1) return n;
else return fib(n - 2) + fib(n - 1);
}
O(2^n)的时间复杂度是一个很不理想的时间复杂度,因此我们常常会使用一些技巧去尽可能地优化。
复赛中评估时间复杂度
在一般在算法竞赛或者笔试题的时间限制是1秒,基本程序指令规模一般在10^8以内
对应相应时间复杂度可以接受的数据规模如下
O(n)算法能解决的数据范围在 n≤10^8
O(nlogn) 算法能解决的数据范围在 n≤10^6
O(n^2) 算法能解决的数据范围在 n≤5000
O(n^3) 算法能解决的数据范围在 n≤300
O(logn) 算法能解决的数据范围在 n<10^18
O(2^n) 算法能解决的数据范围在 n≤25
算法复杂度-CSP-普及组-练习
https://www.cnblogs.com/myeln/articles/17514587.html
算法复杂度-CSP-普及组-练习-答案解析
https://www.cnblogs.com/myeln/articles/17517309.html
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号